Я вызываю функцию cvFindContours
в отдельном потоке, который я создал для обработки всей работы OpenCV, в то время как другой сохраняется для OpenGL.
Я заметил, что моя функция 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
Окружающая среда:
OpenCV 2.3.0
Visual C ++ 2008
EDIT
Следы
opencv_core230d.dll! Cv :: error (const cv :: Exception & exc = {...}) Строка 431 C ++
opencv_imgproc230d.dll! cvPointSeqFromMat (int seq_kind = 20480, const void * arr = 0x00000000, CvContour * contour_header = 0x01a6f514, CvSeqBlock * line * 0f0 0304 0x4 0 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 НА 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) на Ф 0 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
opencv_imgproc230d.dll! cvApproxPoly (const void * array = 0x00000000, int header_size = 88, CvMemStorage * storage = 0x017e7b40, метод int = 0, двойной параметр = 3,0000000000000000, строка 702, параметр типа int 2 + 0x28 байт C ++
Project.exe! StartOCV (void * vpParam = 0x00000000) Строка 267 + 0x24 байта C ++
Все это сводится к функции CV_Assert( arr != 0 && contour_header != 0 && block != 0 )
в cvPointSeqFromMat
и происходит сбой, поскольку arr
, который требуется, пуст.