Qt + halcon 读取图像项目(改)

项目环境:win10,qt5.14,halcon20

功能:1.读取指定图像2.读取指定目录下的图像

 项目配置文件


QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
CONFIG += c++11
 
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
 
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
SOURCES += \
    main.cpp \
    widget.cpp
 
HEADERS += \
    widget.h
 
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
 
#win32和unix下的include实际上是一样的
win32:{
   #halcon配置代码,已经将include、lib拷贝到项目之下
   LIBS += -L$$PWD/halcon/win/lib/x64-win64/ -lhalcon
   LIBS += -L$$PWD/halcon/win/lib/x64-win64/ -lhalconc
   LIBS += -L$$PWD/halcon/win/lib/x64-win64/ -lhalconcpp
   LIBS += -L$$PWD/halcon/win/lib/x64-win64/ -lhalconcppxl
   LIBS += -L$$PWD/halcon/win/lib/x64-win64/ -lhalconcxl
   LIBS += -L$$PWD/halcon/win/lib/x64-win64/ -lhalconxl
   LIBS += -L$$PWD/halcon/win/lib/x64-win64/ -lhdevenginecpp
   LIBS += -L$$PWD/halcon/win/lib/x64-win64/ -lhdevenginecppxl
   LIBS += -L$$PWD/halcon/win/lib/x64-win64/ -llibiomp5md
 
   #INCLUDEPATH += $$PWD/halcon/win/include
   #DEPENDPATH += $$PWD/halcon/win/include
 
   INCLUDEPATH += $$PWD/halcon/linux/include
   DEPENDPATH += $$PWD/halcon/linux/include
}
 
 
unix:{
   LIBS += -L$$PWD/halcon/linux/lib/x64-linux -lhalcon
   LIBS += -L$$PWD/halcon/linux/lib/x64-linux -lhalconc
   LIBS += -L$$PWD/halcon/linux/lib/x64-linux -lhalconcpp
   LIBS += -L$$PWD/halcon/linux/lib/x64-linux -lhalconcppxl
   LIBS += -L$$PWD/halcon/linux/lib/x64-linux/ -lhalconcxl
   LIBS += -L$$PWD/halcon/linux/lib/x64-linux -lhalconxl
   LIBS += -L$$PWD/halcon/linux/lib/x64-linux -lhdevenginecpp
   LIBS += -L$$PWD/halcon/linux/lib/x64-linux -lhdevenginecppxl
 
   INCLUDEPATH += $$PWD/halcon/linux/include
   DEPENDPATH += $$PWD/halcon/linux/include
}

头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QGroupBox>
#include <QRadioButton>
#include <QStackedWidget>
#include <QLineEdit>
#include <QStyle>
#include <QDebug>
#include <QStandardItemModel>
#include <QTabWidget>
#include <QTableWidget>
#include <QHeaderView>
#include <QTableWidgetItem>
#include <QFileDialog>
#include "halconcpp/HalconCpp.h"
#include "Halcon.h"

using namespace HalconCpp;
#pragma execution_character_set("utf-8") //支持中文


class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    QLabel *image_label;

    HTuple  hv_WindowHandle;
    HObject  ho_Image;
    HTuple  hv_Width, hv_Height;
    Hlong  MainWndID;


    void CreateWidget();

    QRadioButton *radio_SingelImage;
    QRadioButton *radio_ListImage;

    QStackedWidget *stackedwidget;
    QWidget *page_SingelImage;
    QWidget *page_ListImage;

    QLineEdit *ledit_SingelImage;
    QPushButton *btn_SingelImage;


    QLineEdit *ledit_ListImage;
    QPushButton *btn_ListImage;

    QTableWidget *tableWidget;

    QPushButton *btn_execute;

    QString file_name_SingelImage;

    QTableWidgetItem *item0;
    QString file_path;
    QStringList filenameList;
    void filelist_refresh();

    QStringList readfilelist;

    int imageNo=0;

    void ShowImage();



private slots:
    void on_radio_SingelImage_clicked();
    void on_radio_ListImage_clicked();
    void on_btn_SingelImage_clicked();
    void on_btn_ListImage_clicked();
    void on_checkchangestate(int, int);
    void on_btn_execute_clicked();

};
#endif // WIDGET_H

