知乎上有一个问题“在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毕竟是一个开源的类库,还有很多地方需要大家一起做得更好。

时间: 2024-10-01 02:44:24

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

VS2010/MFC常用控件:图片控件Picture Control

图片控件Picture Control 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到的静态文本框都是静态文本控件,因此两者的使用方法有很多相同之处,所属类都是CStatic类,有关成员函数已在前面介绍,这里就不重复了. 图片控件静态和动态加载图片 鸡啄米下面为大家演示如何为图片控件静态和动态加载位图图片. 1. 图片控件静态加载图片 1)创建一个基于对话框的MFC工程,名称设置为“

如何在阿里云上构建一个合适的Kubernetes集群

摘要: 声明 本文主要介绍如何在阿里云上构建一个K8S集群的实践,只是作为参考,大家可以根据实际情况做出调整. 集群规划 在实际案例中发现,有不少同学使用了很多的小规格的ECS来构建K8S集群,这样其实即没有达到省钱的目的,也没有很好的发挥K8S集群的优势. 声明 本文主要介绍如何在阿里云上构建一个K8S集群的实践,只是作为参考,大家可以根据实际情况做出调整. 集群规划 在实际案例中发现,有不少同学使用了很多的小规格的ECS来构建K8S集群,这样其实即没有达到省钱的目的,也没有很好的发挥K8S集

对话框上动态控件的创建、在Picture Control控件上显示图片

1  MFC对话框之上的动态控件的创建 对话框上的控件是MFC类的一个具体对象. 当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息.响应函数以及变量. 当需要在对话框中动态的创建某个控件时,就需要手动来代替类向导为动态控件添加消息.响应函数及变量. 动态创建控件时,可按照以下步骤进行: (1) 明确控件所属于的类 每一个控件都对应着一个类(例如按钮Button所属于的类为CButton). 如,在程序中我们需要用CButton类创建一个具体的按钮对象,并用函数指示它在对话框之上的

介绍MFC框架中涉及到的设计模式(二)

接着上一篇<介绍MFC框架中涉及到的设计模式(一)>介绍 单例模式(Singleton Pattern) 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 单例模式的要点有三个: 1.某个类只能有一个实例: 2.它必须自行创建这个实例: 3.它必须自行向整个系统提供这个实例. 单例模式典

1024某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。 由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点

#include<stdio.h> int main() { int L, M, i, j, n; int a[10001], b[10001]; scanf("%d %d",&L, &M); //输入L和M n = M*2;//循环输入b数组0~n的数据 for(i=0; i<n; i+=2)   { scanf("%d %d", &b[i], &b[i+1]); }   for(i=0; i<=L; i++

为什么知乎上很多人都反对创业?(上战场的士兵如果先拿枪打打靶练练枪法,研究研究战术之后,战损比肯定要更好看一点)

为什么知乎上很多人都反对创业? 经常看到一些排名靠前的答案,内容无非规劝他人不要创业,要脚踏实地,认为党和国家大众创业万众创新的政策方针都是胡扯?难道知乎上的知识分子们竟比国家的智囊更有远见?还是他们的认识层次达不到? 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:唐缺链接:https://www.zhihu.com/question/37559307/answer/72755062来源:知乎 -------------------------------------

程序员超浓鸡汤,知乎上赞同数最高的999个回答

原文出处 http://lanbing510.info/2016/04/14/ZhiHu-Good-Answers.html#title0 最近发现这个文章,真的是非常适合程序员看的鸡汤文列表,超强浓缩版的!!! 1哪些素质很重要,却是读书学不来的?101501肥肥猫 2有哪些很重要又被忽视的炒菜技巧?85658庄力 3想要充实自己,有哪 10 本书和 10 部电影值得推荐?77738Jee Xin 4要怎样努力,才能成为很厉害的人?76144朱炫 5如何看待「医生拒绝给艾滋病人做手术」?748

如果你喜欢上了一个程序员小伙

程序员向来是善于幽默自嘲的群体,但从某种程度上影响了咱程序员在广大女同胞心中的印象啊-- 于是写下此篇(有从别处看到的3句加进来的), 就算是为咱程序员做个广告--要是觉得有点过的程序员们,就把此文当作一个美好的目标吧---) ---------------------------------------------- 如果你喜欢上了一个程序员小伙,就不用再害怕电脑中病毒QQ被盗,因为他至少尝试过10款以上杀毒软件,他知道用那款占资源最少防毒效果最好的保护你的电脑. 如果你喜欢上了一个程序员小伙

一个重绘MFC的文件传输客户端

 一个重绘MFC的文件传输客户端,TCP/IP协议的文件传输客户端(支持上传.下载.续传.管理等功能,本处只选择了上传功能),从用户视觉上看,肯定比原生MFC界面要有感觉,啥也不说了,直接上图. 这个客户端界面,是从过浏览器通过ActiveX控件机制激活的,并且把文件传输任务传递给客户端的. (初始界面) (配置窗口) (锁屏对话框) (传输设置,还有很多配置,本次被省略了) (正在上传,右键菜单灵活多变) (上传完成) (回收站) 一个重绘MFC的文件传输客户端,布布扣,bubuko.co