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 }
效果还是很不错的