• MFC学习篇(一):用OpenCV显示视频


    首先是一些基础的步骤,如建立MFC应用,添加按钮等,博主主要参考了下面这篇文章,其中的前32步都是用OpenCV显示图片和视频所必须的,即通用的。由于LZ原来有配置OpenCV的基础,所以配制还是比较快的。这里需要说明的是CvvImage.h和CvvImage.cpp文件在OpenCV2.2后就已经从OpenCV中移除了,但是我们还是有解决的办法的,就是新建一个CvvImage.h和CvvImage.cpp文件,将网上找的代码贴进去就行了,博主就搜了一个,当然你们也可以直接从将CvvImage.h和CvvImage.cpp下载下来,加进目录里去。

    然后就是显示视频了,博主主要参考了下这篇文章,如果同学们想仔细的搞清楚MFC的控件的原理和使用,如OnTimer()什么的,博主推荐鸡啄米的博客,博主看完之后感觉获益匪浅啊。

    博主在上述的基础上稍稍做了下改动,使显示的视频能自动调整大小以适应控件,代码如下

     1 void CFaceDetectionDlg::ResizeImage(IplImage* src_img,IplImage* resize_img, UINT ID)
     2 {
     3 
     4     // 读取图片的宽和高
     5     int iw = src_img->width;
     6     int ih = src_img->height;
     7 
     8     CRect rect;
     9     GetDlgItem(ID)->GetClientRect (&rect );
    10     int rw = rect.right - rect.left;            // 求出图片控件的宽和高
    11     int rh = rect.bottom - rect.top;
    12 
    13     float scale_w = iw/(float) rw;
    14     float scale_h = ih/(float) rh;
    15 
    16     // 找出宽和高中的较大值者
    17     // 计算将图片缩放到TheImage区域所需的比例因子
    18     float scale = (scale_w > scale_h)? scale_w : scale_h;
    19 
    20     // 缩放后图片的宽和高
    21     int nw = (int)( iw/scale );
    22     int nh = (int)( ih/scale );
    23     // 为了将缩放后的图片存入 TheImage 的正中部位,需计算图片在 TheImage 左上角的期望坐标值
    24     int tlx = (scale_w > scale_h)? 0: (int)(rw-nw)/2;
    25     int tly = (scale_w > scale_h)? (int)(rh-nh)/2: 0;
    26 
    27     // 设置 TheImage 的 ROI 区域,用来存入图片 img
    28     cvZero(resize_img);
    29     cvSetImageROI( resize_img, cvRect( tlx, tly, nw, nh) );
    30     // 对图片 img 进行缩放,并存入到 TheImage 中
    31     cvResize( src_img, resize_img );
    32     // 重置 TheImage 的 ROI 准备读入下一幅图片
    33     cvResetImageROI( resize_img );
    34 }

    以及显示图像的函数

     1 void CFaceDetectionDlg::ShowImage( IplImage* img, UINT ID )
     2 {
     3     //CDC* pDC = GetDlgItem( ID ) ->GetDC();        // 获得显示控件的 DC
     4     CDC *pDC = GetDlgItem(ID)->GetDC();
     5     HDC hDC = pDC ->GetSafeHdc();                // 获取 HDC(设备句柄) 来进行绘图操作
     6     CRect rect;
     7     GetDlgItem(ID) ->GetClientRect( &rect );
     8     int rw = rect.right - rect.left;            // 求出图片控件的宽和高
     9     int rh = rect.bottom - rect.top;
    10     int iw = img->width;                        // 读取图片的宽和高
    11     int ih = img->height;
    12     int tx = (int)(rw - iw)/2;                    // 使图片的显示位置正好在控件的正中
    13     int ty = (int)(rh - ih)/2;
    14     SetRect( rect, tx, ty, tx+iw, ty+ih );
    15     CvvImage cimg;
    16     cimg.CopyOf( img );                            // 复制图片
    17     cimg.DrawToHDC( hDC, &rect );                // 将图片绘制到显示控件的指定区域内
    18     ReleaseDC( pDC );
    19 
    20 }

    效果还是很不错的

  • 相关阅读:
    postgresql批量删除表
    Oracle迁移至PostgreSQL工具之Ora2Pg
    postgresql获取表最后更新时间(通过发布订阅机制将消息发送给应用程序)
    postgresql获取表最后更新时间(通过表磁盘存储文件时间)
    postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)
    postgresql源码编译安装(centos)
    Java 学习笔记(7)——接口与多态
    Java 学习笔记(6)——继承
    Java 学习笔记(4)——java 常见类
    Java 学习笔记(4)——面向对象
  • 原文地址:https://www.cnblogs.com/hqqxyy/p/3259461.html
Copyright © 2020-2023  润新知