img = cv2.imread('gaussian.bmp', cv2.IMREAD_GRAYSCALE) # 提取骨架线 skeleton = cv2.ximgproc.thinning(img) # 获取骨架线路径 contours, hierarchy = cv2.findContours(skeleton, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] # 确定骨架线的宽度 width = 2 # 将骨架线离散化为一系列点 skeleton_points = [] for i in range(len(cnt) - 1): p1 = cnt[i][0] p2 = cnt[i + 1][0] rr, cc = line_nd(p1, p2) for j in range(len(rr)): skeleton_points.append([rr[j], cc[j], width]) skeleton_points = np.array(skeleton_points) # 使用Marching Cubes算法进行三维重建 verts, faces, _, _ = measure.marching_cubes(skeleton_points, 0.1) # 绘制三维模型 fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection='3d') ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='jet')
这段代码使用OpenCV和scikit-image库实现了三维重建。首先,使用OpenCV的imread
函数读取名为'gaussian.bmp'的灰度图像。然后,使用OpenCV的thinning
函数提取骨架线。接下来,使用findContours
函数获取骨架线的轮廓。通过对骨架线进行离散化,得到一系列三维点。最后,使用marching_cubes
函数对这些点进行三维重建,得到三维模型。最后,使用Matplotlib库绘制三维模型。
需要注意的是,在代码中使用了line_nd
函数,这个函数不是Python内置函数,可能是自定义的函数。如果你想运行这段代码,请确保你已经定义了line_nd
函数并且已经导入了必要的库。
修改为contours, hierarchy = cv2.findContours(skeleton, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:],程序运行提示ValueError: not enough values to unpack (expected 3, got 2),img = cv2.imread('gaussian.bmp', cv2.IMREAD_GRAYSCALE) skeleton = cv2.ximgproc.thinning(img) contours, hierarchy = cv2.findContours(skeleton, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] width = 2 # 将二维骨架图沿着Z轴堆叠,得到一个三维数组 skeleton_3d = np.zeros((skeleton.shape[0], skeleton.shape[1], 10), dtype=np.uint8) for i in range(10): skeleton_3d[:, :, i] = skeleton # 获取骨架线路径 skeleton_points = [] for i in range(len(cnt) - 1): p1 = cnt[i][0] p2 = cnt[i + 1][0] rr, cc, zz = line_nd(p1 + (0,), p2 + (9,)) for j in range(len(rr)): skeleton_points.append([rr[j], cc[j], zz[j], width]) skeleton_points = np.array(skeleton_points) # 使用Marching Cubes算法进行三维重建 verts, faces, _, _ = measure.marching_cubes(skeleton_3d, 0.1) # 绘制三维模型 fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection='3d') ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='jet')
这个错误通常出现在使用解包(unpacking)语法时,期望得到的变量数量与实际值数量不符导致的。在这个代码中,可能是在调用 cv2.findContours 函数时出现了这个错误。
如果你的代码运行出现 "ValueError: not enough values to unpack (expected 3, got 2)" 的错误,说明 cv2.findContours
函数返回的值不是一个包含三个元素的元组,而是只有两个元素。这很可能是因为你使用的 OpenCV 版本不同,或者你的输入图像不符合要求,没有被正确处理。
你可以尝试修改代码,使用以下方式来接收函数返回的值:
contours, hierarchy = cv2.findContours(skeleton, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]
这种写法可以确保只获取到前两个元素,而忽略掉可能存在的第三个元素,即使 cv2.findContours
函数返回的元素数量发生了变化,也可以正确获取到需要的值。
如果你的代码仍然出现相同的错误,你可以尝试检查输入图像是否符合要求,或者尝试使用不同的 OpenCV 版本。如果仍然无法解决问题,可能需要进一步调试和排查。
程序运行提示ValueError: not enough values to unpack (expected 3, got 2),img = cv2.imread('gaussian.bmp', cv2.IMREAD_GRAYSCALE) # 提取骨架线 skeleton = cv2.ximgproc.thinning(img) # 获取骨架线路径 contours, hierarchy = cv2.findContours(skeleton, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:] cnt = contours[0] # 确定骨架线的宽度 width = 2 # 将二维骨架图沿着Z轴堆叠,得到一个三维数组 skeleton_3d = np.zeros((skeleton.shape[0], skeleton.shape[1], 10), dtype=np.uint8) for i in range(10): skeleton_3d[:, :, i] = skeleton # 获取骨架线路径 skeleton_points = [] for i in range(len(cnt) - 1): p1 = cnt[i][0] p2 = cnt[i + 1][0] rr, cc, zz = line_nd(p1 + (0,), p2 + (9,)) for j in range(len(rr)): skeleton_points.append([rr[j], cc[j], zz[j], width]) skeleton_points = np.array(skeleton_points) # 使用Marching Cubes算法进行三维重建 verts, faces, _, _ = measure.marching_cubes(skeleton_3d, 0.1) # 绘制三维模型 fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection='3d') ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='jet')
这个错误提示是因为在对 contours
和 hierarchy
变量进行解包时,期望得到 3 个值,但是只得到了 2 个值。这通常是由于使用了不同版本的 OpenCV 库或者不同的函数参数导致的。你可以尝试修改解包语句 contours, hierarchy = cv2.findContours(skeleton, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]
,将其改为 _, contours, hierarchy = cv2.findContours(skeleton, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
,这样就可以忽略第一个返回值,直接解包后面的两个返回值了。
相关推荐











