【问题标题】:cvCreateFileCapture strange errorcvCreateFileCapture 奇怪的错误
【发布时间】:2012-03-02 11:22:51
【问题描述】:

我正在尝试在 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() 程序只是挂起一点,如果我尝试崩溃关闭窗口,我开始认为编解码器或类似的东西有问题......

【问题讨论】:

    标签: c opencv video-capture samba


    【解决方案1】:

    代码中有很多潜在的问题,其中大部分与没有进行防御性编码有关。

    cvWaitKey(0);cvNamedWindow() 之后在做什么?没必要,删掉!

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

    CvCapture* 捕获 = cvCreateFileCapture("monsters.avi"); 如果(!捕获) { // 未找到文件,处理错误并可能退出应用程序 }

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

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

    要么将分配过程移至循环的开头,因此在每次迭代时分配/释放内存,要么将cvReleaseMemStorage( &amp;storage ); 调用移出循环。

    【讨论】:

      【解决方案2】:

      现在它工作正常,我用这个更改了 cvWaitKey()

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

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

      【讨论】:

        猜你喜欢
        • 2013-02-24
        • 2010-11-17
        • 1970-01-01
        • 2014-10-11
        • 2012-04-27
        • 2013-10-30
        • 2016-09-18
        • 2012-03-18
        • 2015-05-13
        相关资源
        最近更新 更多