gpt4 book ai didi

c++ - Opencv圆检测-RAM加载

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:34 24 4
gpt4 key购买 nike

我最近在 OpenCV 中做了一些圆检测,并取得了一些巨大的成功。下面的代码在 32 位平台上用 C++ 运行得非常好。但是我确实有一个小问题;当程序运行时,我的 RAM 负载会继续加载。例如,当我启动程序时,我的大小为 250mb,30 秒后我的大小约为 800mb。这将继续并最终溢出到硬盘驱动器。我试图将 cvReleaseCapture 移动到 while 循环内,但我只是得到旧的“内存位置异常......”。有什么想法可以清理吗?多谢。这是代码:

#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <math.h>


int main( int argc, char **argv )
{
CvCapture *capture = 0;
IplImage *img = 0;
int key = 0;
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_PLAIN,1.0,1.0,0,1,CV_AA);

capture = cvCaptureFromCAM( 0 );

if ( !capture ) {
fprintf( stderr, "Cannot open initialize webcam!\n" );
return 1;
}

cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );

while( key != 'q' ) {
img = cvQueryFrame( capture );
IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
CvMemStorage* storage = cvCreateMemStorage(0);
cvCvtColor( img, gray, CV_BGR2GRAY );
cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 );
CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray- >height/4, 200, 100, 20, 100 );
int i;
for( i = 0; i < circles->total; i++ )
{
float* p = (float*)cvGetSeqElem( circles, i );
//cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 2, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(0,255,0), 2, 8, 0 );
cvLine (img, cvPoint(cvRound(p[0]+40),cvRound(p[1])), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvLine (img, cvPoint(cvRound(p[0]),cvRound(p[1]+40)), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvLine (img, cvPoint(cvRound(p[0]-40),cvRound(p[1])), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvLine (img, cvPoint(cvRound(p[0]),cvRound(p[1]-40)), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvPutText(img, "Meow",cvPoint(cvRound(p[0]+45),cvRound(p[1]+45)), &font, CV_RGB(0,0,255));

}


if( !img ) break;
cvShowImage( "result", img );
key = cvWaitKey( 1 );
cvReleaseCapture( &capture );
}

cvDestroyWindow( "result" );
cvReleaseCapture( &capture );

return 0;

最佳答案

去掉 while 循环中的 cvReleaseCapture。相反,你应该有

cvReleaseMemStorage(storage);
cvReleaseImage(gray);

您可能应该移动 if (!img) break; 行使其显示为:

img = cvQueryFrame(capture);
if (!img) break;

编辑

实际上,与其不断创建然后销毁 gray,不如在 while 的 eof 之外进行初始捕获 (img = cvQueryFrame(capture);) 循环。然后按正常方式创建gray。这样您就不必在 while 循环中继续创建它,这就是内存不足的原因(您每次迭代都在创建新图像而不释放它)。

所以

#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <math.h>


int main( int argc, char **argv )
{
CvCapture *capture = 0;
IplImage *img = 0;
int key = 0;
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_PLAIN,1.0,1.0,0,1,CV_AA);

capture = cvCaptureFromCAM( 0 );

if ( !capture ) {
fprintf( stderr, "Cannot open initialize webcam!\n" );
return 1;
}

cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );

img = cvQueryFrame( capture );
if (!img)
exit(1);
IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
CvMemStorage* storage = cvCreateMemStorage(0);

while( key != 'q' ) {
img = cvQueryFrame( capture );
if( !img ) break;


cvCvtColor( img, gray, CV_BGR2GRAY );
cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 );
CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray- >height/4, 200, 100, 20, 100 );
int i;
for( i = 0; i < circles->total; i++ )
{
float* p = (float*)cvGetSeqElem( circles, i );
//cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 2, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(0,255,0), 2, 8, 0 );
cvLine (img, cvPoint(cvRound(p[0]+40),cvRound(p[1])), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvLine (img, cvPoint(cvRound(p[0]),cvRound(p[1]+40)), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvLine (img, cvPoint(cvRound(p[0]-40),cvRound(p[1])), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvLine (img, cvPoint(cvRound(p[0]),cvRound(p[1]-40)), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvPutText(img, "Meow",cvPoint(cvRound(p[0]+45),cvRound(p[1]+45)), &font, CV_RGB(0,0,255));

}

cvShowImage( "result", img );
key = cvWaitKey( 1 );

}
cvReleaseMemStorage(storage);
cvReleaseImage(gray);
cvDestroyWindow( "result" );
cvReleaseCapture( &capture );

return 0;
}

关于c++ - Opencv圆检测-RAM加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8251867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com