0
点赞
收藏
分享

微信扫一扫

[Qt&MFC] 各种方式的图像读取(OpenCv、Halcon)


文章预览:

  • 一、MFC进行图像读取
  • 二、MFC&OpenCv进行图像读取
  • 三、MFC&Halcon进行图像读取
  • 四、Qt&Halcon进行图像读取


一、MFC进行图像读取

对应按钮的实现函数:

1、绝对路径

void CQRCodeDemoDlg::OnBnClickedOpenImage()//打开图像
{
   CImage img;
   img.Load( _T("C:\\Users\\Aministrator\\Desktop\\111.jpg"));
   CWnd *pWnd = GetDlgItem(IDC_PIC);
   //获得当前窗口(IDC_PIC)的DC,传给一个CDC类的指针,因为画图往往是在DC中画的,这样获得当前窗口的DC就能在内存中绘图了
   CDC *pDC = pWnd->GetDC();
   RECT rect;
   //获得当前窗口的客户区域
   pWnd->GetClientRect(&rect);
   //自适应显示
   SetStretchBltMode(pdc->m_hDC,STRETCH_HALFTONE); 
   img.Draw(pDC->m_hDC,rect);
   ReleaseDC(pDC);
}

注:
(1)GetDC()函数功能描述:该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文(画布)的句柄,以后可以在GDI函数中用该句柄绘图.
(2)HDC是指窗体、控件的句柄,是长整类型,m_hDCHDC类型的。pDC->m_hDC:表示获取画布的句柄。

2、相对路径:

void CQRCodeDemoDlg::OnBnClickedOpenImage()//打开图像
{
	Invalidate();    //刷新窗口,以便清除上一次显示的图片
	int width, height;
	CImage  image;
	CRect   rect;
	//创建打开图片的文件路径对话框
	CFileDialog dlg(TRUE, NULL, NULL, 0, _T("All Files (*.*)|*.*|BMP (*.bmp)|*.bmp|DIB (*.dib)|*.dib|EMF (*.emf)|*.emf|GIF (*.gif)|*.gif|ICO (*.ico)|*.ico|JPG (*.jpg)|*.jpg|WMF (*.wmf)|*.wmf||"), NULL);
	if (dlg.DoModal() == IDOK)
	{		
		CString FilePathName = dlg.GetPathName();
		image.Load(FilePathName);
		CDC* pDC = GetDlgItem(IDC_STATIC_PIC)->GetDC();//获取picture的DC  
		HDC hDC = pDC->GetSafeHdc();// 获取 HDC(设备句柄) 来进行绘图操作
		GetDlgItem(IDC_STATIC_PIC)->GetClientRect(&rect);//获取Picture Control控件的大小
		//获取图片的宽 高度  
		width = image.GetWidth();
		height = image.GetHeight();
		// 求出picture control的宽和高
		int rect_w = rect.Width();
		int rect_h = rect.Height();
		//当图片比绘图区域小
		if (width <= rect.Width() && height <= rect.Width())
		{
			int tx = (int)(rect_w - width) / 2;   // 使图片的显示位置正好在控件的正中  
			int ty = (int)(rect_h - height) / 2;
			SetRect(rect, tx, ty, tx + width, ty + width);   //设置新的矩阵区域
			image.Draw(hDC, rect);//将图片绘制到picture表示的区域内  
			ReleaseDC(pDC);
		}
		//当图片比绘图区域大,这里默认是图片控件较长,只判断了图片和控件的宽度比较
		else if (height > rect_h)
		{
			double scale = (double)rect_h / (double)height; //缩放的比例因子
			int tx = (int)(rect_w - width*scale) / 2;
			int ty = 0;
			SetRect(rect, tx, ty, tx + width*scale, rect_h); //设置新的矩阵区域
			image.Draw(hDC, rect);//将图片绘制到picture表示的区域内  
			ReleaseDC(pDC);
		}
	}
}

二、MFC&OpenCv进行图像读取

1、构造函数初始化

