zoukankan      html  css  js  c++  java
  • OpenCV+MFC显示图像/视频

    OpenCV中文网站上有讲怎么使用OpenCV读入和显示图像和视频

    图像文件读入和显示:http://www.opencv.org.cn/index.php/%E5%9B%BE%E5%83%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%85%A5%E5%92%8C%E6%98%BE%E7%A4%BA

    读取视频文件:http://www.opencv.org.cn/index.php/%E8%AF%BB%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%92%8C%E8%BF%90%E5%8A%A8%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B

    但它的显示是使用的OpenCV库里面的简单的GUI,用来测试验证可以,如果要做成可视化工程,还是得借助专门的GUI开发工具了。本文简述使用MFC显示图像和视频。

    1.读取并显示图像

    显示图像或视频使用VC中的Picture控件,用到VC图形设备接口的设备上下文(CDC类)。比如打开显示这样一个图片lean.jpg

    先进行一些初始化工作,代码如下:

     1 // DemoDlg.h
     2 #include <highgui.h>
     3 
     4 //在CDemoDlg类定义中加入如下几行
     5 private:       
     6     CRect rect;
     7     CStatic* pStc; //标识图像显示的Picture控件
     8     CDC* pDC; //视频显示控件设备上下文
     9     HDC hDC; //视频显示控件设备句柄
    10     CvCapture* capture; //视频获取结构
    11 
    12 //DemoDlg.cpp
    13 #include <cv.h>
    14 #include <highgui.h>
    15 #include <cvaux.h>
    16 #include <ml.h>
    17 
    18 //在CDemoDlg构造函数内添加以下几行,指针初始化
    19     pStc=NULL;
    20     pDC=NULL;
    21     capture=NULL;
    22 
    23 //在CDemoDlg类的OnInitDialog()中添加如下几行,进行初始化
    24 BOOL CFaceDlg::OnInitDialog()
    25 {
    26     //框架生成代码.......
    27 
    28     pStc=(CStatic *)GetDlgItem(IDC_VIEW);//IDC_VIEW为Picture控件ID
    29     pStc->GetClientRect(&rect);//将CWind类客户区的坐标点传给矩形
    30     pDC=pStc->GetDC(); //得到Picture控件设备上下文
    31     hDC=pDC->GetSafeHdc(); //得到控件设备上下文的句柄 
    32 
    33     return   TRUE;
    34 }

    如上就将Picture控件的设备上下文句柄与图片/视频显示的矩形区域联系起来。

    下面显示图片,在对话框上添加一个打开按钮,点击该按钮触发读取显示图像的事件,事件响应如下:

    1 void CDemoDlg::OnOpen() 
    2 {
    3     IplImage * img=cvLoadImage("lena.jpg");//load image from file
    4     CvvImage cvvImg; //CvvImage类
    5 cvvImg.CopyOf(img);//复制图像到当前的CvvImage对象中 6 cvvImg.DrawToHDC(hDC,&rect); //绘制图像的ROI区域到DC的rect 7 }

    2.读取并显示视频

    因为视频时一帧一帧的图像,因此显示视频可以理解为间断地读取并显示不同帧的图像。这里有一个要点,为了合理利用资源,尽量不要使用一个死循环一直读取视频中的帧数据,应该根据视频的帧率设置合适的时钟,定时地对视频中的帧图像进行读取显示。因为帧率通常很低,所以显示的每一帧图像看起来就会使连续的。

    对于视频(视频文件/摄像头)的操作,OpenCV中文网站的参考手册上给你详细的用法,详见http://www.opencv.org.cn/index.php/HighGUI%E8%A7%86%E9%A2%91%E8%AF%BB%E5%86%99%E5%87%BD%E6%95%B0

    这里给出视频文件的读取与现实(因为没摄像头,摄像头的还没有测试)。

    初始化工作同上面的图像读取显示一样,所不同的是CDemoDlg::OnOpen()事件响应函数中的代码有区别,如下

     1 void CDemoDlg::OnOpen()
     2 {
     3     if (!capture)
     4     {        
     5         capture=cvCaptureFromAVI("D://OtherUse//11.avi"); //初始化一个视频文件捕捉器
     6     }
     7     if(!capture)
     8     {
     9         AfxMessageBox("无法获得摄像头");
    return;
    10 } 11 SetTimer(1,25,NULL); //定时器,定时时间和帧率一致 12 }

    然后设置时间响应,定时到达后,处理OnTimer(UINT nIDEvent)事件,视频显示在这里面完成。

     1 void CDemoDlg::OnTimer(UINT nIDEvent) 
     2 {
     3     // TODO: Add your message handler code here and/or call default
     4     if(1==nIDEvent)
     5     {
     6         IplImage* img=0;  
     7         img=cvQueryFrame(capture); //从摄像头或者文件中抓取并返回一帧
     8         //cvGrabFrame( capture ); //从摄像头或者视频文件中抓取帧
     9         //img=cvRetrieveFrame(capture); //取回由函数cvGrabFrame抓取的图像
    10         CvvImage m_CvvImage;  
    11         m_CvvImage.CopyOf(img,1); //复制该帧图像    
    12         m_CvvImage.DrawToHDC(hDC, &rect); //显示到设备的矩形框内
    13     }
    14     CDialog::OnTimer(nIDEvent);
  • 相关阅读:
    Linux网卡设置
    Linux虚拟机-----概述(1)
    Redis缓存数据库-----概述(1)
    Spring和Mybatis的集成
    onehot编码解释
    LINUX-CUDA版本所对应的NVIDIA驱动版本号,cuda版本报错的朋友参考一下
    matplotlib画图
    pytorch实现花朵数据集读取
    轻量架构ShuffleNet V2:从理论复杂度到实用设计准则
    CBAM: 卷积块注意模块
  • 原文地址:https://www.cnblogs.com/Romi/p/2487652.html
Copyright © 2011-2022 走看看