基于光度立体视觉的三维重建方法
基于光度立体视觉的三维重建方法
- 一、三维重建概述
- 二、光度立体原理简介
- 三、Halcon:光度立体实验
- 1.四张测试原图
- 2.结果图
- 3.Halcon实验代码
- 四、相关参考
光度立体视觉通过多角度的光源激励,获取多个不同光照方向下的表面图像,从中重建表面法向,进而重构表面三维形貌,具有像素级的法向重建精度,适用于高反射表面的信息获取,目前已在人体建模、文物保护、医疗辅助、缺陷检测 等方面得到了一定的应用。
一、三维重建概述
在计算机视觉中,三维重建方法主要分为两大类:基于主动视觉理论的三维重建方法和基于被动视觉的三维重建方法。如图所示:
结构光法:利用已知的结构化光源(如条纹图案或激光散斑)照射物体,通过分析反射图案的变形来重建物体的三维形状。
时间飞行(Time of Flight, ToF)法:通过测量光波从发射到反射再到接收所花费的时间来估测物体距离,从而直接获取整个场景的深度信息。
激光扫描法:使用激光束对物体进行扫描,通过测量激光束的反射时间和方向来计算物体的三维坐标。
立体视觉法:利用两个或多个从不同角度拍摄的图像来重建三维场景的结构。通过找到多个图像间相同特征点的方法,来估计这些点在三维空间中的位置。
单目视觉法:仅使用单一摄像机作为采集设备,通过图像的纹理、形状等信息以及经验知识来恢复三维信息。
基于深度学习的方法:利用深度学习算法对图像进行特征提取和匹配,进而实现三维重建。这种方法可以模仿动物视觉系统的工作原理,直接利用图像信息来恢复三维结构。
二、光度立体原理简介
光度立体通过在同一视角下获取多张在不同光照方向下的观测图像,从中逆向求解表面法向,进而重构表面形貌,基本原理如图3所示。光度立体通常假设光照为远场光源,相机成像符合正交投影模型,通过标定获取光照信息(方向和强度),从不同光照信息下的图像之间的亮度变化中逆向求解表面法向量,且光照数量越多,法向求解更加具有鲁棒性。
光度立体采用时分复用的方式,依次点亮每个光源,获取每个光照方向下的观测图像。给定表面上法向为n的一点,则其成像公式可以被描述为:
式中,I 为观测的强度值(经过强度归一化),l 为光照方向,v为视角方向, ρ (n,l ,v)为双向反射分布函数(Bidirectional reflectance distribution function,BRDF),用来描述表面反射特性,max(nT,l,o)解释为附着阴影,n 为单位向量,即
三、Halcon:光度立体实验
1.四张测试原图
![]() | ![]() |
---|---|
![]() | ![]() |
2.结果图
a. 四张原始图片都是光源在不同的角度下拍摄的从主视图看,光源角度几乎都在45°左右
Slants := [41.4,42.6,41.7,40.9]
b. 从俯视图看,均匀分布在每个上下左右四个位置
Tilts := [6.1,95.0,-176.1,-86.8]
下面是对于参数Slants和Titls的示意图和解释,Slants示意图如下:
Titls示意图如下:
3.Halcon实验代码
* This program demonstrates the use of the photometric stereo technique
* for the inspection of the backside of a pharmaceutical blister.
* Input are 4 images taken from the backside of a pharmaceutical blister
* with light coming from different orientations.
*
* Initialization
dev_close_window ()
dev_update_off ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
Message := 'Inspect the backside of a blister'
Message[1] := 'using photometric stereo. In this case four'
Message[2] := 'different light orientations were used.'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*
* Show input images with different illumination
read_image (Images, 'photometric_stereo/blister_back_0' + [1:4])
for I := 1 to 4 by 1Message := 'Acquire image ' + I + ' of 4'select_obj (Images, ObjectSelected, I)dev_display (ObjectSelected)disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')wait_seconds (0.5)
endfor
*
* Apply photometric stereo to determine the albedo
* and the surface gradient.
Tilts := [6.1,95.0,-176.1,-86.8]
Slants := [41.4,42.6,41.7,40.9]
ResultType := ['gradient','albedo']
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])
*
* Display the albedo image
dev_display (Albedo)
disp_message (WindowHandle, 'Albedo image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*
* Calculate the gaussian curvature of the surface
* using the gradient field as input for the operator
* derivate_vector_field.
* Defects are usually easy to detect in the curvature image.
derivate_vector_field (Gradient, GaussCurvature, 1, 'gauss_curvature')
*
* Detect defects
*
* Segment the tablet areas in the curvature image
regiongrowing (GaussCurvature, Regions, 1, 1, 0.001, 250)
select_shape (Regions, TabletRegions, ['width','height'], 'and', [150,150], [200,200])
shape_trans (TabletRegions, TabletRegions, 'convex')
union1 (TabletRegions, TabletRegions)
erosion_circle (TabletRegions, TabletRegions, 3.5)
* Search for defects inside the tablet areas
reduce_domain (GaussCurvature, TabletRegions, ImageReduced)
abs_image (ImageReduced, ImageAbs)
threshold (ImageAbs, Region, 0.03, 255)
closing_circle (Region, RegionClosing, 10.5)
connection (RegionClosing, ConnectedRegions)
select_shape (ConnectedRegions, Defects, 'area', 'and', 10, 99999)
area_center (Defects, Area, Row, Column)
gen_circle (Circle, Row, Column, gen_tuple_const(|Row|,20.5))
* Display the defects in curvature image
dev_set_draw ('margin')
dev_set_color ('red')
dev_set_line_width (2)
dev_display (GaussCurvature)
dev_display (Circle)
Message := 'The defect can easily be detected'
Message[1] := 'in the surface curvature image'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
stop ()
* Display the defects in the albedo image
dev_set_draw ('margin')
dev_set_color ('red')
dev_display (Albedo)
dev_display (Circle)
disp_message (WindowHandle, 'Defect in albedo image', 'window', 12, 12, 'black', 'true')
该Halcon实例地址:inspect_blister_photometric_stereo.hdev
四、相关参考
[1]韦逍遥,刘文渊,王龄裕,等.基于光度立体视觉的钢轨焊缝打磨表面缺陷检测[J].机械工程学报,2024,60(24):11-24.
[2]郑天航.基于光度立体的三维重建方法研究[D].浙江科技大学,2024.2024.000031.
基于图像的多视角立体视觉三维重建(四)——基于MVS算法的稠密点云重建
Photometric Stereo 光度立体三维重建(一)——介绍
相关文章:

基于光度立体视觉的三维重建方法
基于光度立体视觉的三维重建方法 一、三维重建概述二、光度立体原理简介三、Halcon:光度立体实验1.四张测试原图2.结果图3.Halcon实验代码 四、相关参考 光度立体视觉通过多角度的光源激励,获取多个不同光照方向下的表面图像,从中重建表面法向࿰…...

在VSCode中接入deepseek
注册就送14元2000万tokens。 https://cloud.siliconflow.cn/i/rnbA6i6U各种大模型 下面介绍我是如如接入vscode的 左边生成一个key,呆会vscode要用,不然401. 打开vscod,电脑能上网。下插件。 下好要配置 点它一下。 要配置,全…...
DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明
VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…...

申请SSL证书,如何完成域名验证
一、前言 给大家分享一下Lets Encrypt 证书申请时,如何完成域名验证这一步操作的方法。 二、为什么要进行域名验证 申请SSL证书时进行域名验证的主要原因是确保证书只颁发给有权控制特定域名的实体。这是为了保证互联网的安全性和信任,防止恶意方获取不…...

HTTP实验(ENSP模拟器实现)
HTTP概述 HTTP(HyperText Transfer Protocol,超文本传输协议),设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP定义了多种请求方法,常用的包括: GET:请求资源。 POST&…...

AI工具评论
deepseek(一系列接入R1的工具如:元宝、纳米、C知道、qq浏览器、百度AI、小艺...,应该都是R1满血版吧...) kimi 豆包 ------ chatGPT Grok3 cursor github copilot https://zhuanlan.zhihu.com/p/21161495794https://zhuan…...
comfy UI节点缺失dlib库处理
安装出现dlib错误: [!] ERROR: Failed building wheel for dlib Failed to build dlib 依赖环境:python3.12 comfyui 最新版本 pip install dlib 出现错误 直接下代码编译 编译为:dlib-19.24.99-cp312-cp312-win_amd64.whl 下载地址&am…...

STM32 HAL库I2C函数使用详解:以MPU6050传感器为例
引言 I2C(Inter - Integrated Circuit)由Philips公司开发的一种简单、双向二线制串行通信协议。它只需要两根线即可在连接于总线上的器件之间传送信息,主要用于短距离、低速的数据传输,广泛应用于各种传感器、存储器等设备的通信中…...

四步彻底卸载IDEA!!!
各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 大家好,我们今天来学习四步彻底卸载IDEA!!! 首先我要提醒各位 如果你想删除 IDEA 相关…...

vue3 背景虚化,文字高亮效果
效果: 组件代码: <template><div :style"styleComputed" class"background-blurring"><div class"mask"></div><div :style"styleComputed" class"blurring-text">background</div>&l…...

开源一个可以调RGB三色的小灯棒子
开源一个可以调灯的小灯棒子。 主控用的STC8G1K08A-SOP8,RGB三色灯是WS2812B。 开源到立创开源广场了,可以直接进入下方链接,那边可以直接查看原理图和PCB。 一个可调RGB三色的小灯棒子 - 立创开源硬件平台一个可调RGB三色的小灯棒子https…...
在聚类算法的领域特定语言(DSL)中添加一个度量矩阵组件
以下是一个详细的步骤和示例代码,用于在聚类算法的领域特定语言(DSL)中添加一个度量矩阵组件,同时满足处理数据集能达到完美聚类且改进后查询次数少于改进前的要求。 整体思路 定义DSL和原聚类算法:首先,…...

【C++】list 链表的使用+模拟实现
目录 文章目录 前言 一、list的简介 二、list的使用方法 三、list的模拟实现 1.基本框架: 2.迭代器实现 3.常用接口实现 四、完整代码 总结 前言 本文主要介绍C【STL】容器中的 list,包括接口说明和模拟实现。其中讲解了迭代器功能上的分类&am…...
AI助力小微企业技术开发规范化管理 | 杂谈
AI助力小微企业技术开发规范化管理 在小型技术研发企业中,人员配置紧张,往往一名员工需要承担多项职务和任务。例如,后端程序开发人员可能同时要负责需求调研、数据库设计、后端设计及开发,甚至在某些情况下还需兼任架构师的角色。…...
Android 实现 RTMP 推流:快速集成指南
简介 在 Android 设备上实现 RTMP 推流,可以用于直播、远程监控等应用场景。本文将基于 rtmp-rtsp-stream-client-java 库,介绍如何在 Android 端快速集成 RTMP 推流,包括权限管理、相机预览、推流控制等关键步骤。 步骤 1. 配置 Maven 仓库 在 settings.gradle.kts 中添…...

pipeline 使用git parameter插件实现动态选择分支构造
效果,,点击build with Parameters 就会出现右边的当前仓库的所有的分支,默认最多显示5个,可以修改配置,修改显示的最大分支数量。如果分支太多,可以通过右边的过滤框输入过滤。 安装git params插件 搜索g…...
postcss.config.js 动态配置基准值
在Vue项目中引入PostCSS可以实现不同分辨率的自适应,通常在H5项目中使用 1. 安装插件 npm install --save-dev postcss postcss-loader autoprefixer 2. 新建postcss.config.js文件,添加下列配置项 module.exports {plugins: {postcss-px-to-viewpor…...

DeepSeek 冲击(含本地化部署实践)
DeepSeek无疑是春节档最火爆的话题,上线不足一月,其全球累计下载量已达4000万,反超ChatGPT成为全球增长最快的AI应用,并且完全开源。那么究竟DeepSeek有什么魔力,能够让大家趋之若鹜,他又将怎样改变世界AI格…...

eNSP下载安装(eNsp、WinPcap、Wireshark、VirtualBox下载安装)
一、下载 下载网址:https://cloud.grbj.cn/softlink/eNSP%20V100R003C00SPC100%20Setup.exe 备用临时网址:https://linshi.grbj.cn/abdpana/softlink 二、准备工作 系统要求 关闭防火墙 三、安装 3.1安装WinPcap 基本都是下一步,双击&…...
利用Ai对生成的测试用例进行用例评审
利用AI对生成的测试用例进行用例评审,可以从用例的完整性、有效性、一致性等多个维度展开,借助自然语言处理、机器学习等技术,提高评审效率和准确性。以下为你详细介绍具体方法: 1. 需求匹配度评审 利用自然语言处理(NLP)技术 步骤:首先将软件需求文档和生成的测试用例…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...