开发者社区> 问答> 正文

windows下QT读取摄像头已经成功,但是内存消耗很大:报错

IplImage *pFrame;

 CvCapture* pCapture;
 pFrame = NULL;
 pCapture = cvCreateCameraCapture(-1);
 while(1)
 {
 
 pFrame=cvQueryFrame(pCapture);
 if(!pFrame)
 break;
 cvShowImage("video",pFrame);
 char c=cvWaitKey(33);
 if(c==27)break;
 }
 cvReleaseImage(&pFrame);
 cvReleaseCapture(&pCapture);
以上是参考代码,以下是自己想办法
 void Widget ::paintEvent ( QPaintEvent *)
{
 
 pFrame=cvQueryFrame(pCapture);
 IplImage *dst = 0; //目标图像指针
 //float scale = 0.5; //缩放倍数为0.618倍
 CvSize dst_cvsize; //目标图像尺寸
 dst_cvsize.width = (pFrame->width)/2; //目标图像的宽为源图象宽的scale
 dst_cvsize.height = (pFrame->height)/2; //目标图像的高为源图象高的scale倍
 dst = cvCreateImage( dst_cvsize, pFrame->depth, pFrame->nChannels); //构造目标图象
 cvResize(pFrame, dst, CV_INTER_LINEAR); //缩放源图像到目标图像
 QImage *image;
 cvCvtColor(dst,dst,CV_BGR2RGB);
 uchar *imgData=(uchar *)dst->imageData;
 image=new QImage(imgData,dst->width,dst->height,QImage::Format_RGB888);
 ui->label_8->setPixmap(QPixmap::fromImage(*image));
 delete image;
 
} 
在这个事件里面写的,运行下,视频可以读出来,但是内存消耗很大,每秒差不多1000K左右,怎么解决呢?
我打算开个线程,run里面直接while循环这样好吗?

展开
收起
kun坤 2020-06-07 21:26:10 758 0
1 条回答
写回答
取消 提交回答
  •  QImage *image;在构造的时候、使用了你提供的内存imgData。析构的时候并不释放该内存块。
    所以,你的 IplImage *dst,是不是需要自己去释放啊。
    ######cvReleaseImage(&dst); 已经成功,谢谢了######自己顶一下,搞了视频很长时间了,三路无延时低消耗也搞出来来了,不过是在VS2008下面的QT4.8.5,用的CamerDS,但是直接在QTCreator下调用的话报很多错误,头文件找不到,希望有这方面的经验的老手们不吝赐教,也为后来人指明道路###### @Ray

     

    ###### @吥楛糖 求指导,谢谢######

    引用来自“SidWang”的答案

     QImage *image;在构造的时候、使用了你提供的内存imgData。析构的时候并不释放该内存块。
    所以,你的 IplImage *dst,是不是需要自己去释放啊。
    有句话说的好啊,越是擅长的地方越容易被坑。。
    ######

    引用来自“DavidWong8383”的答案

    引用来自“SidWang”的答案

     QImage *image;在构造的时候、使用了你提供的内存imgData。析构的时候并不释放该内存块。
    所以,你的 IplImage *dst,是不是需要自己去释放啊。
    有句话说的好啊,越是擅长的地方越容易被坑。。
    就是这个原因
    2020-06-07 21:26:15
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云服务器ECS内存增强型实例re6全新发布 立即下载
TAKING WINDOWS 10 KERNEL 立即下载
ECS运维指南之Windows系统诊断 立即下载