Python 使用修改的Hausdorff距离查找形状
我有两张图片,它们有相同的形状,但排列在不同的地方。我想正确匹配这些图像 执行的步骤。。。 从源图像中获取轮廓。 从目标图像中获取轮廓。 使用修改的Hausdorff距离比较源到目标的轮廓。 获取最小值作为匹配项 def改良型豪斯多尔法,B: D=cdistA,B欧几里得距离 fhd=np.meannp.minD,轴=0 rhd=np.meannp.minD,轴=1 返回maxfhd,rhd 源图像 目标图像Python 使用修改的Hausdorff距离查找形状,python,opencv,image-processing,computer-vision,pattern-recognition,Python,Opencv,Image Processing,Computer Vision,Pattern Recognition,我有两张图片,它们有相同的形状,但排列在不同的地方。我想正确匹配这些图像 执行的步骤。。。 从源图像中获取轮廓。 从目标图像中获取轮廓。 使用修改的Hausdorff距离比较源到目标的轮廓。 获取最小值作为匹配项 def改良型豪斯多尔法,B: D=cdistA,B欧几里得距离 fhd=np.meannp.minD,轴=0 rhd=np.meannp.minD,轴=1 返回maxfhd,rhd 源图像 目标图像 这是一项双向任务 前进方向 一,。翻译 对于每个轮廓,计算其轮廓。然后,对于该等高线中
这是一项双向任务 前进方向 一,。翻译 对于每个轮廓,计算其轮廓。然后,对于该等高线中的每个点,围绕力矩进行平移,即等高线。点[i]=等高线。点[i]-等高线。力矩[i]。这会将所有轮廓点移动到原点 PS:您需要跟踪每个轮廓产生的力矩,因为它将在下一节中使用 二,。轮换 使用新转换的点,计算它们的值。这将为您提供旋转角度。根据此角度,您需要计算要旋转此轮廓的新角度;会有帮助的 获得新角度后,计算新角度。记住,这里的中心将是原点,即0,0。在计算旋转矩阵时,我没有考虑缩放,这是金字塔发挥作用的地方,因此我通过了1 PS:您需要跟踪每个轮廓生成的矩阵,因为它将在下一节中使用 使用此矩阵,可以继续旋转轮廓中的每个点,如图*所示 完成所有这些后,您可以继续计算Hausdorff距离,并找到通过设置阈值的轮廓 反向 在第一部分中所做的一切都必须撤消,以便我们能够在相机馈送上绘制有效的轮廓 一,。轮换 回想一下,每个检测到的轮廓都产生了一个旋转矩阵。要撤消有效轮廓的旋转。只需执行相同的旋转,但使用 PS:当计算逆矩阵时,如果生成的矩阵不是平方矩阵,它将失败。cv2.DECOMP_SVD将生成逆矩阵,即使原始矩阵是非方矩阵 二,。翻译 随着有效轮廓的点向后旋转,您只需撤消先前执行的平移。不是减法,而是将力矩加到每个点上 现在,您可以继续并将这些轮廓绘制到摄影机提要 缩放比例 这是图像金字塔发挥作用 您所要做的就是按固定的大小/比率调整模板图像的大小,直到达到所需的层数。该教程很好地解释了如何在OpenCV中实现这一点 不言而喻,你选择的调整图像大小的值和层数将并且确实对你的程序的健壮性起着巨大的作用 把它们放在一起 模板图像操作 此操作只能执行一次,并且只能存储旋转点的结果 摄像机馈送操作 假设 让模板图像在每个级别的旋转轮廓存储在templ_轮廓中。所以如果我说templ_轮廓[0],这将给我金字塔级别0的旋转轮廓 让图像的平移、旋转轮廓和矩分别存储在transCont、rotCont和矩中
image_contours = Find Contours
for each contour detected in image
moment = calculate moment
for each point in image_contours
transCont.thisPoint = forward_translate(image_contours.thisPoint)
rotCont.thisPoint = forward_rotate(transCont.thisPoint)
for each contour_layer in templ_contours
for each contour in rotCont
calculate Hausdorff Distance
valid_contours = contours_passing_distance_threshold
for each point in valid_contours
valid_point = backward_rotate(valid_point)
for each point in valid_contours
valid_point = backward_translate(valid_point)
drawContours(valid_contours, image)
一开始可能会有点混乱,特别是在跟踪每个轮廓各自的力矩和旋转矩阵时,但是一旦你了解了发生了什么,这确实是一个非常容易实现的算法。到底是什么问题?问题是修改的Hausdorff距离使用位置来计算两个形状之间的相似性。因为它计算形状A和形状B的点集之间的距离,因此使其平移不变。我需要一些东西来制作这个RSTInvariant。我在Hausdorff距离方面遇到了类似的问题。为了解决翻译问题,我翻译了所有要点;模板和框架,返回原点。关于旋转,我旋转了帧点以匹配模板点的角度。Scale是你的朋友,如果你加上你正在寻找旋转、缩放和平移不变的解决方案,那会更有帮助。谢谢,@eshirima。你能分享你的代码或片段吗?那真的很有帮助。下次我会更加小心地给出问题的全部细节。非常感谢。我一定要试一试
Create a pyramid consisting of n layers
For each layer in n
Find contours
Translate the contour points
Rotate the contour points
image_contours = Find Contours
for each contour detected in image
moment = calculate moment
for each point in image_contours
transCont.thisPoint = forward_translate(image_contours.thisPoint)
rotCont.thisPoint = forward_rotate(transCont.thisPoint)
for each contour_layer in templ_contours
for each contour in rotCont
calculate Hausdorff Distance
valid_contours = contours_passing_distance_threshold
for each point in valid_contours
valid_point = backward_rotate(valid_point)
for each point in valid_contours
valid_point = backward_translate(valid_point)
drawContours(valid_contours, image)