OpenCV 작업을 처리하기 위해 만든 별도의 스레드 안에는 cvFindContours
함수를 호출합니다. 다른 스레드는 OpenGL과 관련된 내용을 유지합니다.cvFindContours는 항상 0을 반환합니다. - OpenCV
이 코드가 별도의 스레드 내에서 실행될 때 cvFindContours
함수가 항상 0을 반환합니다. 그것은 주 스레드 자체에서 실행될 때 이전에 문제없이 작동했습니다. 나는 값 변경을 평가하기 위해 중단 점과 시계를 사용했다. 다른 모든 변수 (변수)는 contourCount
(값 : 0)을 제외한 값을 가져옵니다.
단서가 있습니까?
// header includes goes here
CvCapture* capture = NULL;
IplImage* frame = NULL;
IplImage* image;
IplImage* gray;
IplImage* grayContour;
CvMemStorage *storage;
CvSeq *firstcontour=NULL;
CvSeq *polycontour=NULL;
int contourCount = 0;
DWORD WINAPI startOCV(LPVOID vpParam){
capture = cvCaptureFromCAM(0); // NOTE 1
capture = cvCaptureFromCAM(0);
frame = cvQueryFrame(capture);
image = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U,3);
gray = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U,1);
grayContour = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U,1);
storage = cvCreateMemStorage (0);
firstcontour=NULL;
while(1){
frame = cvQueryFrame(capture);
cvCopy(frame,image);
cvCvtColor(image,gray,CV_BGR2GRAY);
cvSmooth(gray,gray,CV_GAUSSIAN,3);
cvThreshold (gray, gray, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
cvNot(gray,gray);
cvCopy(gray,grayContour);
contourCount=cvFindContours (grayContour, storage, &firstcontour, sizeof (CvContour),
CV_RETR_CCOMP);
polycontour=cvApproxPoly(firstcontour,sizeof(CvContour),storagepoly,CV_POLY_APPROX_DP,3,1); // Error starts here (Pls refer to stack trace)
}
// goes on...
}
int main(int argc, char** argv){
DWORD qThreadID;
HANDLE ocvThread = CreateThread(0,0,startOCV, NULL,0, &qThreadID);
initGL(argc, argv); //some GL intitialization functions
glutMainLoop(); // draw some 3D objects
CloseHandle(ocvThread);
return 0;
}
주 1 : 에서 OpenCV 2.3.0 비주얼 C++ 2008
편집
추적 :이 라인으로 인해 How to avoid "Video Source -> Capture source" selection in OpenCV 2.3.0 - Visual C++ 2008
환경에 나와있는 오류에 복제해야했다
opencv_core230d.dll! 이력서 :: 오류 (const를 이력서 :: 예외 & EXC = {...}) 라인 (431) C++
opencv_imgproc230d.dll! cvPointSeqFromMat (INT seq_kind = 20480, CONST 공극의 도착 * = 0x00000000의, CvContour * contour_header = 0x01a6f514, CvSeqBlock의 블록 * = 0x01a6f4f4) 라인 47 + 0xbd 바이트 C++
opencv_imgproc230d.dll! cvApproxPoly (CONST 무효 * 배열 = 0x00000000의, header_size 88 = int로 CvMemStorage * 저장 = 0x017e7b40, INT 방법 = 0, 두 파라미터 = 3.0000000000000000, INT 매개 = 1) 라인 (703) +하는 0x28 바이트 C++
Project.exe ! startOCV (무효 * vpParam = 0x00000000의) 라인 267 + 값 0x24 바이트 C++
이 모든 물건 cvPointSeqFromMat
의 기능 CV_Assert(arr != 0 && contour_header != 0 && block != 0)
아래로 비등하고 그것이 비어 필요 arr
때문에 실패합니다.
위에 추가 한 흔적을 살펴보십시오. – coder9
불행히도 댓글 블록이 당신을 배신했습니다. 소스 코드 "contours.cpp"를 읽어보십시오. 'return count;' – rwong