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

  • Post author:
  • Post category:其他


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



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

在这里插入图片描述



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

在DIALOG中,设置opencamera控件以及picture control(在属性页中找到他的ID,用来获得句柄) 如下图:

在这里插入图片描述

双击opencamera进入编程界面



首先声明好MatCImage类

声明好之后,对两个函数进行编写

在这里插入图片描述



OnPaint 函数

在这里插入图片描述

不同于上一篇博文,这次处理视频不需要在onpaint函数的else中额外添加代码。我添加了一句,不加也可。

在这里插入图片描述



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



版权声明:本文为guchensha原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。