在OpenCV中将轮廓转换为2D点列表

8
以下是OpenCV返回的轮廓结构。它是深度嵌套的,元组的第一个元素是轮廓中的点列表。
有什么办法将其转换为2d点列表(n x 2)?我认为可以使用numpy.reshape,但我找不到一种非常通用的方法来做到这一点。谢谢。
contours = cv2.findContours(bw_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours =>
   ([array([[[ 19,  20]],

   [[ 18,  21]],

   [[ 17,  21]],

   [[ 17,  22]],

   [[ 16,  23]],

   [[ 16, 130]],

   [[ 17, 131]],

   [[ 17, 132]],

   [[ 21, 132]],

   [[ 43, 110]],

   [[ 44, 110]],

   [[ 75, 141]],

   [[ 81, 141]],

   [[109, 113]],

   [[145, 149]],

   [[149, 149]],

   [[149,  21]],

   [[148,  21]],

   [[147,  20]]], dtype=int32)], array([[[-1, -1, -1, -1]]], dtype=int32))

1
在这里要小心一点。轮廓是点的有序列表。如果你只是将它们全部连接成一个单一的列表,那么你会破坏该顺序(你不能再使用矩或类似的函数对其进行操作)。 - berak
1个回答

10
import numpy as np

contours, hierarchy = cv2.findContours(bw_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = np.vstack(contours).squeeze()

请注意,cv2.findContours实际上会返回两个项目。 这里的“轮廓”是一个列表。 因此,我们使用numpy的 vstack() 将它们堆叠在一起,然后使用 squeeze() 去除任何冗余轴。


谢谢,这真的很有帮助。对我来说,在挤压之后需要一个额外的步骤contours= [ np.array(contours) ] - equiman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接