10分钟小白都可以看懂的光度立体法以及运用到项目

简介: 10分钟小白都可以看懂的光度立体法以及运用到项目

10分钟小白都可以看懂的光度立体法以及运用到项目


利用三幅光度立体图像来恢复物体表面3D模型的快速算法,根据向量场的分布建立关于物体表面深度信息的超定线性方程组,在最小二乘意义下求得物体表面的深度值.该算法能从已知光照条件下的三幅光度立体图像中恢复任意没有遮挡面物体表面的三维结构,形成以单个像素为网格精度的物体表面的多面体模型.实际计算表明该算法计算速度快,能适应任意连续性的物体表面的3D模型重建并且不受其表面反射系数的影响。

采用不同光照条件下拍摄的多幅图像,利用光度立体技术对织物表面进行3D重建.首先根据物体表面的照度方程,引入广义逆的概念求解物体表面方向进而确定表面梯度,再运用线积分计算表面高度,结合变分和有限差分思想对所得拟合表面进行进一步的迭代和修正,获得最佳重建表面.将该算法运用到AATCC织物平整度模板图像的三维重建,可获取三维深度信息,并结合4个特征值表征织物起皱程度.。

改进光度立体视觉方法,尤其适用于表面检测

在工业领域,表面检测是一个非常广泛的应用领域。使用HALCON 11中增强的光度 立体视觉 方法,三维表面检测被加强。利用阴影可方便快速的检测物体表面的缺口或凹痕。


注意:光度立体不适用于绝对高度的重建,即,它不能替代典型的3D重建算法,例如距焦点或光的深度。


20210524093653632.png


20210524093705701.png


*这个程序演示了光度立体技术的使用
*用于检查和阅读药品上的盲文
* package. 输入4张图片取自药品包装
* 来自不同方向的光。
*
* 初始化
dev_close_window ()
dev_update_off ()
read_image (Images, 'photometric_stereo/braille_0' + [1:4])
select_obj (Images, Image, 1)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_colored (12)
dev_display (Image)
Message := '检查和阅读药品包装上的盲文'
Message[1] := '使用光度立体'
Message[2] := '在这种情况下,使用了四种不同的光线方向。'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 这个代码表在十六进制表示法之间映射
* 点字图案和相应的字符.
* 在这种情况下,使用的是德语6点代码.
CodeTable := ['','a',',','b','.','k',';','l','´','c','i','f','äu','m','s','p','','e',':','h','*','o','!','r','CAPS','d','j','g','ä','n','t','q','lcase','au','?','eu','-','u','"','v','Cap','ei','ö','','ie','x','ß','','','sch','','ü','"','z','()','','','ch','w','','','y','st','']
*
* 显示输入图像与不同的照明
for I := 1 to 4 by 1
    Message := '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
