MFC+OpenCv+vs调用摄像头显示视频 (不使用CvvImage类)

前言:上一篇博客实现了用MFC+OpenCv显示图像这一篇是紧接着的进阶版,同样是基于Mat与CImage的转换,不需要额外添加头文件与cpp

先放一张效果图(手动打码)

MFC+OpenCv+vs调用摄像头显示视频 (不使用CvvImage类)_第1张图片

前面的过程都很类似,创建好项目搭配好环境就可以开始了

在DIALOG中,设置opencamera控件以及picture control(在属性页中找到他的ID,用来获得句柄) 如下图:
MFC+OpenCv+vs调用摄像头显示视频 (不使用CvvImage类)_第2张图片
双击opencamera进入编程界面

首先声明好MatCImage类

声明好之后,对两个函数进行编写
MFC+OpenCv+vs调用摄像头显示视频 (不使用CvvImage类)_第3张图片

OnPaint 函数

在这里插入图片描述
不同于上一篇博文,这次处理视频不需要在onpaint函数的else中额外添加代码。我添加了一句,不加也可。
MFC+OpenCv+vs调用摄像头显示视频 (不使用CvvImage类)_第4张图片

BUTTONCLICK函数

这一部分是关键,主要代码如下

void CMFCretry2Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	VideoCapture capture(0);
	Mat frame;
	CImage image;
	
	
	while (1)
	{
		capture >> frame;
		waitKey(10);
		MatCImage mc;
		mc.MatToCImage(frame, image);
		CWnd *pWnd = GetDlgItem(IDC_STATIC);//获得pictrue控件窗口的句柄   
		CDC *pDC = pWnd->GetDC();//获得pictrue控件的DC  
		HDC hDC = pDC->GetSafeHdc();
		GetClientRect(&rect);
		GetDlgItem(IDC_STATIC)->GetClientRect(&rect);
		//rect.MoveToX(rect.Width() / 2 -image.GetWidth() / 2);
		//rect.MoveToY(rect.Height() / 2 - image.GetHeight() / 2);    
	    //GetDlgItem(IDC_STATIC)->MoveWindow(rect);
		Mat dst;
		int x = rect.Width();
		int y = rect.Height();
		resize(frame, dst, Size(x, y));
		mc.MatToCImage(dst, image);
		image.Draw(pDC->m_hDC, rect);
		
	}

}

后记

在调试过程中,遇到了问题:

问题:视频显示总是不在预先框定的picture control控件之中
原因:
在这里插入图片描述
解决:起初添加了
rect.MoveToX(rect.Width() / 2 -image.GetWidth() / 2);
rect.MoveToY(rect.Height() / 2 - image.GetHeight() / 2);
GetDlgItem(IDC_STATIC)->MoveWindow(rect);
利用这几行代码,改变显示位置,但是效果不佳。最后决定采用Mat的resize函数,先把图像转化为rect大小,
在这里插入图片描述
再把Draw函数中的参数改为rect

你可能感兴趣的:(MFC+OpenCv+vs调用摄像头显示视频 (不使用CvvImage类))