【问题标题】:Sorting through findContours()'s return value; contours list对 findContours() 的返回值进行排序;轮廓列表
【发布时间】:2021-08-21 22:27:01
【问题描述】:

我在对轮廓进行排序时遇到问题。

我在图像中有两列和 K(变量)行,我正在尝试绘制轮廓然后裁剪。我可以做到这一点,但我需要它们按特定顺序返回。

自从我设法对它们进行排序以来,我已经完成了一半; 第一列首先在轮廓列表中返回,然后在完成后转到第二列并遍历其所有行。

这些是对列表进行排序的代码行:

contours, hierarchy = cv2.findContours(dilated_value, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours.sort(key=lambda c: np.min(c[:, :, 0]))
contours.reverse()

我需要得到一个返回值:[[Column1, row1], [Column2, row1], ....] 等等。

这里有一个更具体的例子。

现在它的存储方式如下:

我应该在那个排序指令中改变什么

【问题讨论】:

    标签: python numpy opencv computer-vision


    【解决方案1】:

    基本上你可以做的是简单地得到所有的轮廓,然后找到所有可以用它们形成的多边形。您可以删除较大的,因为您不需要整个表格或整个行/列的轮廓。一旦你把它们过滤掉,你就会留下小的,即细胞。然后您可以轻松地提取它们并根据它们的质心对它们进行索引。使用这些质心,您将知道每个质心的位置,并可以根据您的选择将它们放在任何位置。

    【讨论】:

    • 找到了您可以在下面查看的答案。感谢您的建议。
    【解决方案2】:

    another question找到答案。

    它就像魔术一样工作,请确保为他们投票并对原始答案表示感谢。

    def get_contour_precedence(contour, cols):
        origin = cv2.boundingRect(contour)
        return origin[1] * cols + origin[0]
    
    
    contours.sort(key=lambda x:get_contour_precedence(x, image.shape[1]))
    

    可以在原始答案中找到写得很好的解释,但代码是不言自明的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2019-01-03
      • 2012-07-03
      • 2020-09-03
      • 1970-01-01
      相关资源
      最近更新 更多