MFC中使用Opencv打开摄像头并显示

本文介绍如何在MFC应用中利用OpenCV打开并显示摄像头视频流。首先创建Dialog based的MFC程序,然后添加Picture control和Button控件。通过设置Button的BNCLICKED事件和定时器消息处理,实现打开摄像头并周期性更新图像到Picture control。最后,引入CvvImage库辅助处理IplImage对象。
摘要由CSDN通过智能技术生成

MFC是VS中专门用来开发用户界面程序的模块。
Opencv中集合了各种图像处理的函数,是一个无比强大的计算机视觉库。
创建MFC程序:
1、创建MFC Application程序
2、选择Dialog based,Use MFC in a static library(此处可以让生成的程序集成需要调用的库无序外部库的支持),取消Use Unicode libraries。
3、选择C****Dlg类finish。其余的选项默认即可。
4、放置Picture control控件。设置ID为IDC_CameraDisplay。
5、放置Button控件。设置ID为IDC_OpenCamera。
6、右键Class Wizard,选择IDC_OpenCamera和BNCLICKED。点击Add Handler -> Apply -> OK。
7、在生成的函数中加入代码:

capture = cvCaptureFromCAM(1);

    if(!capture)
    {
        MessageBox("camear open error!");
        ExitProcess(0);
    }
    SetTimer(1,33,NULL);

其中capture = cvCaptureFromCAM(1);表示打开USB摄像头1,0表示打开笔记本摄像头,-1表示让用户选择摄像头。
SetTimer(1,33,NULL);表示开启定时器1,循环时间为33ms。
8、增加定时器消息处理在工程上右键Class Wizard -> Messages -> WM_TIMER -> Add Handler -> Apply -> OK。
9、在生成的函数中加入代码

    image = cvQueryFrame(capture);
    if( !image.empty() )
    { 
        DrawPicToHDC(&image, IDC_STATIC);
    }
    else
    { 
        MessageBox("OnTimer Error!!"); 
    }

10、添加void CMyFaceDlg::DrawPicToHDC(IplImage *img, UINT ID)
代码如下:

void CMyFaceDlg::DrawPicToHDC(IplImage *img, UINT ID)
{
    CDC *pDC = GetDlgItem(ID)->GetDC();
    HDC hDC= pDC->GetSafeHdc();
    CRect rect;
    GetDlgItem(ID)->GetClientRect(&rect);
    CvvImage cimg;
    cimg.CopyOf( img ); // 复制图片
    cimg.DrawToHDC( hDC, &rect ); // 将图片绘制到显示控件的指定区域内
    ReleaseDC( pDC );
}

11、添加CvvImage.h和CvvImage.cpp文件
CvvImage.h源代码:

#pragma once
#ifndef CVVIMAGE_CLASS_DEF
#define CVVIMAGE_CLASS_DEF
#include "opencv.hpp"
/* CvvImage class definition */
class  CvvImage
{
public:
   CvvImage();
   virtual ~CvvImage();
   /* Create image (BGR or grayscale) */
   virtual bool  Create( int width, int height, int bits_per_pixel, int image_origin = 0 );
   /* Load image from specified file */
   virtual bool  Load( const char* filename, int desired_color = 1 );
   /* Load rectangle from the file */
   virtual bool  LoadRect( const char* filename,
      int desired_color, CvRect r );
#if defined WIN32 || defined _WIN32
   virtual bool  LoadRect( const char* filename,
      int desired_color, RECT r )
   {
      return LoadRect( filename, desired_color,
         cvRec
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值