私は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
ので、それが失敗します。
私が上に追加したトレースを見てください – coder9
残念ながら、コメントブロックはあなたを裏切っています。ソースコード "contours.cpp"をお読みください。 'return count;' – rwong