MFC框架下的OpenCV 视频捕获

本文档介绍如何在MFC应用程序中利用OpenCV进行视频捕获,并探讨了在多线程环境下解决视频捕获循环无法退出及窗口关闭后线程不终止的问题。通过在Doc类中启动线程进行视频捕获,以及尝试在析构函数中发送WM_QUIT消息以终止线程,但遇到了线程无法稳定退出的挑战。最终解决方案是将视频处理移到View类中,避免了窗口句柄在窗口关闭后被非法使用的情况。

在MFC框架下,调用开源代码OpenCV中的函数,完成视屏捕获功能。

文档类Doc中完成视频的捕获,在View类中完成视频(分帧)的显示。

如下是Doc类中的主要代码:

void Clzy1_0614Doc::OnOpenCamera()
{
	// TODO: Add your command handler code here
	CvCapture * pCapture = NULL;

	//打开摄像头
	if (! (pCapture = cvCaptureFromCAM(1)))	//USB摄像头;0和-1都出错了,不知何解
	{
		AfxMessageBox(TEXT("打开摄像头失败!"));
		return;
	}
	//逐帧读取视频
	//IplImage *pFrame = NULL;
	//IplImage *pProcess = NULL;
	int nFrmCount = 0;
	while (pFrame = cvQueryFrame(pCapture))
	{
		++ nFrmCount;
		//如果是第一帧,需要申请内存,并初始化
		if (1 == nFrmCount)
		{
			pProcess = cvCreateImage(cvSize(pFrame->width, pFrame->height), pFrame->depth, 1);	//创建灰度图
			//width和height的顺序不要搞反了,否则cvCvtColor转换函数出错
			//pProcess = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);

			//cvSaveImage("lzy.jpg", pFrame);

			//height和width的顺序不要搞反了,否则cvConvert转换函数出错;与上个完全相反
			pFrmMat = cvCreateMat(pFrame->height, pFrame->width, CV_64FC3);		//创建RGB图CvMat
			pPrcMat = cvCreateMat(pFrame->height, pFrame->width, CV_64FC1);		//创建灰度图CvMat,注意单通道
			
			FMat = cv::Mat(pFrame);
			PMat = cv::Mat(pProcess);
		}

		//cvCvtColor(pFrame, pProcess, CV_RGB2GRAY);	//不改变pFrame及其指向的Frame值
		//cvConvert(pFrame, pFrmMat);
		//cvConvert(pProcess, pPrcMat);

		cvThreshold(pProcess, pProcess, 128, 255.0, CV_THRESH_TOZERO_INV); //CV_THRESH_BINARY

		/***************调用view类中的位图显示函数***********
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值