项目中需要判断两条线段的相似程度并给出得分
容易想到利用OpenCV中的Hough变换将直线变为Hough空间中的点
再求参考点与观测点在Hough空间中的距离
上述方法理论可行,实际操作中存在偏差
例如直线y = kx + b
变换为(k,b)
后很容易受到斜率k
的影响而离群,实则b
差别较小
上图,因为受到k
值惩罚Line_0
会比Line_1
更离群,尝试加权或取对数效果都不理想
采用ro和theta的Hough变换效果依旧,受ro影响较大存在误判
痛定思痛,重新思考如何评估描述线段相似的代价函数,两条线段越接近看作越相似
因此问题转化为计算待测线段中点向参考线的投影距离,即向量e的模长
用Python很容易实现,将向量标示为np.array([x,y])
形式可直接进行向量运算
最后结果需要用到np.linalg.norm(x)
该函数默认求二范数,即模长
代码实现
a = np.array([1,2])
b = np.array([3,4])
c = (a.dot(b) / np.linalg.norm(b)**2) * b
dist = np.linalg.norm(a - c)