当轮廓中有多个数组时,如何从cv2 findContours转换为np数组?

问题描述 投票:0回答:1

我有一张简单的黑白曼陀罗的图片。我正在使用 Python、cv2 和 numpy。我的目标是获取 X、Y 坐标的轮廓并将其保存在 gcode 文件中。问题是我得到了一些不同长度的轮廓作为轮廓。像这样:array([[[179,  50]], ...... [[131,  85]]], dtype=int32), array(...), array(...). 作为输出,我想要这样的东西:np.array points[X][Y].

我获取轮廓的代码:

 img = cv2.imread(image_path,0)
    assert img is not None, "file could not be read, check with os.path.exists()"
    ret, thresh = cv2.threshold(img, 127, 255, 0)
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

首先我用这个来保存积分:

    points = []
    for contour in contours:
        points.extend(contour)

    return points

但我希望它们在 np 数组中正确保存它们,并可以将它们转换为干净的 csv 文件。 我尝试过这样的:

 maxlength = max(len(contour) for contour in contours)
    cnts = []
    for contour in contours:
        padded_contour = np.pad(contour, ((0, maxlength - len(contour)), (0, 0)), mode='constant')
        cnts.append(padded_contour)

    cnts_array = np.array(cnts)

但这给了我这个错误:“ValueError:操作数无法与重新映射的形状[原始->重新映射]一起广播:(2,2)和请求的形状(3,2)”。

我有点困惑,因为这应该是很多使用 cv2 的人都应该遇到的问题,但我找不到解决方案。

谢谢你。

编辑 这样它就可以工作,但它会在图片中产生一些奇怪的线条:

    all_points = []

for contour in contours:
    for point in contour:
        x, y = point[0]  # Extract x and y coordinates from the contour
        all_points.append([x, y])

# Convert the list of points to a NumPy array
contours_array = all_points  # np.array(all_points)
return contours_array

输出是这样的:Strange lines in picture

python numpy opencv image-processing numpy-ndarray
1个回答
0
投票
import numpy as np

cnts = []
for cnt in contours: 
    cnt = np.squeeze(np.array(cnt, dtype=int), axis=1)
    cnts.append(cnt)

## Array of Shape N x 2, N: number of contours, 2: x,y
final_array = np.vstack((cnts))
© www.soinside.com 2019 - 2024. All rights reserved.