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 }

效果还是很不错的

posted on 2013-08-15 13:00  hqqxyy  阅读(3333)  评论(0编辑  收藏  举报