obb vtk 定点坐标_VTK中获取STL模型点的坐标以及对其进行变换

本文介绍了如何在VTK中通过vtkSTLReader读取STL模型,并获取模型顶点的坐标。内容包括VTK的管线流设计模式、数据处理流程以及如何通过vtkTransformPolyDataFilter对模型进行坐标变换。通过示例代码展示了如何在不改变原始数据的情况下,调整模型在渲染中的位置。
摘要由CSDN通过智能技术生成

VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG、OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的东西,如地质构造、地层分布、矿床分布、三维空间应力场的状态变化等等,而OSG、OGRE是基于场景的可视化,更强调视觉感官的感受,所以OSG主要应用于虚拟现实领域,而VTK主要应用于科学计算可视化领域。

VTK的可视化设计是基于管线流的设计模式,将要处理的数据作为流动介质在管线中流动,不同的阶段对数据有不同的处理方式,VTK的可视化管线如图所示:

Sources: 数据生成的源头,数据来源主要包括从磁盘读取数据文件,如VTK所支持的各种格式文件生成数据源对象,这种源对象被称为读源对象,或者利用数学方法生成源对象,如利用多个四边形构建一个圆柱体,这种对象被称为程序源对象。

Filters: 对源对象进行处理,生成新的数据集输出。

Mappers: 映射器对象主要作用是将可视化模型生成的数据转换到图形模型进行绘制,或者以磁盘文件的形式进行输出。

渲染对象(vtkRenderer)和渲染窗口(vtkRenderWindow): 渲染对象和渲染窗口分别对应于用于显示图形的视口和窗口。每个渲染窗口可以容纳一个或多个渲染对象。即一个渲染窗口中可以存在多个视口,它们既可以并列也可以分层排放。

如下图所示,用vtkSTLReader读入一个边长为50mm的立方体模型(注意模型不在原点--导出STL文件时

A:yolo_obb是基于YOLOv3算法的一种目标检测模型,在进行目标检测的时候,需要预测目标框的位置、大小和角度。下面是yolo_obb预测角度的代码实现。 首先,在模型的输出层,需要将特征图进行分离,分别预测目标框的坐标、宽度和高度以及倾斜角度。代码如下: ``` def decode(conv_output, anchors, stride, num_classes, scale_xy): num_anchors = len(anchors) conv_shape = conv_output.shape batch_size = conv_shape[0] output_size = conv_shape[1:3] conv_output = K.reshape(conv_output, (batch_size, output_size[0], output_size[1], num_anchors, 1+4+num_classes)) # 解析网络输出,得到预测的、宽度、高度和倾斜角度 box_xy = K.sigmoid(conv_output[..., :2]) * scale_xy - 0.5 * (scale_xy - 1) + np.tile(range(output_size[1]), [output_size[0], 1]) * stride box_wh = K.exp(conv_output[..., 2:4]) * anchors box_ang = (K.sigmoid(conv_output[..., 4:5]) - 0.5) * (np.pi / 2) # 将、宽度、高度和倾斜角度转换为目标框的四个顶 box_x1y1 = box_xy - 0.5 * box_wh box_x2y2 = box_xy + 0.5 * box_wh box_points = tf.concat([box_x1y1, box_x2y2, box_ang], axis=-1) # 将目标框坐标调整为原图的比例 box_points = K.reshape(box_points, (batch_size, -1, 5)) box_points = box_points * np.array([input_shape[1], input_shape[0], input_shape[1], input_shape[0], 1]) return box_points ``` 可以看到,`box_ang`即为倾斜角度的预测结果。在这里,倾斜角度的预测结果是利用Sigmoid函数将网络输出的范围调整到[-0.5,0.5]之间,然后再乘以π/2获得倾斜角度的弧度表示。可以根据需要将其转换为角度表示。 接下来,在绘制目标框时,需要将预测的倾斜角度应用于框的坐标变换。代码如下: ``` def draw_boxes(image, boxes, classes, scores): for i, box in enumerate(boxes): x1, y1, x2, y2, ang = box w, h = x2 - x1, y2 - y1 # 将倾斜角度应用于目标框的坐标变换 cx, cy = x1 + w / 2, y1 + h / 2 x1 = cx + (x1 - cx) * np.cos(ang) - (y1 - cy) * np.sin(ang) y1 = cy + (x1 - cx) * np.sin(ang) + (y1 - cy) * np.cos(ang) x2 = cx + (x2 - cx) * np.cos(ang) - (y2 - cy) * np.sin(ang) y2 = cy + (x2 - cx) * np.sin(ang) + (y2 - cy) * np.cos(ang) # 绘制目标框 cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2) cv2.putText(image, '{} {:.2f}'.format(classes[i], scores[i]), (int(x1), int(y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2, cv2.LINE_AA) ``` 可以看到,在变换坐标时,倾斜角度的余弦和正弦值被用于旋转变换。最后,再将变换后的坐标用于绘制目标框。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值