MFC中如何在一个picture 控件中显示一张opencv读入的图片?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中如何在一个picture 控件中显示一张opencv读入的图片?相关的知识,希望对你有一定的参考价值。

我设置了一个按钮时触发读入图片然后在picture控件中显示,代码如下:
void CVideoThreadDlg::OnBnClickedButton1()

IplImage* img_src = cvLoadImage("img4.jpg",CV_LOAD_IMAGE_GRAYSCALE);
ShowImage(img_src, IDC_STATIC_PIC);

在控件中显示图像的函数:
void CVideoThreadDlg::ShowImage(IplImage *img,UINT ID)

CDC* pDC=GetDlgItem(ID)->GetDC();
HDC hDC=pDC->GetSafeHdc();
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
SetRect(rect,rect.left,rect.top,rect.right,rect.bottom);
CvvImage cimg;
cimg.CopyOf(img);
cimg.DrawToHDC(hDC,&rect);
/*ReleaseDC(pDC); */

这样写控件中不显示img_src指针指向的图像。
将BUTTON1 的函数改成如下:
void CVideoThreadDlg::OnBnClickedButton1()

CString m_strPicPath;
IplImage* TheImage;
CFileDialog dlg(true,_T("img4.JPG"),NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,_T("image file(*.bmp;*.jpg)|*.bmp;*.jpg|All Files(*.*)|*.*|"),NULL);//弹出选择图片对话框
dlg.m_ofn.lpstrTitle=_T("open Image");
if(dlg.DoModal()!=IDOK)

return ;

m_strPicPath = dlg.GetPathName();
m_strPicPath.Replace(_T("//"),_T("////"));
TheImage=cvLoadImage((CT2CA)m_strPicPath,1);
ShowImage(TheImage, IDC_STATIC_PIC);

即手动添加图片文件,就能在控件中显示图片了。。这是为什么,我需要的是上一种的显示图像的方法,不要手动添加的。求大神帮忙改一下。

如果下面能正确显示,上面的逻辑是正确的,我觉得应该是
IplImage* img_src = cvLoadImage("img4.jpg",CV_LOAD_IMAGE_GRAYSCALE);这里失败了;图片路径用绝对路径试试;或者获取一下程序所以目录,再加上文件名;
参考技术A VC6新建MFC(.exe)基于对话框工程Test,添加一个picture控件(改资源号为IDC_STATIC_PIC)和一个按钮,具体实现如下程序。 核心的实现代码如下 // 用于在控件 ID上显示图片 imgvoid CTestDlg::DrawPicToHDC(IplImage *img, 参考技术B 以前学opencv是时用过picture显示图片,代码十几行 不怎么美观,最后我发现opencv里只有一个函数带Hdc,好像是DrawToHDC()既然出现了HDC我想在mfc里绘图就不用说了。如果你没用CvvImage类,那么声明一个CvvImage对象CopyOf一下再DrawToHDC到mfc的任何地方都可以。
CvvImage::CopyOf
CvvImage::DrawToHDC;,
参考技术C 以前学opencv是时用过picture显示图片,代码十几行 不怎么美观,最后我发现opencv里只有一个函数带Hdc,好像是DrawToHDC()既然出现了HDC我想在mfc里绘图就不用说了。如果你没用CvvImage类,那么声明一个CvvImage对象CopyOf一下再DrawToHDC到mfc的任何地方都可以。
CvvImage::CopyOf
CvvImage::DrawToHDC;,

VS2010-MFC(常用控件:图片控件Picture Control)

 

转自:http://www.jizhuomi.com/software/193.html

 

本节主要讲一种简单实用的控件,图片控件Picture Control。我们可以在界面某个位置放入图片控件,显示图片以美化界面。

 

       图片控件简介

       图片控件和前面讲到的静态文本框都是静态文本控件,因此两者的使用方法有很多相同之处,所属类都是CStatic类,有关成员函数已在前面介绍,这里就不重复了。

 

       图片控件静态和动态加载图片

       下面为大家演示如何为图片控件静态和动态加载位图图片。

 

       1. 图片控件静态加载图片

       1)创建一个基于对话框的MFC工程,名称设置为“Example27”。

       2)准备一张Bitmap图片,名称设为“test.bmp”,放到工程的res文件夹中,res文件夹路径为...Example27Example27 es。这里用一张全黑图片。

       3)在Resource View中的“Example27.rc*”节点上点右键,选择“Add Resource...”,弹出“Add Resource”对话框:

 技术分享图片

