OpenCV之所以能在MFC Dialog的Picture控件上绘图,全靠了CvvImage::DrawToHDC()方法。这就是下文为出现CvvImage和HDC的原因。下面是具体过程,用OpenCV1.0+VC6实现。本文代码下载地址:http://download.csdn.net/detail/ybdesire/5297584
1、在Dlg类中添加public变量
CvCapture* capture; //用于采集摄像头数据
CRect rect; //HDC用,下同
CDC *pDC;
HDC hDC;
CWnd *pwnd;
并在构造函数中将三个指针初始化。
2、在OnInitDialog()中:添加设备上下文操作
pwnd = GetDlgItem(IDC_PIC_SHOW);//获取句柄
pDC =pwnd->GetDC();//设备上下文操作
hDC= pDC->GetSafeHdc();//
pwnd->GetClientRect(&rect);
3、在begin方法中:打开摄像头、显示、定时刷新
void CRunDetectDlg::OnButton1()
{
// TODO: Add your control notification handler code here
if(capture==NULL)
{
capture = cvCaptureFromCAM(0);
}
if (capture==NULL)
{
AfxMessageBox("无法打开摄像头");
return;
}
IplImage* m_Frame;//
m_Frame=cvQueryFrame(capture);//从摄像头抓取一帧图像
CvvImage m_CvvImage;//
m_CvvImage.CopyOf(m_Frame,3);//将m_Frame复制到当前对象中,复制后图像的通道为3,即RGB
m_CvvImage.DrawToHDC(hDC, &rect);
// 设置计时器,每1ms触发一次事件
SetTimer(1,1,NULL);
}
4、在OnTimer()中:定时刷新,原理同上
void CRunDetectDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_Frame=cvQueryFrame(capture);
CvvImage m_CvvImage;
m_CvvImage.CopyOf(m_Frame,3);
m_CvvImage.DrawToHDC(hDC, &rect);
CDialog::OnTimer(nIDEvent);
}
5、在Close方法中:关闭摄像头设备
cvReleaseCapture(&capture);
参考:
[1] http://blog.csdn.net/weixingstudio/article/details/7360941
[2] http://blog.csdn.net/chenyusiyuan/article/details/4744097
[3] http://blog.sina.com.cn/s/blog_5310fac60100og8h.html