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

简介: [Qt&MFC] 各种方式的图像读取(OpenCv、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、显示效果:


三、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);
  }
}

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



目录
相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
104 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
2月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
128 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
330 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
49 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
2月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
44 10
|
2月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
3月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
108 1
|
3月前
|
计算机视觉
使用QT显示OpenCV读取的图片
使用QT显示OpenCV读取的图片
70 1

推荐镜像

更多