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