opencv摄像头速度慢,我的Opencv应用程序处理速度非常慢

您所在的位置:网站首页 opencv打开摄像头慢 opencv摄像头速度慢,我的Opencv应用程序处理速度非常慢

opencv摄像头速度慢,我的Opencv应用程序处理速度非常慢

2023-08-23 06:29| 来源: 网络整理| 查看: 265

I am building an OpenCV application which captures a video from camera and overlays it on another video after removing the background.

I am not able to achieve a reasonable speed as it is playing the output at about 1 fps, whereas my background removal is working at 3fps.

Is there a way to display the background video at its normal speed and overlay the processed video at 3fps ?

I tried commenting out my code and I realized that the problem lies majorly with the Rendering part itself. I tried displaying the video along with my web cam feed and I noticed that there is a drop in the actual fps and the fps of video when displayed with openCV.

here is the sample code:

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);

}

}

解决方案

The main problem is that you are allocating a new image at every iteration of the loop without releasing it at the end of the loop. In other words, you have a beautiful memory leak.

A better approach is to simply grab a frame of the video before the loop starts. This will let you create bck1 with the right size just once.

There are other problems with your code, I'm sharing a fixed version below, make sure you pay attention to every line of code to see what changed. I haven't had time to test it, but I'm sure you'll figure it out:

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;

}

These fixes should speed up your application considerably.



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3