天天看點

知乎上有一個問題“在mfc架構中,有上面方法能直接将opencv2.0庫中的Mat格式圖檔傳遞到Picture Control”中顯示?

一直以來,我使用的方法都是shiqiyu在opencvchina上面提供的引入directshow,并且采用cvvimage和cameraDs的方法。這個方法雖然在xp/win7/win8下面都能夠成果使用,但是一直以來我都沒有動機去深入看一看這個方法。這次在知乎上面看到 jie wu 提出的“将Opencv視窗添加到PictureControl”中的方法,感到思路很好,進行了具體實作

http://pan.baidu.com/s/1nuixdhR

知乎上有一個問題“在mfc架構中,有上面方法能直接将opencv2.0庫中的Mat格式圖檔傳遞到Picture Control”中顯示?

具體可以看代碼,我帖一些主要代碼

void CMfcRibbonTemplateView::OnInitialUpdate()

{

CFormView::OnInitialUpdate();

GetParentFrame()->RecalcLayout();

ResizeParentToFit();

//根據控件的大小設定初始幀的大小

CRect rect;

GetDlgItem(IDC_PBSRC) ->GetClientRect( &rect ); // 擷取控件尺寸位置

m_lframe = Mat::zeros(rect.Height(),rect.Width(),CV_8UC3);

GetDlgItem(IDC_PBSRC) ->GetClientRect( &rect );

m_rframe = Mat::zeros(rect.Height(),rect.Width(),CV_8UC3);

//綁定Mat到Picturebox上去

namedWindow("src",WINDOW_AUTOSIZE);

HWND hWnd = (HWND)cvGetWindowHandle("src");

HWND hParnt = ::GetParent(hWnd);

::SetParent(hWnd,GetDlgItem(IDC_PBSRC)->m_hWnd);

::ShowWindow(hParnt,SW_HIDE);

namedWindow("dst",WINDOW_AUTOSIZE);

hWnd = (HWND)cvGetWindowHandle("dst");

hParnt = ::GetParent(hWnd);

::SetParent(hWnd,GetDlgItem(IDC_PBDEST)->m_hWnd);

}

void CMfcRibbonTemplateView::OnSize(UINT nType, int cx, int cy)

CFormView::OnSize(nType, cx, cy);

CWnd* pwndsrc = GetDlgItem(IDC_PBSRC);

CWnd* pwnddst = GetDlgItem(IDC_PBDEST);

//計算出長寬,這裡的長寬是按照比例的,圖像居中顯示

int iblank = 15; //邊界空餘

int iwidth = cx/2-iblank*2;

int iheight =(int)(iwidth*0.75);

if (pwndsrc->GetSafeHwnd() && pwnddst->GetSafeHwnd()){

pwndsrc->MoveWindow(iblank,(cy-iheight)*0.4,iwidth,iheight);

pwnddst->MoveWindow(cx/2+iblank,(cy-iheight)*0.4,iwidth,iheight);

}

void CMfcRibbonTemplateView::showimage(Mat& src, UINT ID)

if (src.empty())

return;

Mat dst = src.clone();

GetDlgItem(ID) ->GetClientRect( &rect ); // 擷取控件尺寸位置

if (dst.channels() == 1)

cvtColor(dst, dst, CV_GRAY2BGR);

resize(dst,dst,Size(rect.Width(),rect.Height()));

imshow("src",dst);

總體感到jie wu

提出的方法,對于解決比較簡單的問題,的确是不錯的(我記得halcon生成能夠被csharp調用的代碼的時候,好像采用的就是類似的方法)。但是它本身存在以下問題:

1、在窗體初始化的時候會有一個黑框彈出來,應該是nameWindow的效果;

2、在沒有圖檔的時候,會自動将Picturebox的背景繪制成為灰色,而且好像不好控制;

3、僅僅是imshow還不能完成全部的調用,比如控件的大小可能還會變化,那麼就需要用showimage重新進行封裝。

如果加上這些7788的東西,那麼最後調用起來,也是比較複雜的。

但是jie

wu的方法有一個天生的優點,就是可以調用high gui的callback機制,這個是非常強的東西,能夠省不少麻煩事情。

這裡隻是我粗淺的認識,若有不對之處,歡迎批評指正。

最後說一句,其實看了一些opencv自己的代碼,它裡面有很多地方就是iplimage和mat互相轉換的,很多使用mat接口的函數,隻不過是把以前的使用iplimage的函數重新包裝了一次。opencv畢竟是一個開源的類庫,還有很多地方需要大家一起做得更好。

 目前方向:圖像拼接融合、圖像識别

聯系方式:[email protected]

下一篇: logo上線

繼續閱讀