cvCreateFileCapture奇怪的错误

时间:2012-03-02 11:22:52

标签: c opencv video-capture samba

我试图在C中创建一个简单的Opencv程序,它从.avi创建一个文件捕获,并在一个突出显示面的窗口中播放它。我正在运行Opencv的自编译版本(我已经尝试过使用jpeg图像并且它可以工作)。

构建顺利,没有错误,没有警告,但是当我启动它时,控制台输出:

遇到未知参数:"服务器角色" 忽略未知参数"服务器角色"

程序只是停止

以前它抱怨缺少/home/#user/.smb/smb.conf文件,所以我尝试安装samba(尽管我仍然不知道samba在这一切中必须做什么)

这是我的代码:

的main(){

    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 :(得分:0)

代码中存在这么多潜在问题,其中大多数与防御性编码无关。

cvWaitKey(0);cvNamedWindow()做什么?这是不必要的,删除它!

如果捕获不成功会怎样?防守代码:

CvCapture * capture = cvCreateFileCapture(“monsters.avi”); if(!capture) {    //找不到文件,处理错误并可能退出应用程序 }

你应该对从OpenCV收到的每个指针使用这种技术,好吗?

其中一个主要问题是你在循环之前为CvMemStorage分配内存,但是在循环内你释放它,这意味着在第一次循环迭代之后将不再有效{{1这是一个巨大的问题。

将分配过程移动到循环的开头,因此在每次迭代时都会分配/取消分配内存,或者将CvMemStorage* storage调用移出循环。

答案 1 :(得分:0)

现在它工作正常,我用这个

改变了cvWaitKey()
   if(waitKey(30) >= 0) break;

我不明白为什么,但现在一切正常,但