我怎样才能匹配两个撕裂的边缘?

Ste*_*hke 5 opencv contour

链接到代码要点。我正在尝试重建一张破纸。第一步是检测撕裂边缘:

找到撕裂的边缘

接下来,旋转一条撕裂边并与另一条撕裂边进行比较:

旋转和匹配

当两个轮廓相互匹配时,文档被对齐。旋转一件并比较撕裂的边缘。一个名为的分数match描述了两个轮廓之间的匹配:

tempA = draw_contour(tempA, b, 123, 3)
tempB = draw_contour(tempB, a, 123, 3)
tempC = tempA + tempB
_, thresh = cv2.threshold(tempC, 220, 255, cv2.THRESH_BINARY_INV);
thresh = 255 - thresh
match = sum(sum(thresh))
Run Code Online (Sandbox Code Playgroud)

这两个轮廓不能很好地结合在一起: 不合适 这些轮廓非常吻合。这里的文件是对齐的: 很合身

轮廓匹配的计算是基本的。我在单独的图像上绘制轮廓。对图像求和并应用阈值。这会计算两个轮廓重叠的像素数。这种方法效果很好,但在比较多个边时速度太慢,不实用。

如何计算撕裂边缘的两个轮廓的匹配程度?

dha*_*hka 0

假设没有并发症(请参阅上面我的评论),您可以尝试下面概述的过程。见下图。

边缘

  • 计算连接边 1 端点的直线方程
  • 计算连接边2端点的直线方程
  • 计算这两条直线之间的角度
  • 这为您提供了两种角度的可能性:alpha180-alpha
  • 找到两条直线段的中点并将它们对齐(图中未显示。可能您已经在做一些对齐曲线的事情了)
  • 然后,尝试这两个角度,根据您的匹配成本,看看哪一个给出了最佳匹配