在获取了矩形特征后,要计算矩形特征的值。Viola等人提出了利用积分图求特征值的方法。积分图的概念可用图3表示:
坐标A(x,y)的积分图是其左上角的所有像素之和(图中的阴影部分)。定义为:
其中ii(x,y)表示积分图,i(x,y)表示原始图像,对于彩色图像,是此点的颜色值;对于灰度图像,是其灰度值,范围为0~255。
在上图中,A(x,y)表示点(x,y)的积分图;s(x,y)表示点(x,y)的y方向的所有原始图像之和。积分图也可以用公式(2)和公式(3)得出:
法线方向基本一致朝向视点,利用此方法进行法线估计只适用于有序点云,对于无序点云就只能采用其他方法了。
具体代码如下:
import pcl
import pcl.pcl_visualization
cloud = pcl.load('1.pcd')
print ('load 1.pcd')
print ('make_IntegralImageNormalEstimation: ')
ne = pcl.IntegralImageNormalEstimation(cloud)
print ('set_NormalEstimation_Method_AVERAGE_3D_GRADIENT: ')
ne.set_NormalEstimation_Method_AVERAGE_3D_GRADIENT ()
print ('set_MaxDepthChange_Factor: ')
ne.set_MaxDepthChange_Factor(0.02)
print ('set_NormalSmoothingSize: ')
ne.set_NormalSmoothingSize(10.0)
print ('set OK')
print ('compute - start')
normals = ne.compute()
print ('compute2 - end')
print (str(normals.size))
viewer = pcl.pcl_visualization.PCLVisualizering()
viewer.SetBackgroundColor (0.0, 0.0, 0.5)
viewer.AddPointCloudNormals(cloud, normals)
flag = True
while (flag):
flag != viewer.WasStopped ()
viewer.SpinOnce ()
end