4,248
社区成员
发帖
与我相关
我的任务
分享
/*
本函数在定时器中每40ms调用一次
在类的头文件中定义
CvCapture *m_cvCapture;
CvvImage m_cimg;
CStatic m_stVideo; 控件,用于显示图像
*/
void CShowVideoView::PlayFile()
{
if (m_isPause)
{
DrawPicture(m_cimg);
return;
}
IplImage* img = NULL;
m_playPos += 1;
img = cvQueryFrame(m_cvCapture);
if (img == NULL)
{
// 已经到最后了,要回到开始的位置
cvSetCaptureProperty(m_cvCapture, CV_CAP_PROP_POS_FRAMES, 0);
m_playPos = 0;
return;
}
m_cimg.CopyOf(img);
DrawPicture(m_cimg);
}
void CShowVideoView::DrawPicture(CvvImage &cimg)
{
CDC *pDC = m_stVideo.GetDC();
if (pDC == NULL)
{
return;
}
HDC hDc = pDC->m_hDC;
CRect rect;
m_stVideo.GetClientRect(&rect);
cimg.DrawToHDC(hDc, &rect);
}
void CvvImage::CopyOf(IplImage* img, int desired_color)
{
if (HG_IS_IMAGE(img))
{
int color = desired_color;
CvSize size = cvGetSize(img);
if (color < 0)
color = img->nChannels > 1;
// 这两行是新添加的
if (m_img)
Destroy();
if (Create(size.width, size.height,
(!color ? 1 : img->nChannels > 1 ? img->nChannels : 3) * 8,
img->origin))
{
cvConvertImage(img, m_img, 0);
}
}
}
楼主表现$$的非常棒~
void CShowVideoView::DrawPicture()
{
CDC *pDC = m_stVideo.GetDC();
if (pDC == NULL)
{
return;
}
CRect rect;
m_stVideo.GetClientRect(&rect);
DrawMat(pDC, m_matImg, rect);
ReleaseDC(pDC); // 加了这一行
}
虽然内存还是会上涨,但是慢了,而且一段时间后基本上就不再上涨了,也不会出现无响应的情况了,程序也没有其它异常了,一切都正常了
/*
cv::VideoCapture m_cvCapture;
cv::Mat m_matImg;
//*/
if (!m_cvCapture.read(m_matImg))
{
// 已经到最后了,要回到开始的位置
GotoVideoStart();
m_isFramed = false;
return;
}
DrawPicture();
...
void CShowVideoView::DrawPicture()
{
CDC *pDC = m_stVideo.GetDC();
if (pDC == NULL)
{
return;
}
CRect rect;
m_stVideo.GetClientRect(&rect);
DrawMat(pDC, m_matImg, rect);
}
其中 DrawMat() 用的是 // https://blog.csdn.net/carotong/article/details/48497495 的代码,看起来也很简单
这样修改后,下载的CvvImage类就没有再用了
然而仍然会不断上涨这个内存