cvCreateFileCapture странная ошибка - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь создать простую программу Opencv на C, которая создает захват файла из .avi и воспроизводит его в окне, выделяющем лица. Я использую скомпилированную версию Opencv (я уже пробовал то же самое с изображением в формате JPEG, и это работает).

Сборка идет хорошо, без ошибок, без предупреждения, но когда я запускаю его, консоль выводит следующее:

Обнаружен неизвестный параметр: "роль сервера" Игнорирование неизвестного параметра «роль сервера»

И программа просто останавливается

Раньше он жаловался на отсутствующий файл /home/#user/.smb/smb.conf, поэтому я попытался установить samba (хотя я до сих пор не знаю, что во всем этом должна делать samba)

вот мой код:

Основной () {

    printf("Ciao!");

    cvNamedWindow("window", CV_WINDOW_AUTOSIZE);

    cvWaitKey(0);

    printf("ok");

    CvCapture* capture = cvCreateFileCapture("monsters.avi");


    CvHaarClassifierCascade* cascade = load_object_detector("haarcascade_frontalface_alt.xml");

    CvMemStorage* storage = cvCreateMemStorage(0);

    //List of the faces
    CvSeq* faces;

    while (0<10) {
        CvArr* image = cvQueryFrame(capture);


        double scale = 1;

        faces = cvHaarDetectObjects(image,cascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(1,1), cvSize(300,300));

        int i;

        for(i = 0; i < faces->total; i++ )
            {

                CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i );
                cvRectangle( image,
                            cvPoint(face_rect.x*scale,face_rect.y*scale),
                            cvPoint((face_rect.x+face_rect.width)*scale,(face_rect.y+face_rect.height)*scale),
                            CV_RGB(255,0,0) , 3, 8, 0);
            }

        cvReleaseMemStorage( &storage );

        cvShowImage("window", image);
    }

    cvWaitKey(0);

    printf("Ciao!");

}


Я благодарю вас за ваш ответ, я перешел на C ++ для моих испытаний. Теперь я сделал это:

int main(){
namedWindow("Video", CV_WINDOW_FREERATIO);

VideoCapture cap("sintel.mp4");
 if(!cap.isOpened())  // check if we succeeded
        return -1;

Mat edges;
for(;;){


    Mat frame;
    cap>>frame;
    cvtColor(frame, edges, CV_BGR2GRAY);
    GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
    Canny(edges, edges, 0, 30, 3);

    imshow("Video", edges);
    //cvWaitKey(0);

}


return(0);
}

Теперь он успешно загружает видео и запрашивает кадр, каждый раз, когда я нажимаю клавишу, он явно запрашивает другой кадр, и все работает нормально, но если я комментирую waitkey (), программа просто немного зависает и вылетает, если я пытаюсь чтобы закрыть окно, я начинаю думать, что есть проблема с кодеками или что-то в этом роде ...

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

Теперь все работает нормально, я изменил cvWaitKey () с этим

   if(waitKey(30) >= 0) break;

Я точно не понимаю, почему, но теперь все работает как надо :)

0 голосов
/ 02 марта 2012

В коде так много потенциальных проблем , большинство из которых связано с отсутствием защитного кодирования.

Что cvWaitKey(0); делает после cvNamedWindow()?Это ненужно, удалите его!

Что произойдет, если захват был неудачным?Защитный код:

CvCapture * capture = cvCreateFileCapture ("monsters.avi");if (! capture) {// Файл не найден, обработать ошибку и, возможно, выйти из приложения}

, и вы должны использовать эту технику для каждого указателя, полученного из OpenCV, хорошо?

Oneодной из основных проблем является то, что вы выделяете память для CvMemStorage перед циклом, но внутри цикла вы освобождаете его, что означает, что после первой итерации цикла больше не будет действительного CvMemStorage* storage, и это ОГРОМНАЯ проблема.

Либо переместите процедуру выделения в начало цикла, чтобы на каждой итерации память выделялась / освобождалась, либо перемещайте вызов cvReleaseMemStorage( &storage ); из цикла.

...