知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?

一直以来,我使用的方法都是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毕竟是一个开源的类库,还有很多地方需要大家一起做得更好。
 
目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/649576

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。