官方文档翻译

  • 名称: photometric_stereo -- 通过光度立体技术重建表面。
  • 签名: photometric_stereo(Images : HeightField, Gradient, Albedo : Slants, Tilts, ResultType, ReconstructionMethod, GenParamName, GenParamValue : )
  • 描述:
    photometric_stereo可以用来从一个物体的两维纹理,例如它的打印照片,来区分出它的三维形状。这个算子需要至少需要三张使用已知的不同方向的光源拍摄的相同物体的图像。注意,拍摄这些照片时,相机的视角应该是固定的。(译者注:即固定相机和物体,从多个已知的不同方向打光拍摄)
    物体的这种三维形状从根本上来说是通过计算3维表面的局部梯度。这些梯度可以被进一步综合起来获取到一个高度场,也就是说,一张图片的每个像素都与一个相对高度相关联。(译者注:计算得出的)二维的纹理被称为反照率,与对局部光源的吸收和反射表面特征有关,把所有的阴影都排除在外。

    • 光照立体法的典型应用
      光照立体法的典型应用是用来检测表面的变化,这种变化可能意味着缺陷,或者被用来将拍照时光照角度的影响排除在外,例如用于非扁平字符的打印检查。注意,光度立体法不适用于重建绝对高度,也就是说,它不能替代传统的3D重建算法,如对焦测距和激光三角测量。

    • 光度立体法的局限性
      光度立体法是基于Woodham算法,因此假设相机表现为无畸变的投影。这也就意味着,你必须使用一个远心镜头或者长焦镜头。另一方面,它假设了每个光源发出的都是平行的等截面的光。这也就是说,你使用的照明必须是远心光源,有着均匀的强度,或者作为替代,远距离的点光源。此外,这个物体必须有朗伯反射特性,也就是说它对光的反射是漫反射。有镜面反射的物体或者区域(镜子或者光滑的表面)不能被正确处理,会得到一个错误的结果。

    • 照片采集设置
      这个使用远心镜头的相机必须被放置得和被重建的平面正交,即互相垂直。相机和平面的角度在采集过程中一定不能改变。相反,光源和平面的夹角必须至少改变三次来获取三张灰度图片。

    • 具体说明光照的角度
      对每张图片,光线的方向用两个角度来表示,使用参数Slants和Tilts,这两个参数描述了光线和平面的方向。来理解一下这两个参数,记住,光源被假设发出的是平行光,照相机有一个远心镜头,相机被放置在重建表面的正交方向。

      • Slants
        这个角度指的是相机的光轴和光线的夹角。如图:

      • Tilts
        这个角度使用物体平面或者其他与之平行的平面,例如图片表面来进行测量。特别的,它描述了图片中心点向右延伸和光线方向投影到平面上的夹角。也即,当在看图片或者相关的平面时,一个0度的角意味着光从右边来,90度意味着光从顶上来,180度意味着光从左边来,等等。如图:

      正如之前所说的,光度立体法需要至少三张光线不同情况下拍摄的照片。然而,一个三维的几何体通常会有阴影。在阴影区域,光线有效方向的数量(the number of effectively available directions of illumination)被削减了,这会导致不明确(译者注:ambiguities?模棱两可?)。尽管如此,获取一个鲁棒性好的结果,赘余是需要的。因此,通常会使用超过三个不同方向的光源。但是记住,光线方向的增加,会导致更多的图片需要被处理,因此需要花费更多的处理时间。在绝大多数应用中,4-6个光源是合理的。根据经验法则,slant角度会在30°-60°之间选择。Tilt角度通常会均等得分布在被测物体的周围。请记住,光线的角度必须是经过选择的,以使得他们(译者注:他们是指?)能够不在同一平面上(即:光线的方向必须是独立的)。否则,计算会失败,程序会抛出一个异常。

    • 输入图片和定义的区域
      图片必须以一个图片数组输入。如前所述:每张图片必须是使用不同的光线角度的。如果图片是通过存储在多通道图片中的,通过 image_to_channels 可以容易地转换为图片数组。作为替代,图片数组可以通过 concat_obj 来创建。
      光度立体法依赖于对光度测定信息的评估,也就是存储在图像中的灰度值。因此,这些信息应当是无偏并且是准确的。我们建议保证用来采集图像的相机有线性特征。如果有非线性特征,你可以使用算子 radiometric_self_calibration 来测定你的相机的特征,使用 lut_trans 来校正灰度信息。此外,如果需要精确的测量,我们建议运用相机的全动态范围,因为这可以获得更精确的灰度信息。为了相同的原因,使用高于8位深度(bit-depth)的图像(例如:使用uint2的图像(译者注:灰度范围0~65535)而不是byte(0~255)类型的图像)可以带来更高的准确率。
      输入图像的区域决定了内部会使用哪一种算法来处理图像。有三种可用的算法:
      * 如果整个图像都是定义域(译者注:可以理解为这张图的每个像素点都有灰度值),会使用最快的算法。这被推荐使用在大多数的应用中。
      * 如果输入的图像共享了相同的削减过的定义域,只有定义域内的像素会被处理。这种模式会被用来排除图像上的某些区域。通常的,已知显示出非朗伯反射特性或者不感兴趣的区域会被排除,例如表面的孔洞。
      * 如果提供了包含清晰定义域的图像,每张图像上包含在范围内的灰度值会被使用。只有在三张图像上拥有独立的slant和tilt角度的像素会被处理(译者注:?only those pixels are processed that have independent slant and tilt angles in at least three images)。这种模式在某些情况下是合适的,例如在图像处理时排除个别图像上的特别的区域。这些区域可能是已知的表现出非朗伯反射特性的区域或者包含了译
  • 名称: photometric_stereo -- 通过光度立体技术重建表面。
  • 签名: photometric_stereo(Images : HeightField, Gradient, Albedo : Slants, Tilts, ResultType, ReconstructionMethod, GenParamName, GenParamValue : )
  • 描述:
    photometric_stereo可以用来从一个物体的两维纹理,例如它的打印照片,来区分出它的三维形状。这个算子需要至少需要三张使用已知的不同方向的光源拍摄的相同物体的图像。注意,拍摄这些照片时,相机的视角应该是固定的。(译者注:即固定相机和物体,从多个已知的不同方向打光拍摄)
    物体的这种三维形状从根本上来说是通过计算3维表面的局部梯度。这些梯度可以被进一步综合起来获取到一个高度场,也就是说,一张图片的每个像素都与一个相对高度相关联。(译者注:计算得出的)二维的纹理被称为反照率,与对局部光源的吸收和反射表面特征有关,把所有的阴影都排除在外。

    • 光照立体法的典型应用
      光照立体法的典型应用是用来检测表面的变化,这种变化可能意味着缺陷,或者被用来将拍照时光照角度的影响排除在外,例如用于非扁平字符的打印检查。注意,光度立体法不适用于重建绝对高度,也就是说,它不能替代传统的3D重建算法,如对焦测距和激光三角测量。

    • 光度立体法的局限性
      光度立体法是基于Woodham算法,因此假设相机表现为无畸变的投影。这也就意味着,你必须使用一个远心镜头或者长焦镜头。另一方面,它假设了每个光源发出的都是平行的等截面的光。这也就是说,你使用的照明必须是远心光源,有着均匀的强度,或者作为替代,远距离的点光源。此外,这个物体必须有朗伯反射特性,也就是说它对光的反射是漫反射。有镜面反射的物体或者区域(镜子或者光滑的表面)不能被正确处理,会得到一个错误的结果。

    • 照片采集设置
      这个使用远心镜头的相机必须被放置得和被重建的平面正交,即互相垂直。相机和平面的角度在采集过程中一定不能改变。相反,光源和平面的夹角必须至少改变三次来获取三张灰度图片。

    • 具体说明光照的角度
      对每张图片,光线的方向用两个角度来表示,使用参数Slants和Tilts,这两个参数描述了光线和平面的方向。来理解一下这两个参数,记住,光源被假设发出的是平行光,照相机有一个远心镜头,相机被放置在重建表面的正交方向。

      • Slants
        这个角度指的是相机的光轴和光线的夹角。如图:

      • Tilts
        这个角度使用物体平面或者其他与之平行的平面,例如图片表面来进行测量。特别的,它描述了图片中心点向右延伸和光线方向投影到平面上的夹角。也即,当在看图片或者相关的平面时,一个0度的角意味着光从右边来,90度意味着光从顶上来,180度意味着光从左边来,等等。如图:

      正如之前所说的,光度立体法需要至少三张光线不同情况下拍摄的照片。然而,一个三维的几何体通常会有阴影。在阴影区域,光线有效方向的数量(the number of effectively available directions of illumination)被削减了,这会导致不明确(译者注:ambiguities?模棱两可?)。尽管如此,获取一个鲁棒性好的结果,赘余是需要的。因此,通常会使用超过三个不同方向的光源。但是记住,光线方向的增加,会导致更多的图片需要被处理,因此需要花费更多的处理时间。在绝大多数应用中,4-6个光源是合理的。根据经验法则,slant角度会在30°-60°之间选择。Tilt角度通常会均等得分布在被测物体的周围。请记住,光线的角度必须是经过选择的,以使得他们(译者注:他们是指?)能够不在同一平面上(即:光线的方向必须是独立的)。否则,计算会失败,程序会抛出一个异常。

    • 输入图片和定义的区域
      图片必须以一个图片数组输入。如前所述:每张图片必须是使用不同的光线角度的。如果图片是通过存储在多通道图片中的,通过 image_to_channels 可以容易地转换为图片数组。作为替代,图片数组可以通过 concat_obj 来创建。
      光度立体法依赖于对光度测定信息的评估,也就是存储在图像中的灰度值。因此,这些信息应当是无偏并且是准确的。我们建议保证用来采集图像的相机有线性特征。如果有非线性特征,你可以使用算子 radiometric_self_calibration 来测定你的相机的特征,使用 lut_trans 来校正灰度信息。此外,如果需要精确的测量,我们建议运用相机的全动态范围,因为这可以获得更精确的灰度信息。为了相同的原因,使用高于8位深度(bit-depth)的图像(例如:使用uint2的图像(译者注:灰度范围0~65535)而不是byte(0~255)类型的图像)可以带来更高的准确率。
      输入图像的定义域决定了内部会使用哪一种算法来处理图像。有三种可用的算法:
      * 如果整个图像都是定义域(译者注:可以理解为这张图的每个像素点都有灰度值),会使用最快的算法。这被推荐使用在大多数的应用中。
      * 如果输入的图像共享了相同的削减过的定义域,只有定义域内的像素会被处理。这种模式会被用来排除图像上的某些区域。通常的,已知显示出非朗伯反射特性或者不感兴趣的区域会被排除,例如表面的孔洞。(译者注:每张图的定义域都是相同的)
      * 如果提供了包含清晰定义域的图像,每张图像上包含在范围内的灰度值会被使用。只有在三张图像上拥有独立的slant和tilt角度的像素会被处理(译者注:?only those pixels are processed that have independent slant and tilt angles in at least three images)。这种模式在某些情况下是合适的,例如在图像处理时排除个别图像上的特别的区域。这些区域可能是已知的表现出非朗伯反射特性的区域或者包含了偏光信息的区域,例如影子。排除这些点可以导致更准确的结果。请注意,最后一种模式与前两种相比,显著需要更多的处理时间。(译者注:这种情况下每张图片的定义域都有可能不同)

    • 输出图片
      这个算子输出了重建图像的梯度,反射率,和表面的高度场图像。
      * 梯度图像是一个向量场,包含了表面的偏导数。记住,梯度可以被用作算子 reconstruct_height_field_from_gradient 的输入参数。为了更直观的目的,替代表面梯度,可以返回标准化之后的表面梯度。为了达到这样的目的,'ResulltType' 必须被设置为 normalized_gradient 而不是 gradient。这里,行和列元素代表了标准化之后的行和列。如果 ResultType被设置为了 all ,就会使用gradient 而不是 normalized_gradient
      * 反射率图像描述了反射辐射和入射辐射的比例,数值在1(白色表面)-0(黑色表面)之间。因此,反射率是表面的一个特征。举个例子,对一个印刷表面来说,反射率与把所有入射光排除在外(阴影,明暗)的印刷图片有关。
      * 高度场图像的每个像素与相对高度相关。

    默认情况下,上面这些对象都会返回,也就是说,参数ResultType设置为all。在只需要某些结果的情况下,这个参数可以设置为数组,仅将一些需要的值放在其中,可以放的值有'gradient', 'albedo', 和 'height_field'。记住,在特定的应用中,像表面检测任务,只有梯度和反射率图像是有需要的。这里,不构建高度场图像可以显著得增快重建的速度。
    记住,在光度立体法内部,最先计算出梯度值,如果有需要,结合这些值来获取高度场。这个结合操作与 reconstruct_height_field_from_gradient 使用的是相同的算法,他们可以通过参数ReconstructionMethod, GenParamName, 和 GenParamValue进行控制。请参阅reconstruct_height_field_from_gradient的帮助来获取更多关于这些参数的信息。如果ResultType中没有height_field,那么这几个参数会被忽略。

  • 注意
    photometric_stereo基于方形像素的假定。此外,它假定在物体空间内,高度在步幅是1的格子上计算出来的。如果不是这种情况,相机的像素投射到物体表面不是1,返回的高度场必须乘上实际的步长(像素尺寸投射都物体空间的值)。像素在物体空间的尺寸通过相机中的像素尺寸除以被镜头放大的倍数得到。

  • 执行信息
    • 多线程类型:可重入(可以和非排他性算子并行运行)
    • 多线程作用域:全局(可能在任意线程中调用)
    • 在内部数据层级上自动并行处理
  • 参数
    略。

  • 结果
    如果参数是有效的,返回2。如果有必要,会抛出异常。

  • 可能的前调函数
    optimize_fft_speed

  • 所属模块
    三维计量

