首页 > 解决方案 > 如何在深度图像中找到 ax,y 坐标

问题描述

我正在使用 Open3d a OpenCV 从点云制作深度图像,在深度图像中找到圆圈作为原始点云中的删除点。

我首先从 numpy 数组中制作点云,并用它来可视化它并捕获深度图像并将图像保存为 .png 。我还保存内部和外部相机参数。

之后,我用霍夫变换找到深度图像中的圆圈。从那里我得到中心像素(u,v)和圆的半径。

现在我想删除原始点云中这个圆圈内的所有点。所以我需要知道找到圆圈的点云的 x,y 。

所以我用这个,

x = (u - cx) * z / fx

y = (v - cy) * z / fy

其中 x,y 是点云坐标 u,v 是像素坐标 cx,cy,fx,fy 是内部方向参数。但我没有得到正确的价值观。

我的问题是如何找到圆圈内的所有点并删除它们,或者有更聪明的方法吗?

xyz = np.array([points[:, 0], points[:, 1], points[:, 2]]).T

XYZ = o3d.geometry.PointCloud()
XYZ.points = o3d.utility.Vector3dVector(xyz)
visZ = o3d.visualization.Visualizer()
visZ.create_window(width=1980, height=1080, left=5,top=5)
visZ.add_geometry(XYZ)
view_control = visZ.get_view_control()
camera_parameters = view_control.convert_to_pinhole_camera_parameters()
#print("# Initial camera parameters\n{}\n{}".format(camera_parameters.extrinsic, camera_parameters.intrinsic.intrinsic_matrix))
intri = camera_parameters.intrinsic.intrinsic_matrix
extri = camera_parameters.extrinsic
visZ.run()
image1 = visZ.capture_depth_float_buffer()
photo_save = np.asarray(image1)
plt.imsave("testov.png", \
           np.asarray(photo_save), dpi=1)
plt.imshow(np.asarray(photo_save))
plt.close()
plt.show()
visZ.destroy_window()
img = cv2.imread('testov.png',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1.5,20,
                           param1=50,param2=30,minRadius=0,maxRadius=50)
print(circles)

circles = np.around(circles)
for i in circles[0,:]:
   # draw the outer circle
   cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
   # draw the center of the circle
   cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)


cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = Image.open('testov.png')
size = w,h = image.size
data =image.load()
for u in range(w):
   for v in range(h):
       x = (data[u,0] - intri[0,2]) * data[u,3] / intri[0,0]
       y = (data[v,1] - intri[1,2]) * data[u,3] / intri[1,1]

标签: pythonnumpyopencvopen3d

解决方案


推荐阅读