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

标签 c visual-c++ image-processing opencv video-capture

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

我无法达到合理的速度,因为它以大约 1 fps 的速度播放输出,而我的背景移除工作以 3 fps 的速度进行。

有没有办法以正常速度显示背景视频并以 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;
}

这些修复应该会大大加快您的应用程序的速度。

关于c - 我的 Opencv 应用程序处理速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13229786/

相关文章:

c - 有关 C 编程语言 (K&R) 的问题 - 练习 1-13

C编程: write to file without buffer

c++ - 尽管没有外部库,但 Unresolved external 问题

c++ - 加密++库中的SHA512哈希抛出异常

c++ - 使用 CreateFile 函数创建文件会导致写保护文件

c++ - matlab strel函数参数作为opencv cpp中的八角形

计算c程序中for、while、do/while循环的数量

opencv - 频域滤波opencv c++?

image-processing - 如何使用 Opencv 进行 OCR 文档识别?

c++ - 使用 `memcpy()` 为指针分配地址