点云_在图像上绘制点云的2d、3d标注框

python编程

 关注点分离--结构化--有序组织
 抽象-封装-复用-解耦
 容错-自动化-协议

编程技术概念
   索引--遍历-迭代-递归
   中断-回滚-模板替换
   管道-并发-批量-异步-回调
等效
数据编程中等效--删除不要的 del filter search==提取需要的	
old_list,其中有一个索引pos列表,您想删除它:
 new_list = [old_list[i] for i, e in enumerate(old_list) if i not in pos]

box计算角点

对于3d标注框,首先在原点按照对象尺寸构建坐标点,然后利用ry旋转角度对目标进行旋转随后再平移到标注尺寸中。
   根据中心点位置(x,y,z)/框尺寸h,w,l/朝向角  --》计算框体的8个角点	 velo_box: (n,8,3)
     中心点位置的定义: kitti标签里的中心点位置在物体下表面 
	    二维矩形框坐标不同的dinginess
	    激光雷达坐标系中,z方向是高度方向,x方向是汽车前进方向,前进左手边方向为y方向(车身方向)
		3D物体的中心点位置
  
01.8个角点分别沿x,y,z到中心点的距离(8个角点到原点的坐标)原点和xyz的朝向有关

02.旋转矩阵	

03.平移到标注尺寸中

示例

 # qs: (8,3) array of vertices for the 3d box in following order:
 #             1 -------- 0
 #            /|         /|
 #           2 -------- 3 .
 #           | |        | |
 #           . 5 -------- 4
 #           |/         |/
 #           6 -------- 7
 x_corners = [l / 2, l / 2, -l / 2, -l / 2, l / 2, l / 2, -l / 2, -l / 2]
 y_corners = [0, 0, 0, 0, -h, -h, -h, -h]
 z_corners = [w / 2, -w / 2, -w / 2, w / 2, w / 2, -w / 2, -w / 2, w / 2]



##location (x,y,z) in camera coord
corners_3d[0, :] = corners_3d[0, :] + obj.t[0]
corners_3d[1, :] = corners_3d[1, :] + obj.t[1]
corners_3d[2, :] = corners_3d[2, :] + obj.t[2]

2d box计算角点

  velo_box: (n,8,3) --》(n,4)
  投影前的3D BBox共计有8个点,投影到图像坐标中也会有8个点,
     选取八个点中最大值最小值组成 (x1,y1,x2,y2)就是最终的2D BBox	

坐标空间

###游戏开发
    视图矩阵view_mat和 投影矩阵proj_mat
    投影矩阵(projection matrix),若矩阵A既是对称矩阵,又是幂等矩阵,则称A为投影矩阵
     投影矩阵 * 观察空间坐标 = 剪裁空间坐标  
        透视投影中,视野使用视锥体框定,正交投影中用长方体框定. 长方体经过投影矩阵转换后
    	我们首先需要将本地空间,通过使用模型矩阵将其转换至世界空间。
    	 再通过视口矩阵,将其转换为视口空间。
    	 之后再乘上投影矩阵,就将视口空间转换为裁剪空间。
    	 最后进行裁剪等操作使裁剪空间转换为屏幕空间
###坐标变换
   世界坐标  相机坐标 像素坐标 图像坐标
    世界坐标系(Xw,Yw,Zw)   摄像机坐标系(Xc,Yc,Zc) 像素坐标系(u,v) 图像坐标系(x,y)
	  
	  透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。因此我们需要考虑成像畸变的问题。
       透镜的畸变主要分为径向畸变和切向畸变,还有薄透镜畸变等等
	像素坐标系和图像坐标系都在成像平面上
	    图像坐标系 用物理单位(例如毫米)表示像素在图像中的位置。。
		    dx,dy表示每个像素在横轴x和纵轴y上的物理尺寸(单位为:mm/像素,单位像素的距离)
	    像素坐标系 就是以像素为单位的图像坐标系

像素坐标去畸变

