描述:
photometric_stereo能够用来从一个物体的两维纹理,例如它的打印照片,来区分出它的三维形状。这个算子须要至少须要三张使用已知的不一样方向的光源拍摄的相同物体的图像。注意,拍摄这些照片时,相机的视角应该是固定的。(译者注:即固定相机和物体,从多个已知的不一样方向打光拍摄)
物体的这种三维形状从根本上来讲是经过计算3维表面的局部梯度。这些梯度能够被进一步综合起来获取到一个高度场,也就是说,一张图片的每一个像素都与一个相对高度相关联。(译者注:计算得出的)二维的纹理被称为反照率,与对局部光源的吸取和反射表面特征有关,把全部的阴影都排除在外。算法
光照立体法的典型应用
光照立体法的典型应用是用来检测表面的变化,这种变化可能意味着缺陷,或者被用来将拍照时光照角度的影响排除在外,例如用于非扁平字符的打印检查。注意,光度立体法不适用于重建绝对高度,也就是说,它不能替代传统的3D重建算法,如对焦测距和激光三角测量。数组
光度立体法的局限性
光度立体法是基于Woodham算法,所以假设相机表现为无畸变的投影。这也就意味着,你必须使用一个远心镜头或者长焦镜头。另外一方面,它假设了每一个光源发出的都是平行的等截面的光。这也就是说,你使用的照明必须是远心光源,有着均匀的强度,或者做为替代,远距离的点光源。此外,这个物体必须有朗伯反射特性,也就是说它对光的反射是漫反射。有镜面反射的物体或者区域(镜子或者光滑的表面)不能被正确处理,会获得一个错误的结果。多线程
照片采集设置
这个使用远心镜头的相机必须被放置得和被重建的平面正交,即互相垂直。相机和平面的角度在采集过程当中必定不能改变。相反,光源和平面的夹角必须至少改变三次来获取三张灰度图片。函数
Slants
这个角度指的是相机的光轴和光线的夹角。如图:
ui
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)。这种模式在某些状况下是合适的,例如在图像处理时排除个别图像上的特别的区域。这些区域多是已知的表现出非朗伯反射特性的区域或者包含了偏光信息的区域,例如影子。排除这些点能够致使更准确的结果。请注意,最后一种模式与前两种相比,显著须要更多的处理时间。(译者注:这种状况下每张图片的定义域都有可能不一样)code
输出图片
这个算子输出了重建图像的梯度,反射率,和表面的高度场图像。
* 梯度图像是一个向量场,包含了表面的偏导数。记住,梯度能够被用做算子 reconstruct_height_field_from_gradient
的输入参数。为了更直观的目的,替表明面梯度,能够返回标准化以后的表面梯度。为了达到这样的目的,'ResulltType' 必须被设置为 normalized_gradient
而不是 gradient
。这里,行和列元素表明了标准化以后的行和列。若是 ResultType
被设置为了 all
,就会使用gradient
而不是 normalized_gradient
。
* 反射率图像描述了反射辐射和入射辐射的比例,数值在1(白色表面)-0(黑色表面)之间。所以,反射率是表面的一个特征。举个例子,对一个印刷表面来讲,反射率与把全部入射光排除在外(阴影,明暗)的印刷图片有关。
* 高度场图像的每一个像素与相对高度相关。orm
默认状况下,上面这些对象都会返回,也就是说,参数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
所属模块
三维计量
图片来源于官方文档