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、構造函數

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());

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM