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

r7knjye2  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(120)

我有一张简单的白色曼荼罗的图片。我使用Python、cv 2和numpy。我的目标是得到轮廓的X,Y坐标,并将它们保存在一个gcode文件中。问题是,我得到的轮廓是几个不同长度的数组。像这样:[array([179, 50, ...... 131, 85], dtype=int32), array(...), array(...).](https://i.stack.imgur.com/U1vPI.png)作为输出,我想要这样的东西: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文件,我尝试了这样的smth:

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:operations could not be broadcast with remapped shape [original->remapped]:(2,2)and requested shape(3,2)”(值错误:操作数不能与重新Map的形状[original-> remapped]:(2,2)和请求的形状(3,2)一起广播)。
我有点困惑,因为这应该是一个问题,很多人谁是使用cv 2应该有,我找不到一个解决方案。
谢谢

编辑使用此功能可以正常工作,但会在图片中出现一些奇怪的线条:

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

klr1opcd

klr1opcd1#

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))

字符串

相关问题