当前位置: 首页 > news >正文

[Qt学习笔记]Qt下使用Halcon实现采图时自动对焦的功能(Brenner梯度法)

目录

  • 1、介绍
  • 2、实现方法
    • 2.1 算法实现过程
    • 2.2 模拟采集流程
  • 3、总结
  • 4、代码展示

1、介绍

在机器视觉的开发中,现在有很多通过电机去做相机的聚焦调节,对比手工调节,自动调节效果更好,而且其也能满足设备自动的需求,尤其在一些高倍成像的环境下应用场景更广泛,图像清晰度是衡量图像质量的一个重要的指标,手动调焦的过程是通过人为去判定图像的清晰度,调节镜头的焦距,使得图像从模糊到清洗,再到模糊的过程,确定清洗度的峰值,自动调焦就是通过算法对采集的每一张图像的清晰度进行评价,最终给出图像清晰的峰值,从而确定调焦获取的焦距最佳。
常见的图像清晰度评价一般都是基于梯度的方法,本文主要介绍Brenner梯度法。
Brenner梯度法.jpg
本节使用了30张不同清晰度的图像来模拟相机采图时从对焦模糊到清晰再到模糊的过程。

2、实现方法

2.1 算法实现过程

void MainWindow::AutoFocus(HObject ho_Image)
{HObject  ho_ImagePart00, ho_ImagePart20;HObject  ho_ImageSub, ho_ImageResult, ho_ImagePart01, ho_ImagePart10;HObject  ho_ImageSub1, ho_ImageResult1, ho_ImageSub2, ho_ImageResult2;HTuple  hv_I, hv_Width, hv_Height, hv_WindowID;HTuple  hv_Value, hv_Deviation;try{GetImageSize(ho_Image,&hv_Width,&hv_Height);CropPart(ho_Image, &ho_ImagePart00, 0, 0, hv_Width, hv_Height-2);ConvertImageType(ho_ImagePart00, &ho_ImagePart00, "real");CropPart(ho_Image, &ho_ImagePart20, 2, 0, hv_Width, hv_Height-2);ConvertImageType(ho_ImagePart20, &ho_ImagePart20, "real");SubImage(ho_ImagePart20, ho_ImagePart00, &ho_ImageSub, 1, 0);MultImage(ho_ImageSub, ho_ImageSub, &ho_ImageResult, 1, 0);Intensity(ho_ImageResult, ho_ImageResult, &hv_Value, &hv_Deviation);double d=hv_Deviation.D();QString strDev=QString::number(d,'f',3);ui->labDev->setText(strDev);//记录最大偏差值if(hv_PreDeviation<hv_Deviation){hv_PreDeviation=hv_Deviation;}}catch(HalconCpp::HException &except){qDebug()<<except.ProcName().Text()<<endl;qDebug()<<except.ErrorMessage().Text()<<endl;qDebug()<<except.ErrorCode()<<endl;}
}

如Brenner算法的公式所示,首先将图像转换成real类型,然后对图像进行图像差处理,然后进行图像乘积,最后获得平均值及偏差,把偏差作为清晰度的评价参数

2.2 模拟采集流程

这里创建一个线程,然后使用延时的定时器,从文件夹中依次读取30张图像,每张图像进行Brenner算法处理。
线程定义如下:

    camera = new CameraCtrl();liveThread = new QThread();camera->moveToThread(liveThread);connect(liveThread,&QThread::finished,camera,&QObject::deleteLater);connect(this,&MainWindow::ContinuousGrab,camera,&CameraCtrl::HandleContinuousGrab);liveThread->start();

然后线程开始后进行连续读取图像处理流程

//读取图像并调用Brenner算法函数
void CameraCtrl::HandleContinuousGrab()
{    HTuple  hv_I;HObject  ho_Image;    for (hv_I=1; hv_I<=30; hv_I+=1){ReadImage(&ho_Image, ("E:/Qt_Test/AutoFacus/Buddha/"+hv_I)+".png");Delay_MSec(tInter);emit hobjectReady(ho_Image);if(isFocus==true){emit hobjectFocus(ho_Image);}}
}

其中定义延时定时器

void CameraCtrl::Delay_MSec(unsigned int msec)
{QEventLoop loop;//定义一个新的事件循环QTimer::singleShot(msec, &loop, SLOT(quit()));//创建单次定时器,槽函数为事件循环的退出函数loop.exec();//事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
}

3、总结

一个好的评价函数需要具有单峰性,无偏性,灵敏性,常见的图像清晰度评价的算法有多种,比如Brenner梯度法、Tenegrad梯度法、laplace梯度法、方差法、能量梯度法等等,本节只介绍了Brenner梯度法,目前反馈的Brenner梯度法效果较好,以后有机会会介绍一下其他的方法。
5.AutoFacus.PNG

4、代码展示

本小例程的代码放到我的开源gitte项目里,欢迎一起学习,也希望能收获你的小星星。
AutoFacus源码

相关文章:

[Qt学习笔记]Qt下使用Halcon实现采图时自动对焦的功能(Brenner梯度法)

目录 1、介绍2、实现方法2.1 算法实现过程2.2 模拟采集流程 3、总结4、代码展示 1、介绍 在机器视觉的开发中&#xff0c;现在有很多通过电机去做相机的聚焦调节&#xff0c;对比手工调节&#xff0c;自动调节效果更好&#xff0c;而且其也能满足设备自动的需求&#xff0c;尤…...

常州IGM机器人RTE497的日常维修保养方法

一、IGM机器人RTE497日常检查 每日工作前&#xff0c;进行以下检查&#xff1a; 外观检查&#xff1a;确认IGM机器人RTE497本体无明显损伤&#xff0c;各部件连接稳固。 电缆检查&#xff1a;检查所有电缆、气管等是否完好&#xff0c;无磨损、无挤压。 润滑检查&#xff1a;确…...

如何利用机器学习和Python编写预测模型来预测设备故障

预测设备故障是机器学习和数据科学的一个常见问题&#xff0c;通常可以通过以下几个步骤来解决&#xff1a; 1. 数据收集 首先&#xff0c;需要收集与设备运行相关的数据&#xff0c;包括&#xff1a; 设备的历史数据环境数据&#xff08;如温度、湿度等&#xff09;使用时间…...

mysql部署(2)主从复制

在前面的基础上&#xff0c;现有26、41两个mysql8的实例&#xff0c;下面以26为主41为从搭建主从复制&#xff1a; 机器主从端口号root密码主从复制账号密码xxx.xx.xxx.26主3306Mysql#26user1/user1#26xxx.xx.xxx.41从3306Mysql#41 一、master主库配置 1、修改mysql配置文件…...

FX-数组的使用

1一维数组 1.1一维数组的创建和初始化 1.1.1数组的创建 //代码1 int arr1[10]; char arr2[10]; float arr3[1]; double arr4[20]; //代码2 //用宏定义的方式 #define X 3 int arr5[X]; //代码3 //错误使用 int count 10; int arr6[count];//数组时候可以正常创建&#xff1…...

springboot283图书商城管理系统

图书商城管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理…...

FFmpeg-- c++实现:音频流aac和视频流h264封装

文章目录 流程api核心代码muxer.hmuxer.cpp aac 和 h264 封装为视频流&#xff0c;封装为c的Muxter类 流程 分配视频文件上下文 int Init(const char *url); 创建流&#xff0c;赋值给视频的音频流和视频流 int AddStream(AVCodecContext *codec_ctx); 写视频流的head int Se…...

单片机烧录方式,JTAG,ISP,SWD,

常见的词汇 参考 ISP&#xff1a;In System Programing&#xff0c;在系统编程 IAP&#xff1a;In Application Programing&#xff0c;在应用编程 ICP&#xff1a;In Circuit Programing&#xff0c;在电路编程 ICSP全称是In Circuit Serial Programming JTAG(Joint Test Act…...

【项目管理后台】Vue3+Ts+Sass实战框架搭建一

项目管理后台 建立项目最好是卸载Vetur 新建.env.d.ts文件安装Eslint安装校验忽略文件添加运行脚本 安装prettier新建.prettierrc.json添加规则新建.prettierignore忽略文件 安装配置stylelint新建.stylelintrc.cjs 添加后的运行脚本配置husky配置commitlint配置husky 强制使用…...

基于python 变配电室运行状态评估与预警系统flask-django-nodejs-php

变配电室电气设备运行状态和环境信息缺乏必要的监测评估预警手段&#xff0c;如有一日遭遇突发情况&#xff0c;将危及电气设备安全稳定运行,易造成设备损坏和电力供应中断[2]。 目前&#xff0c;我国变配电室常采用无人管理的室内站设计方案&#xff0c;长期以来变配电室运维工…...

【自记录】VS2022编译OpenSSL1.0.2u

因为突然要编译一个老工程&#xff0c;老工程里面用到了OpenSSL 1.0.x。 于是官网下载了最后一个1.0.x版本1.0.2u。 1 下载安装Perl 去Perl官网下载即可。 使用vcpkg直接安装也可以&#xff0c;比前者更方便 vcpkg install perl #根据实际路径调整 set PATHD:\vcpkg\downloa…...

ES代替品:轻量级搜索引擎MeiliSearch

痛点 虽然Elasticsearch足够灵活强大、扩展性和实时性也较好。但是对于中小型项目来说&#xff0c;Elasticsearch还是显得有些庞大&#xff0c;对硬件设备的要求也较高。那么&#xff0c;在要求不是很高的情况下&#xff0c;我们可以考虑另一种搜索引擎方案&#xff1a;MeiliSe…...

用C语言打造自己的Unix风格ls命令

在Unix或类Unix操作系统中&#xff0c;ls是一个非常基础且实用的命令&#xff0c;它用于列出当前目录或指定目录下的文件和子目录。下面&#xff0c;我们将通过C语言编写一个简化的ls命令&#xff0c;展示如何利用dirent.h头文件提供的函数接口实现这一功能。 #include "…...

git的起源

开篇一张图&#xff1a; 开源项目linux kernel开发&#xff0c;参与开发与维护者众多。1991至2005年期间绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上。 在2002 年&#xff0c;整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维…...

软件杯 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…...

C# double类型计算精度问题解决

问题&#xff1a;res 的值0.112450000001&#xff0c;精度不对&#xff0c;预期是0.11245 double force112.45&#xff1b; double res force / Math.Pow(10, index * 3); double force112.45; double res force / Math.Pow(10, index * 3); string str res.ToString(&qu…...

基于Springcloud+Vue校园招聘系统 Eureka分布式微服务

以行动研究为主&#xff0c;辅以文献法、教育实验法和个案研究法等方法相结合的研究方法。在研究方法&#xff0c;遵循软件工程中软件生命周期的规则。概括来讲可以划分成三大步&#xff1a;系统规划、系统开发和系统运行维护。将其上述步骤细分下来&#xff0c;可以分为以下8小…...

【NLP笔记】RNN总结

文章目录 经典RNN单向RNN双向RNNDeep RNNRNN特性总结 变体RNNLSTMGRU 参考及转载内容&#xff1a; 循环神经网络&#xff08;RNN&#xff09;深度学习05-RNN循环神经网络完全理解RNN&#xff08;循环神经网络&#xff09; 传统的CNN&#xff08;Covolutional Neural Network&am…...

[c++]内存管理

1. C/C内存分布 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() { static int staticVar 1; int localVar 1; int num1[10] { 1, 2, 3, 4 }; char char2[] "abcd"; const char* pChar3 "abcd"; …...

k8s通过编排文件,实现服务的滚动更新

k8s通过编排文件&#xff0c;实现服务的滚动更新 apiVersion: apps/v1 kind: pod metadata:name: ‘servicename’labels:app: ‘servicename’ spec:replicas: 4 ##pod启动数量最少为2&#xff0c;不然滚动更新无意义strategy:type: RollingUpdate ##设置类型为滚动更新以及…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...