如何从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
相关产品推荐
相关产品推荐

