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

目录

概述

涉及到的坐标变换

深度值可视化

 3D点云的2D投影实现

实现效果

参考文献 


概述

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

涉及到的坐标变换

        主要涉及三个坐标系的转换(激光坐标系、相机坐标系、像素坐标系),关系如下:

图片引自网络,如侵联删

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

深度值可视化

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

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投影实现

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

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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/133672.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL 慢查询和慢查询日志

在数据库管理中&#xff0c;慢查询是指执行时间较长的 SQL 查询语句。这类查询可能导致系统性能下降&#xff0c;影响用户体验。为了帮助识别和解决这些性能问题&#xff0c;数据库管理系统通常提供了慢查询日志&#xff0c;用于记录执行时间超过一定阈值的查询。本文将深入探讨…

【pytorch深度学习】使用张量表征真实数据

使用张量表征真实数据 本文为书pytorch深度学习实战的一些学习笔记和扩展知识&#xff0c;涉及到的csv文件等在这里不会给出&#xff0c;但是我会尽量脱离这一些文件将书本想要表达的内容给展示出来。 文章目录 使用张量表征真实数据1. 加载图像文件2. 改变布局3. 加载目录下…

[工业自动化-12]:西门子S7-15xxx编程 - PLC从站 - ET200 SP系列详解

目录 一、概述 1.1 概述 二、系统组成 2.1 概述 2.2 与主站的通信接口模块 2.3 总线适配器 2.4 基座单元 2.5 电子模块 2.6 服务器模块 一、概述 1.1 概述 PLC ET200 SP 是西门子&#xff08;Siemens&#xff09;公司生产的一款模块化可编程逻辑控制器&#xff08;PL…

苹果手机安装未上架APP应用测试教程

STEP 2&#xff1a;找到下载的描述文件&#xff08;如果没有找到&#xff0c;请到 设置 - 通用 - 描述文件 中查看&#xff09; STEP 3&#xff1a;安装描述文件 STEP 4&#xff1a;输入解锁密码安装描述文件 STEP 5&#xff1a;同意免责声明&#xff0c;安装描述文件 STEP 6…

开发知识点-Ant-Design-Vue

Ant-Design-Vue a-input a-input Vue组件 a-spin 加载中的效果 data字段 mounted钩子函数 Ant Design Vue 组件库 list-type“picture-card” 上传的图片作为卡片展示 name show-upload-list action :beforeUpload“handleBeforeUpload” :headers“customHeaders” :disabl…

springboot调用第三方接口json转换成对象

请求接口是一个比较常见的需求&#xff0c;接口返回一般是一个json类型&#xff0c;需要进行组装成对应的类&#xff0c;例 {"status_code": 200,"message": "success","data": {"cost": 286.6933,"bom_list": […

人工智能基础——Python:Matplotlib与绘图设计

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

使用ResponseSelector实现校园招聘FAQ机器人

本文主要介绍使用ResponseSelector实现校园招聘FAQ机器人&#xff0c;回答面试流程和面试结果查询的FAQ问题。FAQ机器人功能分为业务无关的功能和业务相关的功能2类。 一.data/nlu.yml文件   与普通意图相比&#xff0c;ResponseSelector训练数据中的意图采用group/intent格…

Vue 3 打印解决方案:Vue-Plugin-HiPrint

文章目录 1. Vue-Plugin-HiPrint 简介2. 安装和使用2.1 安装2.2 引入并注册插件2.3 在组件中使用 3. 配置和高级用法4. 示例应用5. 总结 &#x1f389;欢迎来到Java学习路线专栏~Vue 3 打印解决方案&#xff1a;Vue-Plugin-HiPrint ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f37…

x3daudio1_7.dll怎么解决?x3daudio1_7.dll丢失的5个详细处理方法

首先&#xff0c;让我们来了解一下X3DAudio1_7.dll丢失的原因。X3DAudio1_7.dll是一个非常重要的动态链接库文件&#xff0c;它负责处理计算机中的音频输出。然而&#xff0c;由于各种原因&#xff0c;例如软件安装错误、病毒感染、系统升级等&#xff0c;我们可能会遇到X3DAud…

超强C语言跨年烟花代码,精美无比,附源码分步解析

现在大家是不是都觉得程序员不懂浪漫&#xff1f;那真的大错特错&#xff0c;今天就让你们看看什么是程序员的浪漫&#xff01; 我们今天就来写写《烟花》表白程序&#xff0c;不要惊讶&#xff0c;不要激动&#xff0c;学会了快去拿给心中的那个人看&#xff01;&#xff01;…

【论文解读】针对生成任务的多模态图学习

一、简要介绍 多模态学习结合了多种数据模式&#xff0c;拓宽了模型可以利用的数据的类型和复杂性&#xff1a;例如&#xff0c;从纯文本到图像映射对。大多数多模态学习算法专注于建模来自两种模式的简单的一对一数据对&#xff0c;如图像-标题对&#xff0c;或音频文本对。然…

玩转ansible之参数调试和文件操作篇

更多IT技术文章&#xff0c;欢迎关注微信公众号“运维之美” 玩转ansible之参数调试和文件操作篇 01 剧本调试和帮助02 使用场景举例 上节我们学习了使用ansible进行软件安装&#xff0c;那么安装完软件后&#xff0c;就需要linux系统和软件配置修改了&#xff0c;对于linux主机…

Java程序设计2023-第八次上机练习

8-1简单文本编辑器 编写简单文本编辑器&#xff0c;该程序可以新建、打开、编辑和保存文本文件。当用户点击New时&#xff0c;新建一个文件&#xff0c;用户可以编辑文件内容&#xff0c;然后点击Save保存文件。用户点击Open时&#xff0c;选择一个已有文件&#xff0c;然后可…

leetcode:206. 反转链表

一、题目 函数原型&#xff1a; struct ListNode* reverseList(struct ListNode* head) 二、思路 要对链表进行反转&#xff0c;可以有两种方法&#xff1a; 1.改变链表中每个结点之间的指针域指向&#xff0c;最后返回尾结点即可。 2.新建一个链表&#xff0c;将原链表中的结点…

gorm之项目实战-使用gen以及定义表间关系

gorm之项目实战 ER图 关系整理 一对一关系&#xff1a; User 和 UserLog&#xff1a; 一个用户对应一个用户日志&#xff0c;通过 User 模型的主键与 UserLog 模型的外键建立一对一关系。 一对多关系&#xff1a; User 和 Teacher&#xff1a; 一个用户可以对应多个老师&…

win10网络和Internet设置

win10网络设置 win10进入网络设置的常用入口有两个 第一个入口 桌面右下角右键网络图标&#xff0c;然后打开“网络和Internt设置” 第二个入口 桌面的“我的网络”快捷方式&#xff0c;或者我的电脑进去后&#xff0c;左侧栏找到“网络” 右键“属性” 可以看到&#xff0c;…

【论文阅读VLDB13】Online, Asynchronous Schema Change in F1

Online, Asynchronous Schema Change in F1 ABSTRACT 在一个globally 分布式数据库&#xff0c;with shared data, stateless servers, and no global membership.进行一个schema演变。证明许多常见的模式更改可能会导致异常和数据库损坏&#xff0c;通过将破坏引起的模式更改…

Git 命令详解

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 C技能系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream we…

消息队列简介

消息队列 在认识rabbitMQ之前&#xff0c;我们需要先认识下消息队列。 消息队列&#xff0c;一般简称为MQ&#xff08;Message Queue&#xff09;。先不管消息(Message)这个词&#xff0c;先看看队列(Queue)。 队列就是一种先进先出的数据结构。 所以消息队列可以简单理解为&a…