странная ошибка cvCreateFileCapture

Я пытаюсь создать простую программу 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);
}

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


person Radisc    schedule 02.03.2012    source источник


Ответы (2)


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

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

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

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

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

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

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

person karlphillip    schedule 02.03.2012

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

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

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

person Radisc    schedule 13.03.2012