您的位置:首页 > 运维架构

【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();  
}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: