CUDA-BEVFusion中,src/common/visualize.cu 源文件的当前部分代码class ImageArtistImplement
主要实现了3D边界框(Bounding Box)的投影和可视化功能,使用了CUDA加速的图像绘制库(cuOSD
)来在图像上绘制3D边界框和相关的文本信息。
一、src/common/visualize.cu 部分源码
// 定义字体文件路径
#define UseFont "tool/simhei.ttf"
// 定义最大距离(未在代码中使用)
#define MaxDistance 50
// 定义图像缩放插值系数的位数
#define INTER_RESIZE_COEF_BITS 11
// 定义图像缩放插值系数的缩放因子
#define INTER_RESIZE_COEF_SCALE (1 << INTER_RESIZE_COEF_BITS)
// 定义类型转换的位数
#define CAST_BITS (INTER_RESIZE_COEF_BITS << 1)
// 定义Box3DInfo类型,用于存储3D边界框的投影信息
// 包括:投影角点坐标、类别ID、置信度分数、深度值
typedef std::tuple<std::vector<nvtype::Float2>, int, float, float> Box3DInfo;
// 将3D边界框投影到图像平面
std::vector<Box3DInfo> transformation_predictions(const nvtype::Float4* viewport_4x4,
const std::vector<Prediction>& predictions) {
if (predictions.empty()) return {
}; // 如果预测结果为空,直接返回空列表
const int number_of_corner = 8; // 3D边界框的角点数量
std::vector<Box3DInfo> output; // 存储投影结果的列表
output.reserve(predictions.size()); // 预分配内存
// 3D边界框的8个角点在局部坐标系中的偏移量
const nvtype::Float3 offset_of_corners[number_of_corner] = {
{
-1, -1, -1}, {
+1, -1, -1}, {
+1, +1, -1}, {
-1, +1, -1},
{
-1, -1, +1}, {
+1, -1, +1}, {
+1, +1, +1}, {
-1, +1, +1}};
// 遍历每个预测结果
for (size_t idx_predict = 0; idx_predict < predictions.size(); ++idx_predict) {
auto& item = predictions[idx_predict]; // 当前预测结果
float cos_rotation = cos(item.z_rotation); // 计算旋转角度的余弦值
float sin_rotation = sin(item.z_rotation); // 计算旋转角度的正弦值
std::vector<nvtype::Float2> box3d; // 存储当前边界框的投影角点
box3d.reserve(number_of_corner); // 预分配内存
// 获取视口变换矩阵的行
nvtype::Float4 row0 = viewport_4x4[0];
nvtype::Float4 row1 = viewport_4x4[