C++ 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 <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;
    //HTuple  hv_AcqHandle;
    HObject  ho_Image;
    HTuple  hv_Width, hv_Height;
    //Hlong windID;
    Hlong  MainWndID;

    QGroupBox *groupbox1;

    QRadioButton *radio1;
    QRadioButton *radio2;

    QStackedWidget *stackedwidget;
    QWidget *page1;
    QWidget *page2;

    QLineEdit *ledit1;
    QPushButton *btn1;

    QLineEdit *ledit2;
    QPushButton *btn2;
    QTableWidget *tableWidget;
    QTableWidgetItem *item0;
    QString file_path;
    QStringList filenameList;
    //QStringList fullfilename;

    QPushButton *btn3;

    void create_widget();

    void filelist_refresh();
    QStringList readfilelist;

    QString file_name1;
    QString file_name2;

    int imageNo=0;

    /*
    enum CellType{ct_isUsed,ct_rowNo};
    enum FieldColNum{col_isUsed,col_rowNo};
    QLabel *labCellIndex;
    QLabel *labCellType;
    QLabel *labID;
    void createItemsARow(bool isUsed,int rowNo,QString FileName);
    */

private slots:
    void on_radioButton1_clicked();
    void on_radioButton2_clicked();

    void on_btn1_clicked();
    void on_btn2_clicked();
    void on_btn3_clicked();
    //void on_item_clicked(QTableWidgetItem * item);
    void on_checkchangestate(int, int);
    //void slotHeaderClicked(int);

};
#endif // WIDGET_H

c++文件

#include "widget.h"

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

    connect(radio1,SIGNAL(clicked(bool)),this,SLOT(on_radioButton1_clicked()));
    connect(radio2,SIGNAL(clicked(bool)),this,SLOT(on_radioButton2_clicked()));

    connect(btn1,SIGNAL(clicked(bool)),this,SLOT(on_btn1_clicked()));
    connect(btn2,SIGNAL(clicked(bool)),this,SLOT(on_btn2_clicked()));
    connect(btn3,SIGNAL(clicked(bool)),this,SLOT(on_btn3_clicked()));

    connect(tableWidget, SIGNAL(cellClicked(int, int)), this, SLOT(on_checkchangestate(int, int)));
    //connect(tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(slotHeaderClicked(int)));

}

Widget::~Widget()
{
}

void Widget::create_widget()
{
    this->setFixedSize(916,547);
    this->setWindowTitle("图像读取");

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

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

    radio1 = new QRadioButton(tr("指定图像"),this->groupbox1);
    radio2 = new QRadioButton(tr("文件目录"),this->groupbox1);
    radio1->setGeometry(50,40,100,20);
    radio2->setGeometry(50,70,100,20);
    radio1->setChecked(true);

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

    page1 = new QWidget();
    QLabel *label2 =new QLabel(page1);
    label2->setGeometry(0,0,100,20);
    label2->setText("指定图片");
    ledit1 = new QLineEdit(page1);
    //ledit1->setGeometry(30,130,150,30);
    ledit1->setGeometry(0,130,200,30);
    ledit1->setReadOnly(true);
    btn1 = new QPushButton(page1);
    btn1->setGeometry(200,130,30,30);
    btn1->setIcon(style()->standardIcon(QStyle::SP_FileDialogContentsView));

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

    ledit2 = new QLineEdit(page2);
    ledit2->setGeometry(30,30,150,30);
    btn2 = new QPushButton(page2);
    btn2->setGeometry(180,30,30,30);
    btn2->setIcon(style()->standardIcon(QStyle::SP_FileDialogContentsView));

    //QTableWidget *tableWidget = new QTableWidget(10,3,page2);
    tableWidget = new QTableWidget(page2);
    //QTableWidget *tableWidget = new QTableWidget(page2);
    tableWidget->setRowCount(0);
    tableWidget->setColumnCount(3);
    //page2->addWidget();
    tableWidget->setGeometry(0,70,251,230);
    //tableWidget->resizeColumnsToContents();
    //tableWidget->resizeRowsToContents();
    //tableWidget->setColumnWidth(3,200);
    tableWidget->setColumnWidth(0,50);
    tableWidget->setColumnWidth(1,50);
    //tableWidget->setColumnWidth(2,QHeaderView::Stretch);
    tableWidget->setColumnWidth(2,120);
    //tableWidget->setRowHeight(3,60);
    tableWidget->verticalHeader()->setVisible(false); //隐藏列表头
    //tableWidget->horizontalHeader()->setVisible(false); //隐藏行表头

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

    stackedwidget->addWidget(page1);
    stackedwidget->addWidget(page2);

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

}

void Widget::on_radioButton1_clicked()
{
    qDebug()<<"1";
    stackedwidget->setCurrentIndex(0);
}

