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、構造函數
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的字符串,需要如下方法
QString str = "../image/1.bmp"; ReadImage(&ho_Image, str.toStdString.c_str());