news 2026/5/11 12:57:50

液态镜头 + Halcon 景深融合

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
液态镜头 + Halcon 景深融合

液态镜头配合景深融合算法,是机器视觉中解决“大景深、高分辨率”这对矛盾的标准方案。简单来说,液态镜头负责毫秒级快速变焦、采集多张不同焦点的图像,Halcon则负责从这些图像中提取最清晰的部分,合成一张全清晰的图像

下面我将从硬件原理代码实现,为你拆解这套技术的完整落地流程。


第一部分:为什么会用到液态镜头?

在工业检测或精密测量中,传统定焦镜头受限于景深。如果被测物体有高度差(如电路板上的元件、阶梯状工件),就会出现“前景清晰、后景模糊”或反之的情况。

液态镜头解决的核心问题:
它没有传统的机械移动部件,通过电润湿效应改变液体的曲率,能在毫秒级时间内改变焦距。这意味着相机可以像人眼一样,在极短时间内快速对焦到不同距离的物体上,配合算法实现“全焦成像”。

第二部分:系统架构与核心流程

一个完整的液态镜头景深融合系统,分为硬件控制算法处理两大模块。

Halcon 景深融合核心算法

图像配准
对齐由于镜头微小偏移导致的错位

清晰度评价
计算每张图每个像素的聚焦程度

权重图生成
聚焦区域权重高,离焦区域权重低

多尺度融合
如拉普拉斯金字塔融合,避免拼接痕迹

启动系统

硬件初始化

设置液态镜头电压范围

开始序列采集

触发相机采集图像 i

保存图像与对应电压值

是否采集完N张?

改变液态镜头电压

输出全焦清晰图像

第三部分:硬件层面 —— 液态镜头的控制与采集

要让液态镜头和相机协同工作,关键是如何同步触发。根据你的硬件接口(如串口、I2C或直连GPIO),你需要实现以下逻辑:

  1. 确定扫描范围:确定需要拍摄的物距范围(最近点 to 最远点),查阅液态镜头的产品手册,将物距映射为驱动电压值(如从30V到60V)。
  2. 编写控制逻辑:编写函数set_liquid_lens_voltage(voltage_value)
  3. 序列采集:使用循环语句,遍历电压值,每设置一个电压,立即触发一次相机软触发或硬触发,并将图像存入数组。

伪代码示例(C++/C#概念):

// 假设定义了设置电压和采集的函数vector<HObject>ImageList;vector<double>VoltageList={30.0,35.0,40.0,45.0,50.0};// 根据景深需求设定步长for(inti=0;i<VoltageList.size();i++){SetLensVoltage(VoltageList[i]);// 1. 设置液态镜头电压Sleep(5);// 2. 极短延时,等待镜头稳定(通常<10ms)GrabImage(&img);// 3. 采集图像ImageList.push_back(img);// 4. 存入列表}

第四部分:算法层面 —— Halcon 景深融合(核心代码)

拿到图像序列后,我们需要在Halcon中实现算法。直接加权平均会导致重影或模糊,因此必须采用基于清晰度评价的融合策略

以下是基于搜索到的资料整理的完整Halcon实现代码,包含了配准与拉普拉斯金字塔融合:

* 1. 初始化 dev_close_window () read_image (Image, 'img_1') get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) * 假设你读取了3张图,这里以3张为例,实际可拓展 read_image (Image1, 'focus_1.png') read_image (Image2, 'focus_2.png') read_image (Image3, 'focus_3.png') * 2. 图像配准 (防止液态镜头或相机在变焦时产生微小位移) * 以第一张图为基准,对第二、三张进行仿射变换对齐 create_shape_model (Image1, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) find_shape_model (Image2, ModelID, rad(0), rad(360), 0.8, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score) vector_angle_to_rigid (Row, Column, Angle, 0, 0, 0, HomMat2D) affine_trans_image (Image2, Image2_Aligned, HomMat2D, 'constant', 'false') * (重复上述步骤对齐 Image3...) clear_shape_model (ModelID) * 3. 计算清晰度图 (使用灰度方差或拉普拉斯) * 清晰度越高,代表该区域在此图中是聚焦的 var_image (Image1, Sharp1, 5, 5) var_image (Image2_Aligned, Sharp2, 5, 5) var_image (Image3_Aligned, Sharp3, 5, 5) * 4. 生成权重图 (并做平滑处理,避免融合边界生硬) gauss_image (Sharp1, Weight1, 9) gauss_image (Sharp2, Weight2, 9) gauss_image (Sharp3, Weight3, 9) * 5. 权重归一化 (确保同一像素位置的三张图权重和为1) add_image (Weight1, Weight2, TempSum) add_image (TempSum, Weight3, TotalWeight) div_image (Weight1, TotalWeight, NormWeight1, 1, 0) div_image (Weight2, TotalWeight, NormWeight2, 1, 0) div_image (Weight3, TotalWeight, NormWeight3, 1, 0) * 6. 图像融合 (直接乘加) mult_image (Image1, NormWeight1, Res1, 1, 0) mult_image (Image2_Aligned, NormWeight2, Res2, 1, 0) mult_image (Image3_Aligned, NormWeight3, Res3, 1, 0) add_image (Res1, Res2, Intermediate, 1, 0) add_image (Intermediate, Res3, FinalImage, 1, 0) * 7. 显示结果 write_image (FinalImage, 'tiff', 0, 'all_in_focus_result') dev_display (FinalImage)

