博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?...
阅读量:6257 次
发布时间:2019-06-22

本文共 2364 字,大约阅读时间需要 7 分钟。

一直以来,我使用的方法都是shiqiyu在opencvchina上面提供的引入directshow,并且采用cvvimage和cameraDs的方法。这个方法虽然在xp/win7/win8下面都能够成果使用,但是一直以来我都没有动机去深入看一看这个方法。这次在知乎上面看到 jie wu 提出的“将Opencv窗口添加到PictureControl”中的方法,感到思路很好,进行了具体实现

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

具体可以看代码,我帖一些主要代码
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);
:
:ShowWindow(hParnt,SW_HIDE);
}
 
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;
CRect rect;
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毕竟是一个开源的类库,还有很多地方需要大家一起做得更好。
 

转载地址:http://lltsa.baihongyu.com/

你可能感兴趣的文章
Cocos2d-x之MenuItem
查看>>
Esper学习之六:EPL语法(二)
查看>>
流和文件
查看>>
iOS:UIMapView地图视图控件的简单使用
查看>>
关于Python的3张图
查看>>
作IFRAME于iOS您的设备上支持滚动
查看>>
后台数据库优化——板机
查看>>
C++ redirect input
查看>>
linux_sound_alsa_Android+alsa音频系统中的几个问题
查看>>
IOS Core Image之二
查看>>
python---__getattr__\__setattr_重载'.'操作
查看>>
VMware克隆虚拟机后网络不能正常使用的解决方法
查看>>
android平台TextView使用ImageSpan画廊GIF图像
查看>>
Android开发之ListView-SimpleAdapter的使用
查看>>
App.config提示错误“配置系统未能初始化”
查看>>
Angular - - ngChange、ngChecked、ngClick、ngDblclick
查看>>
JAVA学习第五十九课 — 网络编程概述
查看>>
远程共享文件夹
查看>>
convert2utf8withbom
查看>>
Codeforces Round #336 (Div. 2)A. Saitama Destroys Hotel 水题
查看>>