MFC:启动摄像头

先展示效果:



启动摄像头的操作需要用到opencv的库,本文用的是opencv2.4.9

配置opencv环境,参见:http://jingyan.baidu.com/article/75ab0bcbee4b47d6864db2fc.html

需要用到CvvImage类,opencv2.4.9里面没有这个类,需要手动添加,关于CvvImage类的说明请看:

http://blog.csdn.net/weixingstudio/article/details/7357651

http://blog.csdn.net/weixingstudio/article/details/7357558

需要注意:

1)cvCaptureFromCAM(0)函数可以创建摄像头,网上说参数可以使用-1,但经过实验,至少在我的电脑上参数-1采集图像无法正常工作。

2SetTimer()定时器函数,MFC中定时器的使用大家参见网上资料http://baike.baidu.com/item/SetTimer或http://www.cnblogs.com/lidabo/archive/2012/06/28/2568628.html。通过类向导添加定时器消息WM_TIMER和添加消息响应函数OnTimer

3)如果使用while循环实现显示图像功能,其他功能键将无法使用,所以最好是使用定时器方法每个几毫秒更新一次图像。

 

添加一个打开摄像头的按钮button,显示控件picture controlID更名为IDC_SHOWIMGDetectDlg.h头文件中添加打开摄像头函数声明

bool OpenCamera();
bool ShowVideo();
IplImage* pFrame;//存储视频一帧
CvCapture* pCapture;//存储视频流
CRect rect;//显示区域大小
CDC *pDC;
HDC hDC;
CWnd *pWnd;


OnInitDialog()函数中添加:

pFrame = NULL;
pCapture = NULL;
pWnd = GetDlgItem(IDC_SHOWIMG);
pDC = pWnd->GetDC();
hDC = pDC->GetSafeHdc();
pWnd->GetClientRect(&rect);


 

添加按钮响应函数及OpenCamera()ShowVideo()的实现

void CDetectDlg::OnBnClickedCam()
{
	// TODO:  在此添加控件通知处理程序代码
	if (OpenCamera())
	{
		ShowVideo();
	}
}

bool CDetectDlg::OpenCamera(){
	if (pCapture != NULL){
		return true;
	}
	if(!(pCapture = cvCaptureFromCAM(0))){
		return false;
	}
	pFrame = cvQueryFrame(pCapture);
	return true;
}
bool CDetectDlg::ShowVideo(){
	pFrame = cvQueryFrame(pCapture);
	CvvImage m_CvvImage;
	m_CvvImage.CopyOf(pFrame, 1);
	m_CvvImage.DrawToHDC(hDC, &rect);
	SetTimer(1, 10, NULL);//触发一个计数器,在响应函数中完成图像显示
	return true;
}

定时器函数:

void CDetectDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	pFrame = cvQueryFrame(pCapture);
	CvvImage m_CvvImage;
	m_CvvImage.CopyOf(pFrame, 1);
	m_CvvImage.DrawToHDC(hDC, &rect);
	CDialogEx::OnTimer(nIDEvent);
}

添加关闭摄像头按钮,消息函数函数,释放资源:

void CDetectDlg::OnBnClickedClosecam()
{
	// TODO:  在此添加控件通知处理程序代码
	if (pCapture != NULL)
	{
		cvReleaseCapture(&pCapture);
		KillTimer(1);
	}
}

以上实现摄像头的创建,图像的捕获与显示。


检查了一下午仍有问题未解决,内存泄漏了,如下图


参考了_CrtSetBreakAlloc(159)方法,见http://blog.csdn.net/doubleuto/article/details/5945666,仍然无法定位。希望大神指出错误,谢谢。

以上内容有任何错误,请在评论区留言交流,谢谢。



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值