cvFindContours всегда возвращает 0 - OpenCV - PullRequest
2 голосов
/ 10 ноября 2011

Я вызываю функцию 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, который требуется, пуст.

1 Ответ

0 голосов
/ 10 ноября 2011

Ваша переменная 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, чтобы выяснить количество обнаруженных контуров.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...