vs2017联合opencv显示图像

创建按钮,为按钮添加点击事件,点击按钮后会弹出文件选择框。选择图像所在文件进行显示:

第一种方法:

void Ctest3Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strFilePath, strFileName;
	CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*|"), this);
	fileDlg.DoModal();
	strFilePath = fileDlg.GetPathName();		//文件路径
	strFileName = fileDlg.GetFileName();	//文件名
	if (strFilePath == _T(""))
	{
		return;
	}
	CImage image;
	image.Load(strFilePath);
	CRect rectControl;                        //控件矩形对象
	image1.GetClientRect(rectControl);
	CDC *pDc = image1.GetDC();			 //设备上下文对象的类
	rectControl = CRect(rectControl.TopLeft(), CSize((int)rectControl.Width(), (int)rectControl.Height()));
	image1.SetBitmap(NULL);				//清空picture
	image.Draw(pDc->m_hDC, rectControl);    //将图片绘制到Picture控件表示的矩形区域
	image.Destroy();
	image1.ReleaseDC(pDc);
	
}

第二种方法:

//Mat类型转CImage类型
void MatToCImage(Mat &mat, CImage &cImage)
{
	//create new CImage  
	int width = mat.cols;
	int height = mat.rows;
	int channels = mat.channels();

	cImage.Destroy(); //clear  
	cImage.Create(width, height, 8 * channels); //默认图像像素单通道占用1个字节  

	//copy values  
	uchar* ps;
	uchar* pimg = (uchar*)cImage.GetBits(); //A pointer to the bitmap buffer  
	int step = cImage.GetPitch();

	for (int i = 0; i < height; ++i)
	{
		ps = (mat.ptr<uchar>(i));
		for (int j = 0; j < width; ++j)
		{
			if (channels == 1) //gray  
			{
				*(pimg + i * step + j) = ps[j];
			}
			else if (channels == 3) //color  
			{
				for (int k = 0; k < 3; ++k)
				{
					*(pimg + i * step + j * 3 + k) = ps[j * 3 + k];
				}
			}
		}
	}
}


void Ctest3Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	
	
	int cxl, cyl;
		Mat rgbImageL1, rgbImageL;//opencv图片
		rgbImageL = imread("E:/中策/0308/030801/1.bmp");
		CImage  rgbImageL2;
		CRect   rectl, pic_rectl;
		int widthl, heightl;
		//改变图片大小适应picture控件
		GetDlgItem(IDC_PIC)->GetClientRect(&pic_rectl);
		widthl = pic_rectl.right;
		heightl = pic_rectl.bottom;
		resize(rgbImageL, rgbImageL1, Size(widthl, heightl));
		MatToCImage(rgbImageL1, rgbImageL2);//OpenCV中Mat对象转MFC的CImage类的函数(见我另一篇博文)
		//获取图片的宽 高度  
		cxl = rgbImageL2.GetWidth();
		cyl = rgbImageL2.GetHeight();
		//获取Picture Control控件的大小  
		GetDlgItem(IDC_PIC)->GetWindowRect(&rectl);
		//将客户区选中到控件表示的矩形区域内  
		ScreenToClient(&rectl);
		//窗口移动到控件表示的区域  
		GetDlgItem(IDC_PIC)->MoveWindow(rectl.left, rectl.top, cxl, cyl, TRUE);
		CWnd *pWnd = NULL;
		pWnd = GetDlgItem(IDC_PIC);//获取控件句柄  
		pWnd->GetClientRect(&rectl);//获取句柄指向控件区域的大小  
		CDC *pDc = NULL;
		pDc = pWnd->GetDC();//获取picture的DC  
		rgbImageL2.Draw(pDc->m_hDC, rectl);//将图片绘制到picture表示的区域内  
		ReleaseDC(pDc);				
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值