我有一张简单的黑白曼陀罗的图片。我正在使用 Python、cv2 和 numpy。我的目标是获取 X、Y 坐标的轮廓并将其保存在 gcode 文件中。问题是我得到了一些不同长度的轮廓作为轮廓。像这样: 作为输出,我想要这样的东西: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
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))