1、创建模板,取模板的中心点为参考点(xo, yo)。梯度方向取整后可能的方向是360个,对模板轮廓上的点(xc, yc)(通过Canny算子与Sobel算子检测)求出其梯度方向取整,并且轮廓上的点与参考点之间有一个相对位置(xc- xo, yc- yo),将所以轮廓点的相对位置坐标根据梯度方向建立一个R表保存下来
方向角 | 相对坐标信息 |
---|---|
梯度方向角1° | (x11- xo, y11- yo),(x21- xo, y21- yo),… |
梯度方向角2° | (x12- xo, y12- yo),(x22- xo, y22- yo),… |
。。。。。。 | 。。。。。。 |
梯度方向角360° | (x1360- xo, y1360- yo),(x2360- xo, y2360- yo),… |
每个方向角中,点的数量不一样,从保存的相对坐标信息很容易可以得到边缘点到参考点的距离 ,
矢量方向为。
2、检测目标,对目标图像做同样的边缘检测(Canny & Sobel),再预处理图像,构建的累加器如图所示。
由于图像中的目标较模板除了中心位置还有旋转角度上的变化,所以针对每个角度下都构建了一个累加器,当旋转到某一个角度A的时候,计算出sinA,cosA。
遍历找到测试图中的边缘点,该点实际的方向角是arctan(dy/dx),但由于认为目标在图像中旋转了A°,所以将测试图边缘点的角度标准化到假如目标未发生旋转时的方向角n=arctan(dy/dx)-A。
查R表,模板中方向角为n时,所有边缘点与中心点的相对坐标信息。计算模板中方向角为n的每个点旋转A°后的坐标信息。
当方向角为n时,通过测试图中的点坐标、模板图中的边缘点和中心的相对位置关系,估计测试图中目标的中心坐标,对各点分别进行投票。得到角度为A时的累加器,最终一共得到了360(每个角度一个累加器)+2(相当于边缘扩展了一下)个累加器。
得到累加器后需要找到最佳的位置。每个累加器中每个点的得票需要大于投票阈值&大于前后两个累加器对应点的得票数&大于当前行的前后列&大于当前列的前后行的得票数,才保存该点的坐标位置及得票数等信息。
此时已统计出了所有符合条件的点,需要进一步筛选优化。依据点的得票数将每个点的信息进行排序,并设定阈值(近似于限定方圆几里之内只能有一个目标的阈值),最后输出得票较高的结果。