图片来源于官方文档

photometric_stereo halcon光度立体法三维表面重建的更多相关文章

  1. halcon——缺陷检测常用方法总结(光度立体)

    引言 机器视觉中缺陷检测分为一下几种: blob+特征(官方示例surface_scratch.hdev) blob+差分+特征(官方示例pcb_inspection.hdev) 光度立体 特征训练 ...

  2. SLAM: Structure From Motion-移动中三维场景重建

    wiki链接:https://en.wikipedia.org/wiki/Structure_from_motion 三维重建: 三维物体建模总结 1. 视野内三维物体重建 : Kinect fusi ...

  3. Matlab绘图基础——绘制三维表面

    %绘制三维表面 ------------------------------------- %1.绘制线框图:mesh:每一条曲线称为mesh line %首先利用meshgrid函数产生平面区域内的 ...

  4. 激光三角法点云重建分享——halcon 方法

    如今视觉应用方面单纯依靠2D图像解决问题存在很多问题.稳定性差.定位不准确.还有配合机器人抓取方面只能抓高度一致的物品.其实在Halcon算法库有非常强大的三维算法.包括点云重建.激光三角法(2D相机 ...

  5. PCL: 根据几何规则的曲面剖分-贪婪法表面重建三角网格

    点云场景中进行物体识别,使用全局特征的方法严重依赖于点云分割,难以适应杂乱场景.使用局部特征,即对点云进行提取类似于3D SURF.ROPS之类的局部特征,需要寻找离散点云块的局部显著性. 点云的基本 ...

  6. java源码——计算立体图形的表面积和体积

    计算球,圆柱,圆锥的表面积和体积. 利用接口实现. 上代码. Contants.java 常量存储类 package com.fuxuemingzhu.solidgraphics.contants; ...

  7. vrn:基于直接体积回归的单幅图像大姿态三维人脸重建

    3D面部重建是一个非常困难的基本计算机视觉问题.目前的系统通常假设多个面部图像(有时来自同一主题)作为输入的可用性,并且必须解决许多方法学挑战,例如在大的面部姿势,表情和不均匀照明之间建立密集的对应. ...

  8. 单目三维稠密重建方案:Quadtree-accelerated Real-time Monocular Dense Mapping

    论文:This is a monocular dense mapping system following the IEEE Robotics and Automation Letters (RA-L ...

  9. halcon 分水领域法详解(转载)

    寻思自己写了的,但是这个大佬写的太好了,感谢Y忍冬草_ http://blog.csdn.net/y363703390 https://blog.csdn.net/y363703390/article ...

随机推荐

  1. charles 客户端进程

    本文参考:charles 客户端进程 客户端进程工具/client_process 显示使每个请求的本地客户端进程; 客户端进程工具显示负责进行每个请求的本地客户端进程的名称. 客户端进程通常是您的W ...

  2. Linux之文件权限、用户管理

    世界真美好!

  3. LayUI 上传IE11上传格式错误之后, layer.load(1)的动画一直在,没有关闭(仅限IE11)

    这个问题,测试反馈的时候,有丝丝的不相信,毕竟layui大家都是那么用的,结果后来用最简单的测试,发现确实会出现动画一直在的情况,如下: 上网搜索,也没发现一些有效的信息,最后就是自己读upload. ...

  4. Python学习笔记整理总结【Django】Ajax

     一.Ajax(part1) Ajax即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,AJAX = ...

  5. Spring 事务注解@Transactional

    事务管理一般有编程式和声明式两种,编程式是直接在代码中进行编写事物处理过程,而声名式则是通过注解方式或者是在xml文件中进行配置,相对编程式很方便. 而注解方式通过@Transactional 是常见 ...

  6. TP5安装workerman版本的坑

    今天想在TP5上安装workerman,用于个人学习,然后悲剧的是,第一步就卡住了,根据手册里说的首先通过composer安装 composer require topthink/think-work ...

  7. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理三 (二十一)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  8. IDEA 学习笔记之 Web项目开发

    Web项目开发: 添加新模块: 起名: 添加jars: 添加Tomcat/local: 添加项目:  启动Tomcat: 看到web页面: 修改页面: 重新部署页面:

  9. Vim 使用 DrawIt 画图

    简介 DrawIt 插件用来在 Vim 中进行简单的画图功能.可以方便地移动光标并画出横线.竖线.斜线.箭头和交叉字符,也带有实用的画图功能,轻松画带箭头的线.矩形及椭圆. 官方主页:https:// ...

  10. MySQL日期和时间类型笔记

    最近在看<MySQL技术内幕:SQL编程>并做了笔记,这是一篇笔记类型博客,分享出来方便自己复习,也可以帮助其他人 一.日期时间类型所占空间对比 各种日期时间数据类型所占的空间: 类型 所 ...