void Widget::on_radioButton2_clicked()
{
    qDebug()<<"2";
    stackedwidget->setCurrentIndex(1);
}

void Widget::on_btn1_clicked()
{
    qDebug()<<"btn1";
    qDebug() << "按下了1号按钮,读取图片";
    file_name1 = QFileDialog::getOpenFileName(this,tr("open  file"),".",tr("Video Files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm *.jpeg)"));

    ledit1->setText(file_name1);

}

void Widget::on_btn2_clicked()
{
    //imageNo = 0;
    qDebug()<<"btn2";
    qDebug() << "按下了2号按钮,读取图片";
    try
    {

        file_path = QFileDialog::getExistingDirectory(this,tr("Open Directory"),"./");
        qDebug() << file_path;
        ledit2->setText(file_path);

        QDir dir(file_path);

        //  cout<<"bian li kai shi "<<endl;
        if(!dir.exists()){
            qDebug()<<"文件路径错误";
            //return false;
        }
        dir.setFilter(QDir::Files | QDir::NoSymLinks);
        QStringList filters;
        filters <<"*.bmp"<<"*.jpg"<<"*.pbm"<<"*.pgm"<<"*.png"<<"*.ppm"<<"*.xbm"<<"*.xpm"<<"*.jpeg";
        dir.setNameFilters(filters);

        filenameList = dir.entryList();
        qDebug()<<filenameList;

        ///
        tableWidget->clearContents();
        tableWidget->setRowCount(filenameList.count());

        for(int i=0;i<filenameList.count();i++)
        {
            qDebug()<<filenameList[i];
            //QTableWidgetItem *item = new QTableWidgetItem();
            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::on_btn3_clicked(){
    qDebug() << "按下了3号按钮,读取图片";

    ClearWindow(hv_WindowHandle);
    if(radio1->isChecked())
    {
        //显示指定图片
        try
        {
            //QString file_name;
            QString image;
            if(file_name1.isNull()){
                image = "";

            }else{
                image=file_name1;
            }
            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(radio2->isChecked())
    {
        //显示文件目录下选取图像]
        if(imageNo>=readfilelist.count()){
            imageNo=0;
        }
        try
        {
            //QString file_name;
            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);
        }
    }

}

void Widget::on_checkchangestate(int value1, int value2){

    if(value2==0&&tableWidget->item(value1, value2)->checkState() == Qt::Checked)
    {
        qDebug()<<"选中";
    }
    else if(value2==0&&tableWidget->item(value1, value2)->checkState() == Qt::Unchecked)
    {
        qDebug()<<"未选中";
    }
    filelist_refresh();
}

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]);
        }
    }
    qDebug()<<readfilelist;

    //readfilelist
}

