久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

利用MFC中的picture control 控件顯示圖像 opencv

 just4peterpan 2018-08-20

參考博文

    http://blog.sina.com.cn/s/blog_4d8730df0100mpzj.html

   http://blog.csdn.net/chenyusiyuan/article/details/4744097

本文是根據(jù)opencv246和VS2012在用MFC做圖像顯示時(shí)出現(xiàn)的問題做出解釋

一,、創(chuàng)建MFC
首先創(chuàng)建一個(gè)MFC對話框應(yīng)用程序(Dialog-based Application;
點(diǎn)擊OK -- Next進(jìn)入下一步,,在這里我們創(chuàng)建一個(gè)Dialog-based Application,大部分選項(xiàng)按默認(rèn)設(shè)置就行,,不過最下面的“Use Unicode libraries”最好去掉,。如果勾選了這

個(gè)選項(xiàng),程序代碼就會使用16bitUnicode字符集來編碼,,但是很多函數(shù)雖然使用 char* (ASCII stings) 類型字符,,而將字符串從 Unicode 轉(zhuǎn)換到 ASCII 是非常麻煩的。使用 Unicode 在編譯時(shí)可能會遇到下列錯(cuò)誤:
    cannot convert parameter 1 from 'CString' to 'const char *'
    cannot convert from 'const char [11]' to 'LPCWSTR'這意味著在UnicodeMulti-byte字符串的轉(zhuǎn)換中出現(xiàn)了問題,。故這里的去掉“Use Unicode libraries”選項(xiàng),。

二、編寫代碼

打開工程文件,,進(jìn)入資源視圖:LoadPicture(工程名稱)->LoadPicture.rc->Dialog雙擊IDD_LoadPicture_DIALOG,,可以看到一個(gè)初始的GUI界面,往里面添加兩個(gè) Button 和 一個(gè) Picture 控件

選中單個(gè)控件,、右擊選擇屬性(Properties),,可以看到控件的ID號,這個(gè)號可以自行編輯,,例如 Picture 控件的 ID 號我設(shè)置為 IDC_ShowImg,,這個(gè) ID 號在后面的圖像顯示函數(shù)中要用到。

OpenCV庫加入到VS中,沒有配置會出錯(cuò)opencv246+VS2012的配置課參考本博文——VS2012配置OPENCV246

然后在 LoadPicture.h 的 #include "resource.h" 代碼行下面加入如下代碼:

#include <opencv\cv.h>

#include <opencv\highgui.h>

#define IMAGE_WIDTH 256

#define IMAGE_HEIGHT 256

#define IMAGE_CHANNELS 3

在 類視圖面板右擊 CloadPictureDlg,,選擇 Add > Add Variable,,添加一個(gè) IplImage* 類型的變量 TheImage

 



再點(diǎn)擊 CLoadPictureDlg,,在下面窗口的列表中雙擊 OnInitDialog,,在// TODO: 在此添加額外的初始化代碼下面添加 TheImage 的初始化代碼:

 

CvSize ImgSize;    

ImgSize.height = IMAGE_HEIGHT;    

ImgSize.width = IMAGE_WIDTH;    

TheImage=cvCreateImage( ImgSize, IPL_DEPTH_8U, IMAGE_CHANNELS );

然后雙擊 OnPaint,在 if(IsIconic())…的 else 里添加以下代碼,,用來重繪窗口:

CDialog::OnPaint();   // 重繪對話框        

CDialog::UpdateWindow();   // 更新windows窗口,,如果無這步調(diào)用,圖片顯示還會出現(xiàn)問題        

ShowImage( TheImage, IDC_ShowImg );     // 重繪圖片函數(shù)

接著在 CtestPicControlApp 下面的成員列表中雙擊 InitInstance,,在兩個(gè)“// TODO: Place code here to handle when the dialog is…”下面添加:
cvReleaseImage( &dlg.TheImage );

即按下“OK”或“Cancel”時(shí),,釋放TheImage占用的內(nèi)存。

 

寫讀取和處理圖片的功能函數(shù),。

回到資源視圖,,雙擊按鈕 ReadImage,,,建立按鈕點(diǎn)擊的消息響應(yīng)程序:OnBnClickedReadimage,主要的響應(yīng)操作包括 彈出對話框選擇圖片文件,、讀入圖片文件、對圖片統(tǒng)一縮放至256*256的大小,、顯示圖像,,代碼如下:

  1. // TODO: 在此添加控件通知處理程序代碼  
  2.         CFileDialog dlg(  
  3.                 TRUE, _T("*.bmp"), NULL,  
  4.                 OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,  
  5.                 _T("image files (*.bmp; *.jpg) |*.bmp; *.jpg | All Files (*.*) |*.*||"), NULL  
  6.                 );                                                                              // 選項(xiàng)圖片的約定  
  7.         dlg.m_ofn.lpstrTitle = _T("Open Image");         // 打開文件對話框的標(biāo)題名  
  8.         if(dlg.DoModal()!=IDOK )      // 判斷是否獲得圖片  
  9.                 return;  
  10.   
  11.         CString mPath = dlg.GetPathName();   // 獲取圖片路徑  
  12.   
  13.         IplImage* ipl = cvLoadImage( mPath, 1 );   // 讀取圖片、緩存到一個(gè)局部變量 ipl 中  
  14.         if(!ipl)                                                                       // 判斷是否成功讀取圖片  
  15.                 return;  
  16.         if(TheImage)                                                           // 對上一幅顯示的圖片數(shù)據(jù)清零  
  17.                 cvZero( TheImage );  
  18.         ResizeImage( ipl );      // 對讀入的圖片進(jìn)行縮放,,使其寬或高最大值者剛好等于 256,再復(fù)制到 TheImage 中  
  19.         ShowImage( TheImage, IDC_ShowImg);                     // 調(diào)用顯示圖片函數(shù)       
  20.         cvReleaseImage(&ipl);                                          // 釋放 ipl 占用的內(nèi)存  

在上面的代碼中包含了兩個(gè)新的成員函數(shù) ResizeImage 和 ShowImage,,前者的作用是對讀入的不同大小的圖像進(jìn)行縮放,,再通過設(shè)置 ROI 的方式將圖像存入 256*256 的 TheImage 中;后者是將圖像 TheImage 顯示到圖片顯示控件 IDC_ShouImg 窗口的正中部位,。為了實(shí)現(xiàn)這兩個(gè)功能,,首先在類視圖 面板右擊 CtestPicControlDlg,選擇 Add > Add Function,,創(chuàng)建兩個(gè)函數(shù):void ShowImage( IplImage* img, UINT ID ) 和 void ResizeImage(IplImage* img),。以下是這兩個(gè)函數(shù)的實(shí)現(xiàn)代碼:

函數(shù)添加如下


  1. void CLoadPicControlDlg::ShowImage(IplImage* img, UINT ID)// ID 是Picture Control控件的ID號  
  2. {  
  3.         CDC* pDC=GetDlgItem(ID)->GetDC();// 獲得顯示控件的 DC  
  4.         HDC hDC=pDC->GetSafeHdc();// 獲取 HDC(設(shè)備句柄) 來進(jìn)行繪圖操作  
  5.   
  6.         CRect rect;  
  7.         GetDlgItem(ID)->GetClientRect(&rect);  
  8.         int rw=rect.right-rect.left;    // 求出picture control的寬和高  
  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.   
  16.         CvvImage cimg;  
  17.         cimg.CopyOf(img);    // 復(fù)制圖片  
  18.         cimg.DrawToHDC(hDC,&rect);  
  19.   
  20.         ReleaseDC(pDC);  
  21. }  

  1. void CtestPicControlDlg::ResizeImage(IplImage* img)  
  2. {  
  3.         // 讀取圖片的寬和高  
  4.         int w = img->width;  
  5.         int h = img->height;  
  6.   
  7.         // 找出寬和高中的較大值者  
  8.         int max = (w > h)? w: h;  
  9.   
  10.         // 計(jì)算將圖片縮放到TheImage區(qū)域所需的比例因子  
  11.         float scale = (float) ( (float) max / 256.0f );  
  12.   
  13.         // 縮放后圖片的寬和高  
  14.         int nw = (int)( w/scale );  
  15.         int nh = (int)( h/scale );  
  16.   
  17.         // 為了將縮放后的圖片存入 TheImage 的正中部位,需計(jì)算圖片在 TheImage 左上角的期望坐標(biāo)值  
  18.         int tlx = (nw > nh)? 0: (int)(256-nw)/2;  
  19.         int tly = (nw > nh)? (int)(256-nh)/2: 0;  
  20.   
  21.         // 設(shè)置 TheImage 的 ROI 區(qū)域,,用來存入圖片 img  
  22.         cvSetImageROI( TheImage, cvRect( tlx, tly, nw, nh) );  
  23.   
  24.         // 對圖片 img 進(jìn)行縮放,,并存入到 TheImage 中  
  25.         cvResize( img, TheImage );  
  26.   
  27.         // 重置 TheImage 的 ROI 準(zhǔn)備讀入下一幅圖片  
  28.         cvResetImageROI( TheImage );  
  29. }  

 

注意

1:如果你的CvvImage出現(xiàn)紅色的底線提示沒有定義那說明你的opencv版本是比較新的里面的CvvImage函數(shù)已經(jīng)被去掉了,我的opencv246就沒有這個(gè)函數(shù),。只要在工程中加入CvvImage.hCvvImage.cpp就可以了,。關(guān)于這兩個(gè)文件見本博客http://blog.csdn.net/lxy201700/article/details/16921715

2:如果你編譯后出現(xiàn)error C4996: 'fopen': This function or variable may be unsafe.的錯(cuò)誤提示說明的vs版本比較新,在VS2008中只是個(gè)warning,我的是VS2012的出現(xiàn)錯(cuò)誤文件生成失敗,。關(guān)于這個(gè)問題的解決見本博客http://blog.csdn.net/lxy201700/article/details/16921629





原文地址:http://blog.csdn.net/lxy201700/article/details/16921903

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多