一、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_hDC
为HDC
类型的。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、显示效果:
三、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); } }
戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。 |