【OpenCV2】MFC中用OPENCV如何将图片显示在指定位置
2015-06-22 21:09
357 查看
在opencv在开发过程中,我想最频繁的操作(之一)莫过于显示图片了。
学过OpenCV的同学都知道,调用cv::imshow()(或者C版本的ShowImage())可以轻而易举的将图片显示出来。
但是,它会创建一个不这么协调的对话框来显示这个图片,那么在MFC中我们如何让图片显示在指定的位置上呢?
先给个结果图(我使用的是VS2010+OpenCV2.4.8):
第一步:
创建一个基于MFC的基本对话框框架了、配置OpenCV环境
第二步:(如果是使用2.2版本以下的跳过)
我们要使用一个非常重要的类CVVImage(注意不是w,而是两个V),而该类定义在CVVImage定义在CvvImage.h文件上,不过OpenCV2.2以后的版本把它给抛弃了,所以为了能使用该类,我们找到包含该类的文件CvvImage.h和CvvImage.cpp将它们添加到你的工程里面(这就是开源的其中一个好处)
第三步:
在你的主对话框上面添加一个图片控件(Picture Control),然后可以修改图片的ID为IDC_SHOWIMAGE
第四步:
在工程目录下添加一张图片,命名为:test.jpg
第五步:
添加一个按钮,用来控制图片的显示,在按钮响应函数里面添加如下代码:
[cpp]
view plaincopyprint?
void CShowImageDlg::OnBnClickedButtonShow()
{
// TODO: 在此添加控件通知处理程序代码
cv::Mat image = cv::imread("test.jpg");
if (!image.empty())
{
showimage(image,IDC_SHOWIMAGE);
}
}
void CShowImageDlg::OnBnClickedButtonShow() { // TODO: 在此添加控件通知处理程序代码 cv::Mat image = cv::imread("test.jpg"); if (!image.empty()) { showimage(image,IDC_SHOWIMAGE); } }给对话框类添加showimage函数,函数实现如下(因为使用cv::Mat最终要转换为IplImage格式,所以这里只给出参数为cv::Mat 的函数):
[cpp]
view plaincopyprint?
/*================================================================
*
* 函数原型:void showimage(cv::Mat& image,int IDC);
*
* 参 数:cv::Mat &image -- 要显示的图像
* int IDC -- 显示图像的图像控件的ID
*
* 功能描述: 将图像显示在对应的图像控件上
*
*
* 返 回 值:无
*
* 抛出异常:无
*
* 作 者:黄凯焕
*
================================================================*/
void CShowImageDlg::showimage(cv::Mat& image,int IDC)
{
CDC* pDC=GetDlgItem(IDC)->GetDC(); //根据ID获得窗口指针再获取与该窗口关联的上下文指针
HDC hDC=pDC->GetSafeHdc(); // 获取设备上下文句柄
CRect rect;
GetDlgItem(IDC)->GetClientRect(&rect); //获取显示区
IplImage* img=&image.operator IplImage(); //将图像转换为IplImage格式,共用同一个内存(浅拷贝)
CvvImage iimg; //创建一个CvvImage对象
iimg.CopyOf(img);
iimg.DrawToHDC(hDC,&rect);
ReleaseDC( pDC );
iimg.Destroy();
}
相关文章推荐
- Tomcat本地启动后,在浏览器无法访问服务器
- C/S与B /S 结构的简介与比较
- Linux下获取帮助
- centos7服务安装_流媒体服务器_安装
- linux程序设计——使用C语言访问MySQL(第八章)
- 用eclipse 将maven项目打war包部署到tomcat
- 关于CentOS下 yum包下载下的rpm包放置路径
- php nginx fastdfs 下载文件重命名
- 对图像进行旋转、缩放等变换
- /var/log目录下的20个Linux日志文件功能详解
- Chapter 4 -- Operating System
- 读linux源码时遇到的问题
- rhel源更换为centos源
- 免费的在线源码控制网站介绍
- linux中gdb的使用方法
- hadoop之HBase集群搭建及使用
- linux中应用程序main函数中没有开辟进程的,它应该在那个进程中运行呢?
- Nexus设备渗透测试平台 – Kali Linux NetHunter
- linux 端口占用
- 给VMware下的Linux扩展磁盘空间(以CentOS7)