【问题标题】:Convert contour to 2d point list in opencv在opencv中将轮廓转换为二维点列表
【发布时间】:2014-04-08 08:00:38
【问题描述】:

以下是OpenCV返回的轮廓结构。它嵌套很深,元组的第一个元素是轮廓中的点列表。

有没有办法将其转换为二维点列表 (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))

【问题讨论】:

  • 在这里稍微谨慎一点。轮廓是点的有序列表。如果您将它们全部加入一个列表中,那么您会破坏该顺序(您不能再在其上使用时刻或类似内容)。

标签: python opencv numpy


【解决方案1】:
import numpy as np

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

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

【讨论】:

  • 谢谢,真的很有帮助。对我来说,挤压后需要额外的步骤contours= [ np.array(contours) ]
猜你喜欢
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 2013-03-23
  • 2017-02-28
  • 1970-01-01
  • 2011-09-14
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多