2011-11-10 8 views
2

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 때문에 실패합니다.

답변

0

귀하의 변수 contourCount은 자신이 생각하는대로 행동하지 않습니다. contours.cpp 소스 파일에서 :

/*F/////////////////////////////////////////////////////////////////////////////////////// 
// Name: cvFindContours 
// Purpose: 
//  Finds all the contours on the bi-level image. 
// Context: 
// Parameters: 
//  img - source image. 
//    Non-zero pixels are considered as 1-pixels 
//    and zero pixels as 0-pixels. 
//  step - full width of source image in bytes. 
//  size - width and height of the image in pixels 
//  storage - pointer to storage where will the output contours be placed. 
//  header_size - header size of resulting contours 
//  mode - mode of contour retrieval. 
//  method - method of approximation that is applied to contours 
//  first_contour - pointer to first contour pointer 
// Returns: 
//  CV_OK or error code 
// Notes: 
//F*/ 

당신은 성공적으로 실행 의미 CV_OK == 0을 얻고있다. cvFindContours은 발견 된 윤곽 수를 반환하지 않습니다. 실패했는지 여부 만 알려주면됩니다. 탐지 된 등고선 수를 파악하려면 CvSeq* first_contour을 사용해야합니다.

희망 하시겠습니까?

+0

위에 추가 한 흔적을 살펴보십시오. – coder9

+0

불행히도 댓글 블록이 당신을 배신했습니다. 소스 코드 "contours.cpp"를 읽어보십시오. 'return count;' – rwong

관련 문제