我的Opencv应用程序处理速度非常慢

我的Opencv应用程序处理速度非常慢,c,visual-c++,image-processing,opencv,video-capture,C,Visual C++,Image Processing,Opencv,Video Capture,我正在构建一个OpenCV应用程序,它从摄像机捕获一个视频,并在移除背景后将其覆盖到另一个视频上 我不能达到一个合理的速度,因为它以大约1fps的速度播放输出,而我的背景移除以3fps的速度工作 是否有办法以正常速度显示背景视频,并以3fps的速度覆盖处理后的视频 我试着注释我的代码,我意识到问题主要在于渲染部分本身。我试着把视频和我的网络摄像头一起显示,我注意到当用openCV显示时,视频的实际fps和fps都有所下降 以下是示例代码: void main() { CvCapture

我正在构建一个OpenCV应用程序,它从摄像机捕获一个视频,并在移除背景后将其覆盖到另一个视频上

我不能达到一个合理的速度,因为它以大约1fps的速度播放输出,而我的背景移除以3fps的速度工作

是否有办法以正常速度显示背景视频,并以3fps的速度覆盖处理后的视频

我试着注释我的代码,我意识到问题主要在于渲染部分本身。我试着把视频和我的网络摄像头一起显示,我注意到当用openCV显示时,视频的实际fps和fps都有所下降

以下是示例代码:

 void main()
{
    CvCapture* capture, *Vcap;
    capture = cvCaptureFromCAM(0);
    if(!capture)
    {
        printf("Video Load Error");
    }

    Vcap = cvCaptureFromAVI("bgDemo.mp4");
    //printf("\nEntered BGR");
    if(!Vcap)
    {
        printf("Video Load Error");
    }

    while(1)
    {

        IplImage* src = cvQueryFrame(Vcap);
        if(!src)
        {
            Vcap = cvCaptureFromAVI("bgDemo.mp4");
            continue;
        }
        IplImage* bck1 = cvCreateImage(cvGetSize(src),8,3);
        cvResize(src,bck1,CV_INTER_LINEAR);

        cvShowImage("BCK",bck1);
        cvWaitKey(1);
    }
}

主要问题是在循环的每次迭代中分配一个新映像,而不是在循环结束时释放它。换句话说,您有一个漂亮的内存泄漏

更好的方法是在循环开始之前简单地抓取一帧视频。这将允许您仅创建一次大小合适的
bck1

你的代码还有其他问题,我在下面分享一个固定版本,请确保你注意每一行代码,看看有什么变化。我还没来得及测试,但我相信你会明白的:

int main()
{
    // I know what you are doing, just one capture interface is enough
    CvCapture* capture = NULL; 

    capture = cvCaptureFromCAM(0);
    if(!capture)
    {
        printf("Ooops! Camera Error");            
    }

    capture = cvCaptureFromAVI("bgDemo.mp4");
    if(!capture)
    {
        printf("Ooops! Video Error");
        // if it failed here, it means both methods for loading a video stream failed.
        // It makes no sense to let the application continue, so we return.
        return -1; 
    }

    // Retrieve a single frame from the camera
    IplImage* src = cvQueryFrame(capture);
    if(!src)
    {
        printf("Ooops! #1 cvQueryFrame Error");
        return -1; 
    }

    // Now we can create our backup image with the right dimensions.
    IplImage* bck1 = cvCreateImage(cvGetSize(src),src->depth, src->nChannels);
    if(!bck1)
    {
        printf("Ooops! cvCreateImage Error");
        return -1; 
    }

    while(1)
    {
        src = cvQueryFrame(capture);
        if(!src)
        {
             printf("Ooops! #2 cvQueryFrame Error");  
             break; 
        }

        cvResize(src, bck1, CV_INTER_LINEAR);

        cvShowImage("BCK",bck1);
        cvWaitKey(10);
    }

    cvReleaseImage( &bck1 ); // free manually allocated resource

    return 0;
}

这些修复程序将大大加快应用程序的速度。

发布源代码。没有它,就不可能回答有关源代码效率的问题。@user1606191检查答案,并投票选出对您有帮助的答案。选择你的问题的正式答案(如果有)也很重要:你可以点击旁边的复选框。通过这样做,你将帮助未来的访客喜欢你自己。@karlphillip谢谢,我是一只新蜜蜂,因此对使用stackoverflow不太了解,谢谢,我也对你的答案投了赞成票。Thnx for ur help:)通过使用CVGetCaptureProperty查询捕获,您还可以在不获取任何帧的情况下获取帧尺寸。这可以让你避免在循环外抓取第一帧。真的!但因为我过去在做这件事时遇到了一些问题,所以我有点怀疑。也许这在opencv中更为健壮。谢谢我还希望“我的相机”提要与视频一起显示。我无法通过同一个捕获界面同时显示摄像头提要和视频。这就是我的应用程序速度慢的原因,你是否建议我如何解决这个问题。返回并放置2个捕获接口。然后,需要使帧抓取过程彼此独立以提高性能。这意味着,成功打开这两个捕获接口后,将启动两个线程,每个线程将创建自己的OpenCV窗口,并从相应的接口抓取帧。通过这样做,您将隔离每个接口的处理,这可能有助于提高应用程序的性能。如果有帮助,请考虑投票表决,或者单击它附近的复选框,将其作为您问题的正式答案。