首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的Opencv应用程序处理速度非常慢

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

Stack Overflow用户
提问于 2012-11-05 18:03:12
回答 1查看 8.2K关注 0票数 2

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

我不能达到一个合理的速度,因为它播放的输出约为1帧每秒,而我的背景去除是工作在3帧每秒。

有没有办法以正常的速度显示背景视频,并以3fps的速度叠加处理后的视频?

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

以下是示例代码:

代码语言:javascript
复制
 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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-06 00:10:16

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

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

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

代码语言:javascript
复制
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;
}

这些修复将大大提高您的应用程序的速度。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13229786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档