当前位置: 首页 > 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源码

http://www.lryc.cn/news/321346.html

相关文章:

  • 常州IGM机器人RTE497的日常维修保养方法
  • 如何利用机器学习和Python编写预测模型来预测设备故障
  • mysql部署(2)主从复制
  • FX-数组的使用
  • springboot283图书商城管理系统
  • FFmpeg-- c++实现:音频流aac和视频流h264封装
  • 单片机烧录方式,JTAG,ISP,SWD,
  • 【项目管理后台】Vue3+Ts+Sass实战框架搭建一
  • 基于python 变配电室运行状态评估与预警系统flask-django-nodejs-php
  • 【自记录】VS2022编译OpenSSL1.0.2u
  • ES代替品:轻量级搜索引擎MeiliSearch
  • 用C语言打造自己的Unix风格ls命令
  • git的起源
  • 软件杯 深度学习 python opencv 火焰检测识别
  • C# double类型计算精度问题解决
  • 基于Springcloud+Vue校园招聘系统 Eureka分布式微服务
  • 【NLP笔记】RNN总结
  • [c++]内存管理
  • k8s通过编排文件,实现服务的滚动更新
  • 安卓面试题多线程 96-100
  • 第二十六章 配置 Web Gateway 的默认参数
  • npm i安装依赖报错,但是cnpm i 却安装成功
  • C语言经典算法-9
  • React 19的变化
  • Kafka整理-Kafka与传统消息队列系统(如RabbitMQ, ActiveMQ)的区别是什么?
  • 汽车电子零部件(8):T_Box
  • 数库据设计最佳实践
  • ESSBAE 数据挖掘
  • 在Linux/Ubuntu/Debian中使用iFuse访问iOS 设备(例如 iPhone 或 iPad)上的文件可双向复制粘贴
  • 驱动开发中的DMA是什么