天天看点

知乎上有一个问题“在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上线

继续阅读