openGL+open3d+python 鼠标拖动画矩形框选出点云数据的感兴趣区域代码
时间: 2023-06-25 17:07:10 浏览: 141
以下是一个简单的示例代码,用于实现在OpenGL窗口中使用鼠标拖动画矩形框选出点云数据的感兴趣区域。
```python
import open3d as o3d
from OpenGL.GL import *
from OpenGL.GLUT import *
# 全局变量
viewport = [0, 0, 800, 600] # 视口大小
mouse_start = [0, 0] # 鼠标起始点位置
mouse_end = [0, 0] # 鼠标结束点位置
box_start = [0, 0] # 矩形框起始点位置
box_end = [0, 0] # 矩形框结束点位置
box_width = 0 # 矩形框宽度
box_height = 0 # 矩形框高度
# 绘制函数
def draw():
# 清空屏幕
glClear(GL_COLOR_BUFFER_BIT)
# 绘制点云
glPointSize(2)
glBegin(GL_POINTS)
glColor3f(1, 0, 0) # 红色
for p in points:
glVertex3fv(p)
glEnd()
# 绘制矩形框
if box_width > 0 and box_height > 0:
glColor3f(0, 1, 0) # 绿色
glLineWidth(2)
glRectf(box_start[0], box_start[1], box_end[0], box_end[1])
# 刷新屏幕
glutSwapBuffers()
# 鼠标回调函数
def mouse(button, state, x, y):
global mouse_start, mouse_end, box_start, box_end, box_width, box_height
# 鼠标左键按下
if button == GLUT_LEFT_BUTTON and state == GLUT_DOWN:
mouse_start = [x, y]
box_start = [x, y]
# 鼠标左键释放
elif button == GLUT_LEFT_BUTTON and state == GLUT_UP:
mouse_end = [x, y]
box_end = [x, y]
box_width = abs(box_end[0] - box_start[0])
box_height = abs(box_end[1] - box_start[1])
# 在屏幕坐标系中将矩形框的坐标转换为OpenGL坐标系中的坐标
x1 = (2 * box_start[0] - viewport[2]) / viewport[2]
y1 = -(2 * box_start[1] - viewport[3]) / viewport[3]
x2 = (2 * box_end[0] - viewport[2]) / viewport[2]
y2 = -(2 * box_end[1] - viewport[3]) / viewport[3]
# 根据OpenGL坐标系中的坐标计算出选中的点云数据
selected_points = []
for p in points:
if x1 <= p[0] <= x2 and y1 <= p[1] <= y2:
selected_points.append(p)
# 将选中的点云数据转换为open3d格式并显示出来
if selected_points:
selected_pointcloud = o3d.geometry.PointCloud()
selected_pointcloud.points = o3d.utility.Vector3dVector(selected_points)
o3d.visualization.draw_geometries([selected_pointcloud])
glutPostRedisplay()
# 移动鼠标回调函数
def motion(x, y):
global box_end, box_width, box_height
# 更新矩形框的结束点位置和大小
box_end = [x, y]
box_width = abs(box_end[0] - box_start[0])
box_height = abs(box_end[1] - box_start[1])
# 刷新屏幕
glutPostRedisplay()
# 初始化OpenGL窗口
glutInit()
glutInitWindowSize(viewport[2], viewport[3])
glutCreateWindow("OpenGL Window")
glutDisplayFunc(draw)
glutMouseFunc(mouse)
glutMotionFunc(motion)
# 加载点云数据
points = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1]]
points = [[p[0] * 2 - 1, p[1] * 2 - 1, p[2] * 2 - 1] for p in points]
# 进入主循环
glutMainLoop()
```
在这个示例代码中,我们首先定义了一些全局变量,包括视口大小、鼠标起始点位置、鼠标结束点位置、矩形框起始点位置、矩形框结束点位置、矩形框宽度和矩形框高度。然后我们定义了一个绘制函数,用于绘制点云和矩形框。在鼠标回调函数中,我们处理鼠标左键按下和释放事件,根据鼠标按下和释放位置的差值计算出矩形框的大小和位置,并根据OpenGL坐标系中的坐标计算出选中的点云数据,最后将选中的点云数据转换为open3d格式并显示出来。在移动鼠标回调函数中,我们更新矩形框的结束点位置和大小。在初始化OpenGL窗口后,我们加载了一个简单的点云数据,并进入主循环。
注意,这个示例代码中只是简单地将鼠标拖动画出的矩形框用绿色线条显示出来,并没有实际对点云数据进行筛选。如果需要对点云数据进行筛选,可以根据选中的矩形框的位置和大小计算出对应的空间坐标范围,然后根据空间坐标范围筛选出点云数据。
阅读全文