前言:上一篇博客实现了用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 版权协议,转载请附上原文出处链接和本声明。