使用python从opencv中findcontours检测到的单个轮廓提取坐标

使用python从opencv中findcontours检测到的单个轮廓提取坐标,python,arrays,numpy,Python,Arrays,Numpy,这里是我的代码,用于存储OpenCV python中的(x,y),它由cv2.findcontours找到 我选择了一个随机轮廓 c=contour[6] 现在我想在一个单独的数组中检测x和y值来执行一些操作 numpy数组以这种方式存储 [[[ 746 997]] [[ 744 998]] [[ 742 999]] [[ 740 1000]]] 我试着用它来提取x值 x = c[:,[0]] 但我得到的是相同的数组 所以我尝试使用这个循环来提取 for a in c:

这里是我的代码,用于存储OpenCV python中的
(x,y)
,它由
cv2.findcontours
找到

我选择了一个随机轮廓

c=contour[6]
现在我想在一个单独的数组中检测x和y值来执行一些操作

numpy数组以这种方式存储

[[[ 746  997]]
 [[ 744  998]]
 [[ 742  999]]
 [[ 740 1000]]]
我试着用它来提取x值

x = c[:,[0]]
但我得到的是相同的数组

所以我尝试使用这个循环来提取

    for a in c:
      for b in a:
        s_x = np.append(s_x, b[0])
        s_y = np.append(s_y, b[1])

有没有一种简单的方法来选择x坐标,而不是通过循环而完全没有这个错误?

似乎您的数组有一个额外的维度,所以您可以删除它,然后索引就可以了

cnt = cnts[1]             # choose one 
cnt = cnt.reshape(-1,2)   # change the shape 
xs  = cnt[:,0]            # get xs
x = c.squeeze()[:, 0]

看起来您的数组有一个额外的维度,所以您可以删除它,然后索引就可以工作了

x = c.squeeze()[:, 0]

你的数组有三个维度。可以使用“形状”属性查看详细信息

import numpy as np

c = np.array([[[ 746,  997]],
              [[ 744,  998]],
              [[ 742,  999]],
              [[ 740, 1000]]])
print(c.shape)
(4,1,2)

获得形状后,对阵列进行切片

x = c[:,0,0]
print(x)

[746 744 742 740]

您的阵列有三个维度。可以使用“形状”属性查看详细信息

import numpy as np

c = np.array([[[ 746,  997]],
              [[ 744,  998]],
              [[ 742,  999]],
              [[ 740, 1000]]])
print(c.shape)
(4,1,2)

获得形状后,对阵列进行切片

x = c[:,0,0]
print(x)

[746 744 742 740]

使用挤压:
c.squeeze()[:,0]
您有一个额外的维度。@COLDSPEED您能在答案中写下这个吗?这个解决方案确实奏效了。可能会帮助某人某人可能是你主动提出的另一天,谢谢。当你在它的时候,考虑一下。@ CaldSub我尝试使用<代码> x= NP。级联(x,SaleType C)< /C> >但是它的同样的错误<代码> Type错误:只有整数标量数组可以转换成标量索引< /代码> AH,我的答案不起作用吗?使用挤压:<代码> C.C挤压():[,0 ]你有一个额外的维度。@COLDSPEED你能把这个写在答案中吗?这个解决方案确实奏效了。可能会帮助某人某人可能是你主动提出的另一天,谢谢。当你在它的时候,考虑一下。@ CaldF速度,我尝试使用<代码> x= NP。级联(x,SaleType C)< /C> >但是它的同样错误<代码> Type错误:只有整数标量数组可以转换为标量索引 AH,我的答案不起作用吗?