一直以來,我使用的方法都是shiqiyu在opencvchina上面提供的引入directshow,并且采用cvvimage和cameraDs的方法。這個方法雖然在xp/win7/win8下面都能夠成果使用,但是一直以來我都沒有動機去深入看一看這個方法。這次在知乎上面看到 jie wu 提出的“将Opencv視窗添加到PictureControl”中的方法,感到思路很好,進行了具體實作
http://pan.baidu.com/s/1nuixdhR
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQGZkFWY0UGO2cTZwEjN1kTMjFmY1cTM1YjMzYTM0EWOfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
具體可以看代碼,我帖一些主要代碼
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]