技术分享图片

 

       然后在左侧的“Resource Type”中选择“Bitmap”,点按钮“Import”,显示一个文件对话框,我们选择res文件夹中的test.bmp图片文件,导入成功后会在Resource View的Example27.rc*节点下出现一个新的子节点“Bitmap”,而在“Bitmap”节点下可以看到刚添加的位图资源IDB_BITMAP1,这里的默认ID就不修改了。

 

       4.)在自动生成的对话框模板IDD_EXAMPLE27_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个Picture Control控件,在图片控件的属性页中有一个Type属性,Type属性下拉列表中有8种类型,下面分别介绍下:

       Frame:显示一个无填充的矩形框,边框颜色可以通过Color属性的下拉列表设定

       Etched Horz:显示一条横分割线

       Etched Vert:显示一条竖分割线

       Rectangle:显示一个填充的矩形框,矩形颜色可通过Color属性的下拉列表设定

       Icon:显示一个图标(Icon),图标通过Image 下拉列表来设置图标资源ID

       Bitmap:显示一个位图(Bitmap),位图通过Image 下拉列表来设置位图资源ID

       Enhanced Metafile:显示一个加强的元数据文件(Metafile)

       Owner Draw:自绘

       因为我们要加载的是位图图片,所以Type属性选择Bitmap。

 

       5)在图片控件的Image属性的下拉列表中选择3)中导入的位图IDB_BITMAP1。

技术分享图片

       6)编译运行程序,弹出结果对话框,如下图所示:

技术分享图片

 

 

 

        2. 图片控件动态加载图片

        以上讲的是静态加载图片的方法,下面接着讲动态加载图片的方法。程序依然沿用上面的工程。步骤如下:

        1)将上面添加的图片控件的Image属性IDB_BITMAP1清空,Type属性不变。

        2)修改图片控件的ID为IDC_JIZHUOMI_STATIC,然后为其添加CStatic类型控件变量m_jzmPicture。(若不修改ID则无法为其添加控件变量

        3)在对话框下方添加一按钮控件,Caption属性改为“加载图片”,ID设为IDC_LOAD_PIC_BUTTON。

        4)为按钮IDC_LOAD_PIC_BUTTON添加点击消息的处理函数CExample27Dlg::OnBnClickedLoadPicButton(),然后修改此函数的函数实现如下:

C++代码
void CExample27Dlg::OnBnClickedLoadPicButton()   
{   
    // TODO: Add your control notification handler code here   
    CBitmap bitmap;  // CBitmap对象,用于加载位图   
    HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄   
  
    bitmap.LoadBitmap(IDB_BITMAP1);  // 将位图IDB_BITMAP1加载到bitmap   
    hBmp = (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄   
    m_jzmPicture.SetBitmap(hBmp);    // 设置图片控件m_jzmPicture的位图图片为IDB_BITMAP1   
}  

 

 

        5)编译运行程序,弹出结果对话框,点击按钮“加载图片”,结果如下:

技术分享图片

技术分享图片

 

 

       图片控件Picture Control的内容就讲到这里了。应该说还是比较简单的。

 

以上是关于MFC中如何在一个picture 控件中显示一张opencv读入的图片?的主要内容,如果未能解决你的问题,请参考以下文章

在MFC中,如何读取外部的位图文件,让它显示在图片控件(Picture Control)中?

MFC 刷新失效的Picture控件

mfc里给picture控件加载一张位图,然后在位图上画一条线,该怎么做

[ MFC ] 对话框动态控件的创建 在Picture Control控件上显示图片 [大三TJB_708]

MFC如何用一button控件选择一幅bmp图片并在picture控件上显示?

MFC中通过Picture control控件显示选中的图片