c++文件

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    CreateWidget();

    connect(radio_SingelImage,SIGNAL(clicked(bool)),this,SLOT(on_radio_SingelImage_clicked()));
    connect(radio_ListImage,SIGNAL(clicked(bool)),this,SLOT(on_radio_ListImage_clicked()));
    connect(btn_SingelImage,SIGNAL(clicked(bool)),this,SLOT(on_btn_SingelImage_clicked()));
    connect(btn_ListImage,SIGNAL(clicked(bool)),this,SLOT(on_btn_ListImage_clicked()));

    connect(tableWidget, SIGNAL(cellClicked(int, int)), this, SLOT(on_checkchangestate(int, int)));
    connect(btn_execute,SIGNAL(clicked(bool)),this,SLOT(on_btn_execute_clicked()));
}

Widget::~Widget()
{
}

void Widget::CreateWidget(){
    this->setFixedSize(916,547);

    image_label =new QLabel(this);
    image_label->setGeometry(290,20,611,461);
    MainWndID = (Hlong)this->image_label->winId();
    SetWindowAttr("background_color","gray");//设置背景为灰色
    OpenWindow(0, 0, image_label->width(), image_label->height(), MainWndID,
               "visible", "", &hv_WindowHandle);
    HDevWindowStack::Push(hv_WindowHandle);

    QGroupBox *groupbox = new QGroupBox(this);
    groupbox->setGeometry(10,20,261,121);
    QLabel *label1 =new QLabel(groupbox);
    label1->setText("采集模式");
    label1->setGeometry(0,0,261,21);

    radio_SingelImage = new QRadioButton(tr("指定图像"),groupbox);
    radio_ListImage = new QRadioButton(tr("文件目录"),groupbox);
    radio_SingelImage->setGeometry(50,40,100,20);
    radio_ListImage->setGeometry(50,70,100,20);
    radio_SingelImage->setChecked(true);


    stackedwidget = new QStackedWidget(this);
    stackedwidget->setGeometry(20,160,251,301);

    page_SingelImage = new QWidget();
    stackedwidget->addWidget(page_SingelImage);
    QLabel *label2 =new QLabel(page_SingelImage);
    label2->setGeometry(0,0,100,20);
    label2->setText("指定图片");
    ledit_SingelImage = new QLineEdit(page_SingelImage);
    ledit_SingelImage->setGeometry(0,130,200,30);
    ledit_SingelImage->setReadOnly(true);
    btn_SingelImage = new QPushButton(page_SingelImage);
    btn_SingelImage->setGeometry(200,130,30,30);
    btn_SingelImage->setIcon(style()->standardIcon(QStyle::SP_FileDialogContentsView));



    page_ListImage = new QWidget();
    stackedwidget->addWidget(page_ListImage);
    QLabel *label3 =new QLabel(page_ListImage);
    label3->setGeometry(0,0,100,20);
    label3->setText("文件目录");

    ledit_ListImage = new QLineEdit(page_ListImage);
    ledit_ListImage->setGeometry(30,30,150,30);
    btn_ListImage = new QPushButton(page_ListImage );
    btn_ListImage->setGeometry(180,30,30,30);
    btn_ListImage->setIcon(style()->standardIcon(QStyle::SP_FileDialogContentsView));



    tableWidget = new QTableWidget(page_ListImage);
    tableWidget->setRowCount(0);
    tableWidget->setColumnCount(3);
    tableWidget->setGeometry(0,70,251,230);
    tableWidget->setColumnWidth(0,50);
    tableWidget->setColumnWidth(1,50);
    tableWidget->setColumnWidth(2,120);
    tableWidget->verticalHeader()->setVisible(false); //隐藏列表头


    tableWidget->show();
    QStringList headerText;
    headerText<<"选取"<<"索引"<<"文件名";
    tableWidget->setHorizontalHeaderLabels(headerText);
    tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    tableWidget->horizontalHeader()->setDisabled(true);//禁止用户拖动改变列宽
    tableWidget->verticalHeader()->setDisabled(true);//设置行不能拖动

    btn_execute = new QPushButton(this);
    btn_execute->setGeometry(540,505,91,31);
    btn_execute->setText("执行");


}

