C-对我的OpenCV应用程序的处理非常缓慢



我正在构建一个OpenCV应用程序,该应用程序从相机中捕获视频,并在删除背景后将其覆盖在另一个视频上。

我无法达到合理的速度,因为它在大约1 fps的情况下播放输出,而我的背景删除则以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;
}

这些修复程序应大大加快您的应用程序。

最新更新