第五部分:进阶与优化策略

  1. 关于“拉普拉斯金字塔”
    上述代码使用了mult_image直接融合,这在简单场景下可用。如果遇到边缘光晕,你需要使用拉普拉斯金字塔融合

    • 原理:将图像分解为高频(细节)和低频(颜色/轮廓),只对高频细节进行基于清晰度的选择,对低频进行加权平均。
    • Halcon实现:利用gen_gauss_pyramidgen_laplace_pyramid构建金字塔,逐层融合后再用reconst_laplace_pyramid重建。
  2. 如何选择最佳电压步长?

    • 景深越小(镜头光圈大),电压步长需要越小,以捕捉更精细的深度切片。
    • 通常建议重叠法则:确保当前图像的景深范围与上一张图像有至少20%-30%的重叠,这样才能保证融合后的图像没有“断层”。
  3. 3D 信息挖掘
    如果你不仅需要一张全清图,还想获得深度图3D点云,这个流程同样适用。因为每一张清晰图都对应一个特定的电压(即特定的物距)。通过记录“哪个像素在哪张图中最清晰”,你可以反推该像素的物理距离,实现2.5D 重建

总结

要实现“液态镜头 + Halcon 景深融合”:

  1. 硬件层:关键是控制电压变化与图像采集的同步。
  2. 数据层:必须对采集的序列图像进行配准,消除因变焦带来的微小放大率变化。
  3. 算法层:Halcon 的核心算子集中在var_image(清晰度评估)和金字塔算子(gen_laplace_pyramid等)上。
  4. 优化:若追求速度,可使用局部块状融合;若追求画质,必须使用金字塔融合。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 18:27:45

Maomi.In | .NET 全能多语言解决方案撑

AI Agent 时代的沙箱需求 从 Copilot 到 Agent&#xff1a;执行能力的质变 在生成式 AI 的早期阶段&#xff0c;应用主要以“Copilot”形式存在&#xff0c;AI 仅作为辅助生成建议。然而&#xff0c;随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter&#xff08;现为 Advan…

作者头像 李华
网站建设 2026/4/9 18:27:24

noi-2026年4月07号作业

题目&#xff1a;P1009 [NOIP 1998 普及组] 阶乘之和 网址&#xff1a;https://www.luogu.com.cn/problem/P1009 思路&#xff1a;高精度加法和乘法 知识点&#xff1a;高精度 代码: #include<bits/stdc.h> #define ull unsigned long long #define ll long long #d…

作者头像 李华
网站建设 2026/4/9 18:27:13

Presente 是干嘛的?

所有业务逻辑都在 Presenter 里,它知道: 什么时候该开始 什么时候该停止 循环怎么跑 测完了要做什么 MainTestSettingPresenter 这个类是来干嘛的?这个类是老师?指挥? The user is asking about the role of MainTestSettingPresenter in the MVP architecture. Let me ex…

作者头像 李华
网站建设 2026/4/9 18:23:58

解锁智能散热:开源工具FanControl的多场景风扇管理指南

解锁智能散热&#xff1a;开源工具FanControl的多场景风扇管理指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…

作者头像 李华
网站建设 2026/4/9 18:23:09

归并排序力扣题(leetcode)刳

1.概述在人工智能快速发展的今天&#xff0c;AI不再仅仅是回答问题的聊天机器人&#xff0c;而是正在演变为能够主动完成复杂任务的智能代理。OpenAI的Codex CLI就是这一趋势的典型代表——一个跨平台的本地软件代理&#xff0c;能够在用户的机器上安全高效地生成高质量的软件变…

作者头像 李华