MFC學習篇(一):用OpenCV顯示視頻

首先是一些基礎的步驟,如創建MFC應用,添加按鈕等,博主主要參考了下面這篇文章,其中的前32步都是用OpenCV顯示圖片和視頻所必須的,即通用的。因爲LZ原來有配置OpenCV的基礎,因此配製仍是比較快的。這裏須要說明的是CvvImage.h和CvvImage.cpp文件在OpenCV2.2後就已經從OpenCV中移除了,可是咱們仍是有解決的辦法的,就是新建一個CvvImage.h和CvvImage.cpp文件,將網上找的代碼貼進去就好了,博主就搜了一個,固然大家也能夠直接從將CvvImage.h和CvvImage.cpp下載下來,加進目錄裏去。html

而後就是顯示視頻了,博主主要參考了下這篇文章,若是同窗們想仔細的搞清楚MFC的控件的原理和使用,如OnTimer()什麼的,博主推薦雞啄米的博客,博主看完以後感受獲益匪淺啊。函數

博主在上述的基礎上稍稍作了下改動,使顯示的視頻能自動調整大小以適應控件,代碼以下spa

 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 }

以及顯示圖像的函數.net

 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 }

效果仍是很不錯的code

相關文章
相關標籤/搜索