相机内外参实践之点云投影矢量图

目录

概述

涉及到的坐标变换

深度值可视化

3D点云的2D投影实现

实现效果

参考文献


概述

Camer的内外参在多模态融合中主要涉及到坐标系变换,即像素坐标、相机坐标以及其他坐标系。这篇就针对点云到图像的投影与反投影做代码实践,来构建一张具有深度信息的2D图片验证。

涉及到的坐标变换

主要涉及三个坐标系的转换(激光坐标系、相机坐标系、像素坐标系),关系如下:
图片引自网络,如侵联删

其中,(u,v,1)是某点在图像像素坐标系下的坐标,(Xw,Yw,Zw)为激光坐标系下的坐标值。而中间的两个矩阵分别是相机内参、外参,最前面的系数就是从光心到实际物体的距离在沿着成像中心到光心轴线的投影距离。

深度值可视化

为了实现深度信息在图像上清晰的表达,随便搜了网上的代码,主要是用来将深度值离散到RGB序列上,使不同距离的物体能呈现不同的颜色,起到渐变的效果。这一块只是可视化,意会即可,具体如何可视化可根据自己需要,下方函数主要参考了文献1中的代码。

python 复制代码
def color_steps(step=255, src=(0, 255, 255), dst=(0, 0, 0)):
    """
    主要用来产生渐变RGB值表达深度信息
    """
    color_num = step + 1
    from_rgb, to_rgb = src, dst
    colors = [(int(from_rgb[0] + (to_rgb[0] - from_rgb[0]) / step + i),
               int(from_rgb[1] + (to_rgb[1] - from_rgb[1]) / step + i),
               int(from_rgb[2] + (to_rgb[2] - from_rgb[2]) / step + i),
               ) for i in range(color_num)]
    return colors

3D点云的2D投影实现

首先要将点云从其自身传感器的坐标系下变换至相机坐标系下,在此基础上,再归一化深度投影至像素坐标系。注意我这里的过程使用的是齐次坐标变换,这个需要根据标定参数的形式、车上不同坐标系的位姿来具体分析调整更方便的矩阵运算。

python 复制代码
def project2image(image_file, pcd_file, in_matrix, rt_matrix, level=100):
    points_cloud = o3d.io.read_point_cloud(pcd_file)
    points_cloud = np.asarray(points_cloud.points_cloud)
    points_cloud = np.hstack((points_cloud, np.ones((points_cloud.shape[0], 1))))
    points_cloud = np.dot(rt_matrix, points_cloud.T)
    points_cloud = points_cloud[0:3, :]
    pixel_depth = copy.deepcopy(points_cloud[2, :])
    points_cloud = points_cloud / points_cloud[2, :]
    pixel = np.dot(in_matrix, points_cloud)
    image = cv2.imread(image_file)
    height, width = image.shape[0:2]
    inner = (pixel[0, :] >= 0) & (pixel[0, :] < width) & (pixel[1, :] >= 0) & (pixel[0, :] < height) & (
                pixel_depth >= 0)
    pixel = pixel[:, inner].astype(np.int32)
    pixel_depth = pixel_depth[inner]
    color_values = color_steps(step=level)
    min_pixel_depth, max_pixel_depth = min(pixel_depth), max(pixel_depth)
    for _h, _w, _d in zip(pixel[1:], pixel[0:], pixel_depth):
        color_id = level * (_d - min_pixel_depth) / (max_pixel_depth - min_pixel_depth)
        cv2.circle(image, (_w, _h), 2, color_values[int(color_id)], -1)
    cv2.imwrite("result.jpg", image)

实现效果

最终的实现效果如下图所示,RGB的离散做的比较随意,视觉效果没那么好。

参考文献

[1] python + gdal tif 实现渲染数据_python gdal 分级配色-CSDN博客

相关推荐
埃菲尔铁塔_CV算法9 分钟前
人工智能图像算法:开启视觉新时代的钥匙
人工智能·算法
EasyCVR9 分钟前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
打羽毛球吗️15 分钟前
机器学习中的两种主要思路:数据驱动与模型驱动
人工智能·机器学习
好喜欢吃红柚子32 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python37 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
正义的彬彬侠1 小时前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
Debroon1 小时前
RuleAlign 规则对齐框架:将医生的诊断规则形式化并注入模型,无需额外人工标注的自动对齐方法
人工智能
羊小猪~~1 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
AI小杨1 小时前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测