MFC中使用OpenCV显示摄像头图像

40 篇文章 0 订阅
4 篇文章 1 订阅

 之前一直想在MFC上学习,但是苦于对一些算法的研究花了比较多的时间,现在回头来学习MFC,学习的内容比较简单,只是简单的显示摄像头的图像,

以下是我程序的界面部分:

image

这里其实需要往MFC里面添加的有以下几部分:

1、将IplImage画到DC;

2、设置计时器以便能够持续抓到帧;

3、增加OnClose来释放摄像头及计时器。

1>、将IplImage的格式draw到DC中,使用的CvvImage类(地址:http://blog.chinaunix.net/uid-26020768-id-3198250.html),这个类在高版本的OpenCV被和谐掉了,失去了一种比较好的方法。你要使用就需要添加CvvImage的源文件就好。

这里简单些一个函数来实现:

// 将图片DRAW到DC
void CShowCaptureDlg::drawToDC(IplImage* image, UINT ID)
{
    CDC* pDC = GetDlgItem(ID)->GetDC();
    HDC pHdc = pDC->GetSafeHdc();

    CRect rect;
    GetDlgItem(ID)->GetClientRect(&rect);

    CvvImage cimg;
    cimg.CopyOf(image);
    cimg.DrawToHDC(pHdc, rect);

    ReleaseDC(pDC);
}

2>、设置计时器的目的是能够持续的显示连续的视频图像,用的MFC中的setTimer和WM_TIMER来实现,这里不讲述他们的原理了。先给出Open按钮的代码:

void CShowCaptureDlg::OnBnClickedOpenCamera()
{
    // TODO: 在此添加控件通知处理程序代码
    
    if(!pCapture)
    {
        pCapture = cvCaptureFromCAM(-1);
        pFrame = cvQueryFrame(pCapture);
        drawToDC(pFrame, IDC_CAPTURE);
    }

    SetTimer(ID_TIMER1, 10, NULL);
    
}

你看到了一个setTimer()的函数,没错,就是这里添加一个计时器,Deal按钮也需要添加计时器:

void CShowCaptureDlg::OnBnClickedProcess()
{
    // TODO: 在此添加控件通知处理程序代码

    SetTimer(ID_TIMER2, 10, NULL);
}

添加计时器以后,你需要把计时器的消息传递给WM_TIMER,需要在类向导里面添加:类视图-》CShowCaptureDlg右键-》属性,然后你可以再属性类表中找到消息,你就可以在WM_TIMER中添加OnTimer来响应计时器了。不懂得可以看下图:

image    image          image

OnTimer的代码:

void CShowCaptureDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    switch(nIDEvent)
    {
    case ID_TIMER1:
        {        
            if(m_bOpenCamera)
            {
                pFrame = cvQueryFrame(pCapture);
                drawToDC(pFrame, IDC_CAPTURE);
            }
            break;
        }
        
    case ID_TIMER2:
        {
            IplImage* pGray = cvCreateImage(cvGetSize(pFrame), 8, 1);
            cvCvtColor(pFrame, pGray, CV_BGR2GRAY);
            cvThreshold(pGray, pGray, 100, 255, CV_THRESH_BINARY);
            drawToDC(pGray, IDC_DEAL);
            break;
        }

    }
    CDialog::OnTimer(nIDEvent);
}

这样,就可以抓到视频了,但是我们还必须做的是清理动作,同样,在WM_CLOSE添加OnClose代码:

void CShowCaptureDlg::OnClose()
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    cvReleaseCapture(&pCapture);
    KillTimer(ID_TIMER1);
    KillTimer(ID_TIMER2);

    CDialog::OnClose();
}

这样,完整的MFC显示摄像头就完成了。如果还有不懂得请留言,本部分适合新手,大牛请飘过。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC 是指Microsoft Foundation Class,是一种框架,用于快速开发Windows应用程序。而OpenCV是一种开源计算机视觉库,它提供了各种图像处理和计算机视觉算法的函数和工具。 要在MFC应用程序链接摄像头,我们可以使用OpenCV库来实现。首先,我们需要在项目包含OpenCV的头文件和库文件。 然后,我们可以使用OpenCV的函数来初始化和打开摄像头。例如,我们可以使用`cv::VideoCapture`类的构造函数来打开摄像头,如下所示: ```cpp cv::VideoCapture capture(0); // 打开默认摄像头 ``` 在打开摄像头后,我们可以使用`cv::VideoCapture`的`read`函数来读取摄像头的每一帧图像,如下所示: ```cpp cv::Mat frame; // 存储每一帧图像 while (true) { capture.read(frame); // 读取摄像头图像 cv::imshow("摄像头", frame); // 显示图像 if (cv::waitKey(30) >= 0) break; // 等待按键退出 } ``` 在上述代码,我们使用`cv::imshow`函数将每一帧图像显示在一个窗口,并使用`cv::waitKey`函数等待按键输入退出循环。 需要注意的是,这只是链接摄像头的基本示例。根据具体需求,我们可以进一步使用OpenCV库提供的其他函数进行图像处理、特征提取等操作,实现更多功能。 总结起来,要在MFC应用程序链接摄像头,可以使用OpenCV库提供的函数和工具来实现初始化摄像头、读取每一帧图像和进行图像处理等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值