You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从contours数组中提取X、Y坐标至两个独立数组?

如何从OpenCV的findContours结果中拆分X、Y坐标到独立数组

首先修正你代码里的一处细节:OpenCV新版本的findContours函数会返回两个值——轮廓数组和层级结构,需要正确接收返回值才能正常处理后续逻辑。

针对拆分坐标的需求,具体步骤如下:

  • 提取目标轮廓(你使用了RETR_EXTERNAL模式,取第一个轮廓contours[0]即可,对应污渍的外边缘)
  • 将轮廓数组从(N,1,2)的嵌套形状重塑为(N,2),简化坐标拆分操作
  • 通过数组索引直接拆分出独立的X、Y坐标数组

以下是修改后的完整代码:

import cv2
import numpy as np

img = cv2.imread("/content/test_picture.jpg")

gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 将灰度图转换为二值图
ret, thresh = cv2.threshold(gray_image, 127, 255, 0) 
# 计算二值图的矩
M = cv2.moments(thresh)
# 计算目标中心坐标
centrX = int(M["m10"] / M["m00"]) # 中心X坐标
centrY = int(M["m01"] / M["m00"]) # 中心Y坐标

cv2.circle(img, (centrX, centrY), 2, (255, 0, 0), -1)

# 正确接收findContours的返回值
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 提取第一个轮廓并重塑形状,去掉多余的嵌套维度
contour_points = contours[0].reshape(-1, 2)
# 拆分X、Y坐标到独立数组
x_coords = contour_points[:, 0]
y_coords = contour_points[:, 1]

# 验证结果(打印前5个坐标示例)
print("X坐标数组前5个值:", x_coords[:5])
print("Y坐标数组前5个值:", y_coords[:5])

# 可选:直接计算中心到每个边缘点的向量长度
distances = np.sqrt((x_coords - centrX)**2 + (y_coords - centrY)**2)
print("前5个向量长度:", distances[:5])

关键说明

  • 原始轮廓数组contours[0]的形状是(N,1,2),其中N是边缘点数量,额外的嵌套维度会增加操作复杂度,reshape(-1,2)可以将其转换为N行2列的直观结构,每一行对应一个点的(X,Y)坐标。
  • contour_points[:,0]取所有行的第0列,得到所有X坐标的numpy数组;contour_points[:,1]取所有行的第1列,得到所有Y坐标的numpy数组,这种结构非常适合后续的数值计算。

内容的提问来源于stack exchange,提问作者Dalivania

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:26:07