void Widget::on_radio_SingelImage_clicked()
{

    stackedwidget->setCurrentIndex(0);
}

void Widget::on_radio_ListImage_clicked()
{

    stackedwidget->setCurrentIndex(1);
}

void Widget::on_btn_SingelImage_clicked()
{

    file_name_SingelImage = QFileDialog::getOpenFileName(this,tr("open  file"),".",
        tr("Video Files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm *.jpeg)"));
    ledit_SingelImage->setText(file_name_SingelImage);
}


void Widget::on_btn_ListImage_clicked()
{
    try
    {
        file_path = QFileDialog::getExistingDirectory(this,tr("Open Directory"),"./");
        ledit_ListImage->setText(file_path);
        QDir dir(file_path);
        if(!dir.exists()){
            qDebug()<<"文件路径错误";
        }
        dir.setFilter(QDir::Files | QDir::NoSymLinks);
        QStringList filters;
        filters <<"*.bmp"<<"*.jpg"<<"*.pbm"<<"*.pgm"<<"*.png"<<"*.ppm"<<"*.xbm"<<"*.xpm"<<"*.jpeg";
        dir.setNameFilters(filters);
        filenameList = dir.entryList();
        tableWidget->clearContents();
        tableWidget->setRowCount(filenameList.count());
        for(int i=0;i<filenameList.count();i++)
        {
            qDebug()<<filenameList[i];
            item0 = new QTableWidgetItem();
            item0->setCheckState(Qt::Checked);
            tableWidget->setItem(i, 0, item0);
            QTableWidgetItem *item1 = new QTableWidgetItem(QString::number(i));
            tableWidget->setItem(i, 1, item1);
            QTableWidgetItem *item2 = new QTableWidgetItem(filenameList[i]);
            tableWidget->setItem(i, 2, item2);
        }
        filelist_refresh();
    }
    catch (HException &HDevExpDefaultException)
    {
        HTuple  hv_Exception;
        HDevExpDefaultException.ToHTuple(&hv_Exception);
    }
}

void Widget::filelist_refresh(){
    imageNo = 0;
    readfilelist.clear();
    for(int i=0;i<tableWidget->rowCount();i++){
        if(tableWidget->item(i, 0)->checkState() == Qt::Checked){
            readfilelist.append(file_path+"/"+filenameList[i]);
        }
    }
}

void Widget::on_checkchangestate(int value1, int value2){
    filelist_refresh();
}

void Widget::on_btn_execute_clicked(){
    ShowImage();
}

void Widget::ShowImage(){
    ClearWindow(hv_WindowHandle);
    if(radio_SingelImage->isChecked())
    {
        try
        {
            QString image;
            if(file_name_SingelImage.isNull()){
                image = "";

            }else{
                image=file_name_SingelImage;
            }
            ReadImage(&ho_Image,image.toLatin1().data());
            GetImageSize(ho_Image, &hv_Width, &hv_Height);
            SetPart(hv_WindowHandle, 0, 0, hv_Height, hv_Width);
            DispObj(ho_Image, HDevWindowStack::GetActive());
        }
        catch (HException &HDevExpDefaultException)
        {
            HTuple  hv_Exception;
            HDevExpDefaultException.ToHTuple(&hv_Exception);
        }

    }else if(radio_ListImage->isChecked())
    {
        if(imageNo>=readfilelist.count()){
            imageNo=0;
        }
        try
        {
            QString image;
            if(readfilelist.isEmpty()){
                image="";
            }else{
                image = readfilelist[imageNo];
            }
            ReadImage(&ho_Image,image.toLatin1().data());
            GetImageSize(ho_Image, &hv_Width, &hv_Height);
            SetPart(hv_WindowHandle, 0, 0, hv_Height, hv_Width);
            DispObj(ho_Image, HDevWindowStack::GetActive());
            imageNo++;
        }
        catch (HException &HDevExpDefaultException)
        {
            HTuple  hv_Exception;
            HDevExpDefaultException.ToHTuple(&hv_Exception);
        }
    }
}

版权声明:本文为qq_16377055原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>