到此这篇关于C++ Qt之halcon读取像素项目过程详解的文章就介绍到这了,更多相关C++ Qt之halcon读取像素项目内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • LiteralControl ASP.NET中的另类控件

    首先看一个aspx文件里的部分内容: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="

  • phalcon model在插入或更新时会自动验证非空字段的解决办法

    对phalcom框架不了解的朋友可以点击了解下. phalcon框架使用指南 在使用phalcon的insert和update功能时,因为数据库所有的字段设置的都是NOT NULL,而phalcon的model在插入或更新之前会自动判断字段是否需要必填,因此导致有空字段时无法存入. 开始遇到这问题时,想到两种解决方法: 一.改数据库字段,把NOT NULL改为可以为空. 但该数据库还得去找DBA,而且为了性能,DBA要求一般没有特殊情况,字段必须是NOT NULL,所以该方案否决. 二.给可以为

  • phalcon框架使用指南

    初次认识phalcon是在刚学php的时候,最近终于有机会用上了.故此说说使用上的一些感受 个人是很喜欢phalcon这套框架的方式,使用依赖注入,让代码组织很灵活,耦合也很低.但是,也许是框架东西太多了,遇到几个坑. github上一年以上的issue也还没解决.不过有一定开发经验的话,还是可以自己修复的.被这几个坑浪费了不少时间.... 第一个是view. phalcon的view,可以分成两大部分,一是全局的layout,二是controller/action的部分, 让使用时更加方便,设

  • C#调用百度翻译实现翻译HALCON的示例

    准备工作 HALCON示例程序的描述部分一直是英文的,看起来很不方便.我决定汉化一下HALCON示例程序的描述,准备工作如下: 拿到HALCON的例程描述文件index_examples_en_US.xml,我的在C:\Program Files\MVTec\HALCON-18.11-Progress\help,其它版本类似.在百度翻译开放平台注册拿到自己的ID和密钥,开通通用翻译API服务. 注:百度官方有提供通用翻译API的使用DEMO,不过比较简单,C# DEMO下载 参数简介 通用翻译A

  • 关于安装halcon包pycharm提示不全的问题

    halcon是德国公司开发的一套很完善的机器视觉算法包,很广泛地应用于工业各个领域中,用途十分广泛,是一款值得学习的图像处理软件,halcon虽然没有opencv和matlab在图像处理领域应用更加广泛,专业性.集成封装性.稳定性在halcon上优势就很明显.经典例程很多,可以参考和学习的地方很多.确实是这样的,例程中的应用也十分广泛,从二维图像分析角度,包括:二维测量.二维码识别.二维位置定位.二维物体识别.从三维图像分析角度,包括:三维测量比较.三维物体定位.三维物体识别.另外在缺陷检测上,

  • C++ 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 depreca

  • Python读取YAML文件过程详解

    这篇文章主要介绍了Python读取YAML文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 YAML语法 学习手册 Python读取方法: import yaml with open('demo1.yaml', 'r', encoding='utf-8') as f: file_content = f.read() content = yaml.load(file_content, yaml.FullLoader) print(con

  • Nest.js快速启动API项目过程详解

    目录 快速启动 使用nest自带的命令行工具 直接使用starter项目 用npm安装所需的包 创建controller 创建service 结构和命名 HTTP请求 处理Axios对象 配置 全局添加headers API文档 快速启动 最近上了一个新项目,这个客户管理一个庞大的任务和团队集群,而不同流程所适用的系统也不太一样,比如salesforce,hubspots之类的.这次的新项目需要在另外两个平台之间做一些事情.目前只需要先封装其中之一的API,因此我们选定使用NodeJS的框架Ne

  • 在Docker中部署Spring Boot项目过程详解

    微服务现在在互联网公司可谓非常流行了,之前找工作的的时候很多HR电话约面试的时候都会问对微服务是否有过接触.而微服务和Docker可以非常完美的结合,更加方便的实现微服务架构的落地.作为微服务中的代表SpringBoot框架,今天我们就来了解一下如何在Docker容器中运行一个SpringBoot应用. 创建Spring Boot程序 在这篇文章中我们将在Docker容器中运行一个简单的SpringBoot的Web应用,下面是初始时刻的pom.xml中的内容. <?xml version="

  • 基于javamelody监控springboot项目过程详解

    JavaMelody是用来在QA和实际运行生产环境中监控Java或Java EE应用程序服务器的一个开源框架.它不是一个工具来模拟来自用户的请求,而是一个测量和计算用户在实际操作中应用程序的使用情况的工具,并以图表的形式显示,图表可以按天,周,月,年或自定义时间段查看. JavaMelody基础的监控包括Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求.sql请求.jsp页面与业务接口方法(EJB3.Spring. Guice)的执行数量,平均执行时

  • vue-cli3.0 脚手架搭建项目的过程详解

    1.安装vue-cli 3.0 npm install -g @vue/cli # or yarn global add @vue/cli 安装成功后查看版本:vue -V(大写的V) 2.命令变化 vue create --help 用法:create [options] <app-name> 创建一个由 `vue-cli-service` 提供支持的新项目 选项: -p, --preset <presetName>       忽略提示符并使用已保存的或远程的预设选项   -d

  • SPRINGBOOT读取PROPERTIES配置文件数据过程详解

    这篇文章主要介绍了SPRINGBOOT读取PROPERTIES配置文件数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.使用@ConfigurationProperties来读取 1.Coffer entity @Configuration @ConfigurationProperties(prefix = "coffer") @PropertySource("classpath:config/coffer.p

  • springboot jpa分库分表项目实现过程详解

    这篇文章主要介绍了springboot jpa分库分表项目实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 分库分表场景 关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数.处理能力都有限.当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库.优化索引,做很多操作时性能仍下降严重.此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间. 分库分表用于应对当前互联网常见的两个场景--大数

  • 使用vue cli4.x搭建vue项目的过程详解

    cli-4.x已经发布好久了,斟酌了好久,还是决定将原来的cli-2.x升级到4.x,详细的升级过程可以戳这里 1.创建项目 vue create vuetest 2.选择配置方式 ? Please pick a preset: (Use arrow keys) ☜(使用箭头键) > default (babel, eslint) ☜(使用默认的配置,会安装babel和eslint) Manually select features ☜(手动配置) 这里我选择的是手动配置(使用↑ ↓箭头切换,E

  • 使用 React 和 Threejs 创建一个VR全景项目的过程详解

    最近我在学习使用 React 配合 Three.js 来搭建一个可以浏览720全景图片的项目 实现的是加载一张 2:1 的720全景 分享一下我的创建过程 一.搭建框架并安装需要的插件 npx create-react-app parano // 创建一个 React 项目 npm install -S typescript // 安装 typescript,这个是类型辅助插件,与全景项目关系不大 npm install -S @types/three // 安装 typescript 支持的

随机推荐