2011-11-10 5 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 のVisual C++ 2008

EDIT

トレース:これらの行が原因How to avoid "Video Source -> Capture source" selection in OpenCV 2.3.0 - Visual C++ 2008

環境で言及したエラーに複製されなければなりませんでした

opencv_core230d.dll!CV ::エラー(constのCV ::例外& EXC = {...})ライン431 C++

opencv_imgproc230d.dll! cvPointSeqFromMat(int型seq_kind = 20480、CONST void *型ARR = 0x00000000に、CvContour * contour_header = 0x01a6f514、CvSeqBlock *ブロック= 0x01a6f4f4)ライン47 + 0xbdバイトC++

opencv_imgproc230d.dll! cvApproxPoly(CONSTボイド*配列= 0x00000000の、INTヘッダサイズ= 88、CvMemStorage *ストレージ= 0x017e7b40、INT方法= 0、二重パラメータ= 3.0000000000000000、INTパラメーター2 = 1)線703 +の0x28バイトC++

Project.exe !startOCV(void *型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

関連する問題