Distorts --畸变
    cv::fisheye::distortPoints 
	    Distorts 2D points using fisheye model.
	cv::fisheye::undistortPoints	
	    Undistorts 2D points using fisheye model
		对像素坐标去畸变要使用到cv2的undistortPoints()函数
        src, cameraMatrix, distCoeffs[, dst[, R[, P]]],
		    其中[ ]内的参数为可选参数。接收输出的数组dst可以直接通过等号进行赋值,而不一定需要提前建好然后丢进函数中
			 内参cameraMatrix,distCoeffs是畸变参数
输入和输出
    src:图像的像素坐标点集合,类型是np.ndarray,维度可以是N×1×2或者1×N×2
    dst:输出的去畸变结果,    类型是np.ndarray,维度是N×1×2
   camera_normalizedPoints = cv2.undistortPoints(camera_points, camera_K, camera_d)	
     N*8*2  3*3  4
	 1*N*2
	
   畸变 是 k1 k2 k3 p1		

图像去畸变

对图像去畸变需要使用到undistort()函数

 普通相机模型畸变校正函数针对OpenCV中的cv::initUndistortRectifyMap(),
 鱼眼相机模型畸变校正函数对应OpenCV中的cv::fisheye::initUndistortRectifyMap()。两种方法算出映射Mapx和Mapy后,
 统一用cv::Remap()函数进行插值得到校正后的图像   输入输出变成了图像矩阵
 
 cv2.fisheye.undistortPoints 
 cv2.fisheye.distortPoints
     distortPoints分为鱼眼和窄角,又两种调用原型。
 	
 	
 3D to 2D Points using cv::projectPoints 	
 将带有畸变的点转换为不带畸变的点,在不带畸变的点上添加畸变,
 
 因为要在一个带有畸变的图像上标注一个不带畸变的点,
 那标注出的位置和我们真正的目标之间就有一定的偏差了,这个时候
 只有在这些不带畸变的点上添加上畸变,这样才能适应带有畸变的图像。
 
  添加畸变的过程就比较好理解了,
     就是给不带有畸变的点添加上径向畸变和切向畸变,直接得到带畸变的点
 k1,k2等为径向畸变参数,p1,p2为切向畸变参数
 
 图像去畸变--点云映射的点加畸变

代码走读

def corners_nd(dims, origin=0.5):
    corners_norm = corners_norm[[0, 1, 3, 2, 4, 5, 7, 6]]	
def rotation_3d_in_axis(points, angles, axis=0):
    return np.einsum("aij,jka->aik", points, rot_mat_T)
def center_to_corner_box3d(centers, dims, angles=None, origin=(0.5, 0.5, 0), axis=2)
     np.ndarray: Corners with the shape of (N, 8, 3).
 
rot_mat = np.transpose(rot_mat, (2, 0, 1)) # (n, 3, 3) 对坐标轴的顺序进行指定
image_p = img_pts[:, :, :2] / img_pts[:, :, 2:3] 


np.newaxis 关键字,使用索引的语法给数组添加维度
np.expand_dims(arr,axis) 和newaxis实现功能一样,给arr添加维度
np.reshape(arr,newshape) 给一个维度设置newshape完成升维  对应的是shape  resize()
np.pad() 函数使用:数组填充与扩展
np.transpose  axis

参考

https://github.com/mit-han-lab/bevfusion/blob/main/mmdet3d/core/bbox/box_np_ops.py
图像去畸变和添加畸变 https://blog.csdn.net/weixin_38636815/article/details/115668228
 KITTI数据集 激光雷达-图像坐标系转换关系 https://blog.csdn.net/zt1091574181/article/details/114838741
  KITTI数据集可视化(二):点云多种视图与标注展示的可视化代码解析	 
  https://blog.csdn.net/weixin_44751294/article/details/128569985 
  kitti数据集中---标注数据label_2 https://blog.csdn.net/suibianshen2012/article/details/130055526
  3D框corner计算 https://zhuanlan.zhihu.com/p/151777998
posted @ 2023-06-09 18:12  辰令  阅读(437)  评论(0编辑  收藏  举报