Qt联合HALCON显示文件夹图片及初步处理
1、先上图
2、头文件

1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include<QDir> 6 #include<QFileDialog> 7 #include<QFileInfoList> 8 #include<QFileInfo> 9 #include<QTextCodec> 10 11 #include"halconcpp/HalconCpp.h" 12 using namespace HalconCpp; 13 14 QT_BEGIN_NAMESPACE 15 namespace Ui { class MainWindow; } 16 QT_END_NAMESPACE 17 18 class MainWindow : public QMainWindow 19 { 20 Q_OBJECT 21 22 public: 23 MainWindow(QWidget *parent = nullptr); 24 ~MainWindow(); 25 26 // 一些用到的halcon变量 27 HObject ho_Image,ho_Region,ho_ConnectedRegions; 28 HObject ho_SelectedRegions; 29 HTuple hv_Width,hv_Height,hv_WindowID; 30 HTuple hv_ImageFiles, hv_Index; 31 32 void processImage(); // 图片处理 33 34 35 private slots: 36 void on_readBtn_clicked(); // 读取和处理图片 37 38 void on_selectBtn_clicked(); // 选择目录 39 40 void on_clearBtn_clicked(); // 清出窗口 41 42 private: 43 Ui::MainWindow *ui; 44 45 QString path; // 路径 46 QFileInfoList infolist; // 文件路径列表 47 QFileInfo info; // 存储文件路径 48 QTextCodec *code; // 字符转码 49 }; 50 #endif // MAINWINDOW_H
3、构造函数
1 2 3 4 5 6 7 8 | MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui( new Ui::MainWindow) { ui->setupUi( this ); code = QTextCodec::codecForName( "GB2312" ); // 字符处理 } |
4、选择文件

1 void MainWindow::on_selectBtn_clicked() 2 { 3 // 读取文件夹 4 path = QFileDialog::getExistingDirectory(this,"选择文件目录",""); 5 if(path.isEmpty() == false) // 判断是否选择文件夹 6 { 7 QDir dir(path); 8 infolist = dir.entryInfoList(QDir::Files|QDir::Dirs|QDir::NoDotAndDotDot); 9 } 10 else 11 infolist.clear(); // 清除列表 12 }
5、获取并显示HALCON窗口

1 void MainWindow::on_readBtn_clicked() 2 { 3 for(int i =0 ; i <infolist.count(); i++) // 判断列表是否位空 4 { 5 // 将路径处理成HALCON能识别的代码 6 info = infolist.at(i); 7 QString subDir = info.absoluteFilePath(); 8 std::string str = code->fromUnicode(subDir).data(); // 中文路径也可读取 9 10 if(info.isFile()) 11 { 12 ReadImage(&ho_Image, str.c_str()); 13 Hlong winID = ui->label->winId(); 14 GetImageSize(ho_Image,&hv_Width,&hv_Height); 15 SetWindowAttr("background_color","black"); 16 17 if (HDevWindowStack::IsOpen()==false) // 判断HALCON窗口是否打开 18 { 19 OpenWindow(0,0,hv_Width/4,hv_Height/4,winID,"","",&hv_WindowID); 20 double a = hv_Width; 21 qDebug()<<a; 22 HDevWindowStack::Push(hv_WindowID); 23 } 24 25 if (HDevWindowStack::IsOpen()) 26 DispObj(ho_Image, HDevWindowStack::GetActive()); 27 28 processImage(); // 处理图片 29 } 30 } 31 }
6、处理图片

1 void MainWindow::processImage() 2 { 3 Threshold(ho_Image, &ho_Region, 128, 255); 4 Connection(ho_Region, &ho_ConnectedRegions); 5 SelectShape(ho_ConnectedRegions, &ho_SelectedRegions, "area", "and", 5309.07, 9999999); 6 7 if (HDevWindowStack::IsOpen()) 8 { 9 SetColor(HDevWindowStack::GetActive(),"red"); 10 DispObj(ho_SelectedRegions, HDevWindowStack::GetActive()); 11 } 12 }
7、清理图片

1 void MainWindow::on_clearBtn_clicked() 2 { 3 if(hv_WindowID != NULL) // 判断句柄是否为NULL 4 { 5 if (HDevWindowStack::IsOpen()) 6 CloseWindow(HDevWindowStack::Pop()); 7 } 8 }
只是一个简单的显示并处理图片,记住以下的坑
1)打开文件之后记得判断path是否为空
2)图片大小规格显示由OpenWindow决定,可以手写代码更改窗口大小来适应label或者QGraphicsview
3)每次读取图片,要判断HDevWindowStack::IsOpen()是否为true,即halcon句柄是否打开,关闭窗口后要重新打开halcon窗口句柄
4)halcon变量和QT变量会有转换,例如QString转成halcon的字符串,需要如下方法
1 2 | QString str = "../image/1.bmp" ; ReadImage(&ho_Image, str.toStdString.c_str()); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!