halcon与QT联合:(5.4)瓶盖检测以及QT界面搭建

news/2024/9/19 23:41:58

接着上篇博客的鼠标滚轮事件之后,本次要完成的是基于结构体的变量管理以及如何让参数与界面进行关联。

---------------------------------1、下面实现的是变量管理----------------------------------

基于结构体的变量管理:

个人习惯:在写结构体时单独去写一个文件,起名为公共部分,(这个部分就可以把需要用到的结构体或者define变量,就是每一个成员都可能会用到的变量都可以放在这里 )

添加---->Add New---->C++,此时可以添加.h文件或者一个类(因为添加类的话.h和.cpp文件你都会包含了,只需要把添加的类构造函数的代码删除掉就可以因为我们不写类,作为普通的.h和.cpp文件来使用了)

把上述对应的代码删除掉,因为我们不写类。

结构体的写法一共有4种方式,选择自己最熟悉的写结构体的方式即可。

下面如果有变量要使用的地方就要使用结构体.的方式来使用变量。

 ---------------------------2、下面进行自动加载和保存参数----------------

自动加载和保存参数就是比如本次我们已经修改了参数,比如参数灰度值,下次再使用的时候我们不想再去修改了,就是修改一次之后想保存本次记忆,下次开机自动就是保存上次的参数。这样每次就不用去修改了。想实现这样的功能,我们使用的是QSetting的方法。

下面以二值化的灰度阈值进行记录:

首先在界面上添加参数按钮:二值化最小阈值和二值化阈值最大值。

(基于上次界面的基础上,在ui上先把布局打破,然后复制一下打开图像和计数的按钮-----复制粘贴是偷懒式的建立按钮方式。)

 之后进行转到槽操作,因为此处是int型,所以选择int的ValueChage(int)。

 下一步就是转到槽内函数的封装:

1、先在公共头文件定义一个结构体进行变量的管理。(就是上一步的变量管理)

 

2、定义结构体之后使用结构体声明变量。

PramSave PramS;

 3、变量在函数中的使用

(1)首先头文件中引入QSettings的头文件。

是QT特有的一个类。 用来保存或读取一些配置信息用的。

具体代码如下:

//最小阈值管理的槽
void QtCircleLocation::on_sB_MinThreshold_valueChanged(int arg1)
{//参数处理与保存(1、首先定义一个结构体管理参数)//1、给变量赋值PramS.MinThreshold=arg1;QString group;QString key;QVariant value;//赋值group="main";key="MinThresholdValue";value=QVariant(arg1);//对value进行强制转化一下//2、保存一个值到我本地文件(使用Qsetting的方法 )QSettings setting(qApp->applicationDirPath()+"/mysave.ini",QSettings::IniFormat);if(group.size()!=0){setting.beginGroup(group);}setting.setValue(key,value);if(group.size()!=0){setting.endGroup();}
}

 

打开这个mysave.ini文件:

 

 main是一个小组,小组里边有一个成员名称是ThresholdValue,值为4(就是键值对key----value)。

 下面是对于最大值MaxThreshold转到槽的操作:同上。

 把上述红框里边的代码封装为一个公共函数,放在公共部分(就是大家都会用到的)。

保存模式:

封装模式:头文件中声明,源文件中定义。(函数声明与函数定义里边参数的类型必须一样,名称可以不一样)

声明:

定义:

函数调用:

加载模式:

加载函数的声明与定义仍然放在公共部分,但是加载函数的调用放在构造函数里边,构造函数里边是程序一启动就会加载。

加载参数(加载是需要将参数输出的,输出的话这里使用的是引用的方法)

 函数声明:

函数定义:

 函数调用:

最终当你再次运行代码的时候就会记录你上次使用的参数:

 下面就界面修改的灰度阈值生效,就需要在处理函数中修改一下:

 首先在处理函数里边引用在外部cpp定义的变量:(这里就不再定义,直接使用extern使用就行)

 选编在二值化里边的函数修改一下,由原来的的固定值0和171修改为 PramS.MinThreshold和PramS.MaxThreshold。

 最终结果:

最终的完整代码见链接:

https://download.csdn.net/download/m0_37957160/20688257

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/17834.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV中的姿势估计及3D效果(3D坐标轴,3D立方体)绘制

OpenCV中的姿势估计及3D效果(3D坐标轴,3D立方体)绘制 1. 效果图2. 原理3. 源码3.1 姿态估计后绘制3D坐标轴3.2 姿态估计后绘制立方体参考这篇博客将延续上一篇博客:OpenCV中的相机失真、内外参、不失真图像、相机校准 , 学习如何利用 calib3d 模块在图像中创建一些 3D 效果…

数字图像处理:(5)非微分算子在数字图像处理中的应用

本节是非微分边缘检测算子——Canny算子 边缘是图像中灰度有阶跃变化,或屋顶变化的像素的结合。 1、 Canny算子边缘检测基本原理 该算子功能比前面几种都要好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检…

创建Silverlight自定义启动画面

每一款商业的Silverlight项目,为了体现项目个性化,都会有不同的界面设计,项目UI设计的第一步就是创建个性的自定义启动画面,本文将介绍如何创建Silverlight自定义启动画面,也就是经常说的Splash Screen. Silverlight初…

数字图像处理:滤波

1、中值滤波 2、均值滤波 3、双边滤波 -------------- 下边是基于卷积核滤波的操作: 在图像中滤波的一般操作就是: 有一个原图。有一个滤波核。(其实就是一个滑动窗口)就是结果图。PS:滤波的效果怎么样,完全取决于你这个滤波核…

齐次坐标的理解(1)

1、为什么要引入齐次坐标,齐次坐标的意义 首先百科解读: 齐次坐标就是将一个原本是n维的向量用一个n1维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。 以下内容是对这个链接的翻译&#x…

齐次坐标的理解(2)

接上篇文章齐次坐标的理解(1):https://blog.csdn.net/m0_37957160/article/details/119549709 “齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性&a…

OpenCV中的二进制鲁棒独立基本特征——BRIEF

OpenCV中的二进制鲁棒独立基本特征——BRIEF 1. 效果图2. 源码参考这篇博客将介绍OpenCV中的二进制鲁棒独立基本特征。BRIEF是一种更快的特征描述符计算和匹配方法。它还提供了较高的识别率,除非存在较大的面内旋转。 BRIEF Binary Robust Independent Elementary Features 二…

相机标定:(1)相机模型

之前在进行标定时只是简单的会使用,调用OpenCV里边的函数,完成标定即可。并没有做过多深入的理解,今天趁着course学习把标定详细的记录一下,以下完全是个人理解如果有不对的地方欢迎批评指正。 公式推导见标定2(2&…