MFC 通过opencv 读取并显示图片

本文介绍在程序启动时直接在界面显示图片的多种方法,包括使用Mat和IplImage格式在PictureControl控件上显示图片的技术细节,并对比了不同方法的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想在打开程序后就在界面上显示图片,网页上的很多都是在打开按钮后才可显示图片  但放在OnInitDialog() 函数中则不显示了,发现必须放在onPaint()函数下方可显示,下面就提供两种方法:

首先需要添加头文件:

#include <opencv2/opencv.hpp>
#include "CvvImage.h"
#include"cv.h"
#include"highgui.h"
using namespace cv;


1、采用mat格式在picture control控件上显示图片

在.h文件中添加函数:

void DrawImg2HDCC(Mat img, UINT ID);

在.cpp文件中的onPaint()函数中添加:

     else
  {
CDialogEx::OnPaint();
Mat img=imread("background_company.png");//添加
DrawImg2HDCC(img,IDC_PICTURE);//添加

}

void CopencvDlg::DrawImg2HDCC(Mat img, UINT ID)
{
IplImage* draw_img = NULL;
if (draw_img)
{
cvReleaseImage(&draw_img);
}
IplImage iplimg = img;
draw_img = &iplimg;    //引用新建立的图像
CDC *pDc = GetDlgItem(ID)->GetDC();
HDC hDC = pDc->GetSafeHdc();  //获取显示控件的设备句柄
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);  //获取图像的显示区域
CvvImage cvvimg;
cvvimg.CopyOf(draw_img);
cvvimg.DrawToHDC(hDC, &rect);
ReleaseDC(pDc);
}

这种方法可显示图片

2、采用IplImage格式在picture control控件中显示图片

在.h文件中添加函数:

void DrawPicToHDC(IplImage *img,UINT ID);

在.cpp函数中的onPaint()函数中添加:

else
{
CDialogEx::OnPaint();
Mat img=imread("background_company.png");
DrawImg2HDCC(img,IDC_PICTURE);
image=NULL; //原始图像
if(image) cvReleaseImage(&image);
//image = cvLoadImage("nihao.png",1); //显示图片
image = cvLoadImage("background_company.png",1); //显示图片
DrawPicToHDC(image, IDC_PICTURE);
}

定义函数:void CopencvDlg::DrawPicToHDC(IplImage *img,UINT ID)
{
CDC *pDC = GetDlgItem(ID)->GetDC();
HDC hDC= pDC->GetSafeHdc();
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
CvvImage cimg;
cimg.CopyOf( img ); // 复制图片
cimg.DrawToHDC( hDC, &rect ); // 将图片绘制到显示控件的指定区域内
ReleaseDC( pDC );
}

即可完成图片的显示

总结:该两种方法均可在运行程序后直接显示图片  也可将onPaint()中添加的函数放入button函数下,即可完成点击Button后显示图片的效果


还有一种方法就是在OnInitDialog()函数中添加代码,但该方法的缺点是运行程序后,界面会闪烁一下,代码如下:

在.h文件中添加:

Mat m_frame;
void DrawImg2HDCC(Mat img, UINT ID);

在.cpp的OnInitDialog()中添加:

CRect rect;
GetDlgItem(IDC_PICTURE)->GetClientRect(&rect); // 获取控件尺寸位置
m_frame = 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_PICTURE)->m_hWnd);
::ShowWindow(hParnt, SW_HIDE);
Mat m_img=imread("../Debug/background_company.png");
    DrawImg2HDCC(m_img, IDC_PICTURE);


void CopencvDlg::DrawImg2HDCC(Mat img, UINT ID)
{ CRect rect;
Mat dst = img.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);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值