*可用于将对象的三维形状与二维纹理区分开
 *参数一 图像集(input_object)
 *参数二 重建的高度场(output_object)
 *参数三 表面的梯度场(output_object)  
 *参数四 表面的反照率(output_object)
 *参数五 相机和照明方向之间的角度(input_control)  `
 *参数六 物平面内照明方向的角度(input_control)
 *参数七 请求结果的类型(input_control)
 *参数八 重建方法的类型(input_control)  
 *参数九 通用参数的名称(input_control)
 *参数十 通用参数的值(input_control)  
photometric_stereo (Images, HeightField, Gradient, Albedo, [41.4,42.6,41.7,40.9], [6.1,95.0,-176.1,-86.8],  ['gradient','albedo'], 'poisson', [], [])
*
* 显示反照率图像
dev_display (Albedo)
disp_message (WindowHandle, 'The albedo image still has some artefacts', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*
*计算曲面的平均曲率
*使用渐变字段作为操作符的输入
* derivate_vector_field.
*将向量场的分量与高斯的导数进行卷积,并计算从中导出的各种特征
 *参数一 向量字段(input_object)
 *参数二 过滤后的结果图像(output_object)
 *参数三 高斯的西格玛(input_control)
 *参数四 要计算的分量(input_control)
derivate_vector_field (Gradient, MeanCurvature, 1, 'mean_curvature')
*
*在曲率图像中分割点是很容易的
dev_display (MeanCurvature)
disp_message (WindowHandle, 'But it is easy to segment the dots in the curvature image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*以下为盲文解码部分
*
* Segment dots
threshold (MeanCurvature, Regions, -0.14, -0.017)
connection (Regions, ConnectedRegions)
dilation_circle (ConnectedRegions, RegionDilation, 1.5)
select_shape (RegionDilation, Braille, ['area','roundness'], 'and', [191.82,0.8108], [360.12,1])
union1 (Braille, RegionUnion)
*
* 把点分组成单词和字符
closing_rectangle1 (Regions, RegionClosing, 90, 40)
connection (RegionClosing, ConnectedRegions)
shape_trans (ConnectedRegions, RegionTrans, 'rectangle1')
select_shape (RegionTrans, SelectedRegions, 'height', 'and', 50, 90)
dilation_rectangle1 (SelectedRegions, RegionDilation1, 21, 1)
partition_dynamic (RegionDilation1, Partitioned, 72, 5)
intersection (Partitioned, RegionUnion, Letters)
*
* 显示分割结果
dev_display (MeanCurvature)
dev_set_draw ('margin')
dev_set_line_width (2)
dev_display (Partitioned)
dev_display (Letters)
disp_message (WindowHandle, 'Result', 'window', 12, 12, 'black', 'true')
*
* Decode text letter by letter
count_obj (Letters, NumLetters)
for I := 1 to NumLetters by 1
    *
    * 为矩形内的六个点扇区定义边框
    select_obj (Partitioned, CurrentRectangle, I)
    region_features (CurrentRectangle, ['row1','height','column'], Limits)
    MaxFirstRow := Limits[0] + Limits[1] / 3.0
    MaxSecondRow := Limits[0] + Limits[1] * 2 / 3.0
    MaxFirstColumn := Limits[2]
    *
    * Decode the letter dot by dot
    *
    * Code values calculated depending
    * on the presence of dots using
    * the following scheme:
    *    (1) ( 8)
    *    (2) (16)
    *    (4) (32)
    * If a dot is present, the corresponding
    * value is added to the Code.
    * This way, 2^6 = 64 different codes are possible.
    select_obj (Letters, CurrentLetter, I)
    connection (CurrentLetter, Dots)
    count_obj (Dots, NumDots)
    Code := 0
    for J := 1 to NumDots by 1
        select_obj (Dots, CurrentDot, J)
        area_center (CurrentDot, _Area, Row, Column)
        if (Column <= MaxFirstColumn)
            if (Row <= MaxFirstRow)
                * Left upper (1)
                Code := Code + 1
            elseif (Row <= MaxSecondRow)
                * Left middle (2)
                Code := Code + 2
            else
                * Left lower (4)
                Code := Code + 4
            endif
        else
            if (Row <= MaxFirstRow)
                * Right upper (8)
                Code := Code + 8
            elseif (Row <= MaxSecondRow)
                * Right middle (16)
                Code := Code + 16
            else
                * Right lower (32)
                Code := Code + 32
            endif
        endif
    endfor
    Character[I - 1] := CodeTable[Code]
    disp_message (WindowHandle, CodeTable[Code], 'image', Limits[0] + Limits[1], Limits[2] - 20, 'black', 'true')
endfor


核心算子:

  photometric_stereo   根据光度立体技术重建曲面
  derivate_vector_field  将向量场的分量与高斯的导数进行卷积,并计算从中导出的各种特征


[backcolor=&]

步骤:

1.通过photometric_stereo算子获得表面梯度图像

该算子可以得到表面梯度图像和反照率图像。需要输入多张从不同角度照明所得到的图像。

2.通过derivate_vector_field算子获得高斯曲率图像

该算子中需要输入表面梯度图像。


光度立体法的典型应用:


光度立体图像的典型应用是检测代表缺陷的表面微小不一致性,或者从例如用于非平面字符的印刷检查的图像中排除光的方向的影响。


光度立体法的局限性:


基于伍德汉姆(Woodham)的算法,因此,一方面假设摄像机执行了正射投影。即,必须使用远心镜头或长焦距镜头。另一方面,假设每个光源都发出平行且均匀的光束。也就是说,您必须使用强度均匀的远心照明光源,或者使用远点光源。另外,物体必须具有朗伯反射特性,即它必须以散射方式反射入射光。具有镜面反射特性(即镜面或光泽表面)的对象或对象区域无法正确处理,因此会导致错误的结果。


采集设置:


在获取图像期间,相机相对于场景的方向不得改变。相反,对于至少三个灰度值图像,照明相对于相机的方向必须改变。


相关文章
|
算法 数据处理
点云地面点滤波(Progressive Morphological Filter)算法介绍(PCL库)
点云地面点滤波(Progressive Morphological Filter)算法介绍(PCL库)
1836 0
点云地面点滤波(Progressive Morphological Filter)算法介绍(PCL库)
|
机器学习/深度学习 文字识别 算法
[Halcon&图像] 缺陷检测的一些思路、常规检测算法
[Halcon&图像] 缺陷检测的一些思路、常规检测算法
6551 2
|
机器学习/深度学习 人工智能 自然语言处理
Hugging Face 论文平台 Daily Papers 功能全解析
【9月更文挑战第23天】Hugging Face 是一个专注于自然语言处理领域的开源机器学习平台。其推出的 Daily Papers 页面旨在帮助开发者和研究人员跟踪 AI 领域的最新进展,展示经精心挑选的高质量研究论文,并提供个性化推荐、互动交流、搜索、分类浏览及邮件提醒等功能,促进学术合作与知识共享。
499 0
|
移动开发 JavaScript 前端开发
💻揭秘!如何用 Vue 3 实现酷炫的色彩魔方游戏✨
本文分享了开发基于Canvas技术的小游戏"色彩魔方挑战"的完整过程。游戏旨在考验玩家的观察力和耐心,通过随机生成的颜色矩阵和一个变化点,玩家需在两幅画布中找出不同的颜色点。文章详细讲解了游戏的核心功能,包括随机颜色矩阵生成、点的闪烁提示、自定义配色方案等。此外,作者展示了使用Vue 3和TypeScript开发的代码实现,带领读者一步步深入了解游戏的逻辑与细节。
401 69
|
机器学习/深度学习 人工智能 自然语言处理
CosyVoice 与 SenseVoice:阿里FunAudioLLM两大语音生成项目的深度评测
近年来,基于大模型的语音人工智能技术发展迅猛,为自然语音人机交互带来新的可能。通义语音大模型无疑是这一领域的佼佼者。它涵盖了语音理解与语音生成两大核心能力,可支持多种语音任务,包括多语种语音识别、语种识别、情感识别、声音事件检测以及语音合成等
3874 1
|
存储 算法 NoSQL
[Eigen中文文档] 稀疏矩阵操作
在许多应用中(例如,有限元方法),通常要处理非常大的矩阵,其中只有少数系数不为零。在这种情况下,可以通过使用仅存储非零系数的特殊表示来减少内存消耗并提高性能。这样的矩阵称为稀疏矩阵。
832 0
|
计算机视觉 Python
OpenCV中图像的零处理与截断处理讲解与实战(附Python源码)
OpenCV中图像的零处理与截断处理讲解与实战(附Python源码)
321 0
|
算法 测试技术 计算机视觉
Opencv(C++)系列学习---opencv_contrib安装
Opencv(C++)系列学习---opencv_contrib安装
1518 0
|
数据格式
【新特性演示】YOLOv8实现旋转对象检测
【新特性演示】YOLOv8实现旋转对象检测
870 0
|
数据可视化
Halcon 学习笔记一:基本操作以及读取与保存图片
Halcon 学习笔记一:基本操作以及读取与保存图片
1923 0