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 }
处理图片

只是一个简单的显示并处理图片,记住以下的坑

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

  

猜你喜欢

转载自www.cnblogs.com/GEEK-ZHAO/p/12576555.html
今日推荐