namedWindow("view",WINDOW_AUTOSIZE);
//设置依附关系, 将cv窗口嵌入MFC主要是下述代码起作用了.
HWND hWnd = (HWND)cvGetWindowHandle("view");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd,GetDlgItem(IDC_RECT1)->m_hWnd);
::ShowWindow(hParent,SW_HIDE);

2、对应的按钮实现函数里添加:

void CQRCodeDemoDlg::OnBnClickedOpenImage()//打开图像
{
	// TODO: 在此添加控件通知处理程序代码
    CString picPath;   //定义图片路径变量  
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | 
		OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,   NULL, this);   //选择文件对话框  
 
	if(dlg.DoModal() == IDOK)  
	{  
		picPath= dlg.GetPathName();  //获取图片路径  
	}  
	//CString to string  使用这个方法记得字符集选用“使用多字节字符”,不然会报错  
	string picpath=picPath.GetBuffer(0);    	
	org=imread(picpath);     
    imagedst;  
	//以下操作获取图形控件尺寸并以此改变图片尺寸  
	CRect rect;  
	//使用GetDlgItem函数来访问对话框中的控件
	GetDlgItem(IDC_RECT1)->GetClientRect(&rect); 
	//Rect dst(rect.left,rect.top,rect.right,rect.bottom);  
	resize(org,imagedst,cv::Size(rect.Width(),rect.Height()));   
	imshow("view",imagedst);
}

3、显示效果:

[Qt&MFC] 各种方式的图像读取(OpenCv、Halcon)_MFC图像读取

三、MFC&Halcon进行图像读取

对应按钮的实现函数:

void CQRCodeDemoDlg::OnBnClickedOpenImage()//打开图像
{
    HObject  ho_Image;
    HTuple HWindowID;
    CRect Rect;
    HTuple m_HWindowID;
    HTuple m_ImageWidth,m_ImageHeight;
    //显示静态图片
    ReadImage(&ho_Image, "C:/Users/lenovo/Desktop/test.jpg");
    CWnd * pWnd = GetDlgItem( IDC_STATIC);
    HWindowID = (Hlong)pWnd->m_hWnd;//获取父窗口句柄
    pWnd->GetWindowRect(&Rect);
    OpenWindow(0,0,Rect.Width(),Rect.Height(),HWindowID,"visible","",&m_HWindowID );    
    GetImageSize(ho_Image, &m_ImageWidth, &m_ImageHeight);
    SetPart(m_HWindowID,0,0,m_ImageHeight-1,m_ImageWidth-1);
    DispObj(ho_Image, m_HWindowID);
}

注:
(1)OpenWindow():将PictureControl控件的大小传给m_HWindowID,作为开辟的Halcon窗口的大小,这样两个窗口可以叠加在一起了。
(2)GetImageSize():获取ho_Image图片的尺寸
(3)SetPart()函数:是调整图片在窗口中的位置(设定图片左上角坐标和右下角坐标)

四、Qt&Halcon进行图像读取

#include "qfiledialog.h"

void MF_Vision_TestForm::slot_setImage()
{
	HObject mImage;	
	HTuple ho_width, ho_height;
	QFileDialog fileDlg(this);
	fileDlg.setWindowTitle("Choose Pictures");
	QStringList qstrFilters;//设置文件过滤器的list
	qstrFilters << "Image files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm)";
	qstrFilters << "Any files (*)";
	fileDlg.setNameFilters(qstrFilters);//设置文件过滤器
	fileDlg.setFileMode(QFileDialog::ExistingFiles);//设置能选择多个文件,如果是单个文件就写成QFileDialog::ExistingFile

	if (fileDlg.exec() == QDialog::Accepted)
	{
		QStringList pathList = fileDlg.selectedFiles();

		if (pathList.length() == 0) return;
		QTextCodec *code = QTextCodec::codecForName("GB2312");//解决中文路径问题
		std::string name = code->fromUnicode(pathList[0]).data();
		HTuple FileName;
		FileName = HTuple(name.c_str());   //QString转QByteArray的方法 Latin道标ASCII
		ReadImage(&mImage, FileName);
	}
}

戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。


举报

相关推荐

0 条评论