想在打开程序后就在界面上显示图片,网页上的很多都是在打开按钮后才可显示图片 但放在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);
}