在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类中的位图显示函数***********

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

被折叠的 条评论
为什么被折叠?



