MFC显示Mat图片
Opencv在1.0时代,在MFC框架上显示图片可以通过Cvvimage类里的DrawPicToHDC(
 IplImage *img, UINT ID)方法方便的显示出来,当然当时使用的还是IpIImage图片格式,到了Opencv2.0,不知道基于什么考虑,Cvvimage类被舍弃了,也行是OpenCV小组各位大神觉得MFC命不久矣?……不得而知。
这就导致在MFC上显示图片的这个小小的需求变的复杂起来:首先我们需要将1.0版本的CvvImage.h和CvvImage.cpp
放入我们的程序目录,再把Mat经过格式处理后转为IpIImage,最后才能使用DraPicToDC方法传递图像给Picture
 Control控件,显示完之后,还需要再由IpIImage转回Mat后续处理……
幸运的是,办法总比困难多,各种剑走偏锋的大牛散落在网络的各个角落里,等待我们去发现,最近看到知乎网友jie
 wu”对这一问题不走寻常路的解决办法,贴出来瞻仰一二:
namedWindow("view", WINDOW_AUTOSIZE);
HWND hWnd = (HWND) cvGetWindowHandle("view");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_STATIC_CV)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
链接在此:点击打开链接
方法很简单,但是思路很讨巧,这个方法不是考虑如何添加图片到MFC中,而是把Opencv的窗口添加到MFC中,这样我们对窗口中图像的操作就原原本本呈现在MFC中了。
先来看一下运行效果图:
以下是Key code:
1. 在OnInitDialog初始化函数里添加代码
        namedWindow("view",WINDOW_AUTOSIZE);
	HWND hWnd = (HWND) cvGetWindowHandle("view");
	HWND hParent = ::GetParent(hWnd);
	::SetParent(hWnd, GetDlgItem(IDC_STATIC_Pic)->m_hWnd);
	::ShowWindow(hParent, SW_HIDE);
其中IDC_STATIC_Pic是Picture Control图形控件的ID;
2. 定义打开图片按钮事件
        CString picPath;   //定义图片路径变量
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
		NULL, this);   //选择文件对话框
	if(dlg.DoModal() == IDOK)
	{
		picPath= dlg.GetPathName();  //获取图片路径
	}
	//CString to string  使用这个方法记得字符集选用“使用多字节字符”,不然会报错
	string picpath=picPath.GetBuffer(0);  
	Mat image=imread(picpath);
	Mat imagedst;
	//以下操作获取图形控件尺寸并以此改变图片尺寸
	CRect rect;
	GetDlgItem(IDC_STATIC_Pic)->GetClientRect(&rect);
	Rect dst(rect.left,rect.top,rect.right,rect.bottom);
	resize(image,imagedst,cv::Size(rect.Width(),rect.Height()));
	imshow("view",imagedst);	
适应图形控件的显示效果:
注: Picture Control控件类型不需要必须是矩形(Rectangle),使用默认的类型帧(Frame)也可以正常显示。
MFC显示Mat图片的更多相关文章
- mfc显示静态图片最简单的方法
		
一致都是研究如何调用opencv显示动态图片,但是很多时候在显示图标的时候,都是需要显示静态图片,现在将最简单的方法总结下: 1.添加picture控件 2.添加资源,要求为bmp 3.修改属性 结果 ...
 - MFC 显示CImg图片
		
很多示例关于CImg都是基于控制台的,如何把它用于MFC中显示. Problem:直接按照控制台示例写入MFC程序中,当程序执行完display后,其后面的代码便不再执行. solution:开辟新的 ...
 - 在mfc中picture控件中显示Mat图片<转>
		
void ShowMatImgToWnd(CWnd* pWnd, cv::Mat img) { if(img.empty()) return; CRect drect; pWnd->GetCli ...
 - MFC显示bmp图像
		
有了bmp文件读写的基础,我们就能够開始用MFC显示BMP图片了. 在这里,事实上微软为我们提供了一个实现bmp文件显示的框架,名叫diblook,我们能够先下载下来看看. 以下上链接:DIBLOOK ...
 - MFC&Halcon之图片显示
		
上一篇介绍了MFC调用Halcon功能的简单例子,在这个例子中,点击按钮会弹出一个窗口显示图片,但是这样显示并不美观,而且...于是我决定把显示窗口做在MFC的窗体内部. 具体的方案是:使用一个Pic ...
 - MFC对话框显示BMP图片
		
1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...
 - MFC显示GIF动画图片
		
本帖则将讨论如何在MFC的对话框里显示GIF动画图片.一些关于传统控件的美化方法正在研究当中会陆续发帖的. 这是本帖用到的一个VS2008例程. 附件 GifPicture.rar (138.1 ...
 - 嵌入式linux------SDL移植(am335x下显示bmp图片)
		
#include<stdio.h> #include "/usr/local/ffmpeg_arm/include/SDL/SDL.h" char *bmp_name[ ...
 - 关于如何显示Jianshu图片的方案
		
问题的提出 简书是一个很好的博客网站,很多朋友都在jianshu上进行创作.当然出于各种目的,我们可能想将简书的文章同步到其他网站. 这个时候你会发现所有的文章里面的图片都无法正常显示了. 原因 如果 ...
 
随机推荐
- Linux,以逗号为分隔符,打印文件file.txt中的第一个和第三个字符
			
https://zhidao.baidu.com/question/1883257355267391828.html
 - JS实现限行
			
一.JS代码实现 1. 机动车辆限行如下图所示: 具体详情请访问:http://www.bjjtgl.gov.cn/zhuanti/10weihao/index.html 2.JS代码实现 <! ...
 - java基础 6 基本类型与运算
			
1 包装类型 Integer的缓存池为 -128 - 127: 八个基本类型 占bit 与字节 8 bit = 1 字节 boolean 1 byte 8 char ...
 - 【面试  spring】【第七篇】spring的问题
			
1.spring你熟悉么?两大特色 spring 主要有IOC和AOP两大特色. =========================================================== ...
 - Go --  RPC 之 Thrift
			
Thrift 简介: Thrift 是一款高性能.开源的 RPC 框架,产自 Facebook 后贡献给了 Apache,Thrift 囊括了整个 RPC 的上下游体系,自带序列化编译工具,因为 Th ...
 - 辅助方法 @Html.Raw与 HtmlString区别
			
//Html.Raw其实是调用 new Microsoft.AspNetCore.Html.HtmlString(xxx) @{ ViewData["Title"] = " ...
 - BeagleBone Black Industrial 杂谈
			
前言 原创文章,转载引用务必注明链接.水平有限一己拙见,欢迎指正. 本文使用markdown写成,为获得更好的阅读体验,推荐访问我的博客原文:  初版BeagleBone Black(Rev A4) ...
 - shell mysql 直接创建表
			
shell 直接创建表 #!/bin/bash mysql -hdatabases -uroot -p^xxxxasdasdadd <<EOF Create Database If Not ...
 - C# - CLR
			
 The Common Language Runtime (CLR), the virtual-machine component of Microsoft's .NET framework, m ...
 - 封装算法: 模板方法(Template Method)模式
			
template method(模板方法)模式是一种行为型设计模式.它在一个方法中定义了算法的骨架(这种方法被称为template method.模板方法),并将算法的详细步骤放到子类中去实现.tem ...