.pcd格式的3维点云到图像平面的投影

2023-10-24 05:30

本文主要是介绍.pcd格式的3维点云到图像平面的投影,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、关于标定文件

本人采用的是autoware的标定工具实现的标定,标定文件如下所示。此处应注意autoware的标定文件与其他一般性的标定文件相比的不同之处,autoware的标定文件的特殊性及其使用可参见我的其他博客。
在这里插入图片描述

2、利用openc的projectpoints函数实现坐标转换。

查询opencv文档中关于ProjectPoints2函数的说明,相关参数的解释部分展示如下

void cvProjectPoints2( const CvMat* object_points, const CvMat* rotation_vector,const CvMat* translation_vector, const CvMat* intrinsic_matrix,const CvMat* distortion_coeffs, CvMat* image_points,CvMat* dpdrot=NULL, CvMat* dpdt=NULL, CvMat* dpdf=NULL,CvMat* dpdc=NULL, CvMat* dpddist=NULL );

*object_points:*物体点的坐标,为3xN或者Nx3的矩阵,这儿N是视图中的所有所有点的数目。
*rotation_vector:*旋转向量,1x3或者3x1。由旋转向量通过罗德里格斯变换得到
*translation_vector:*平移向量,1x3或者3x1。
[ f x 0 c x 0 f x c y 0 0 1 ] \left[ \begin{matrix} fx & 0 & cx \\ 0 & fx & cy \\ 0 & 0 & 1 \end{matrix} \right] fx000fx0cxcy1
*intrinsic_matrix:*摄像机内参数矩阵A
*distortion_coeffs:*形变参数向量,4x1或者1x4,为[k1,k2,p1,p2]。如果是NULL,所有形变系数都设为0。
*image_points:*输出数组,存储图像点坐标。大小为2xN或者Nx2,这儿N是视图中的所有点的数目。
*dpdrot、dpdt、dpdf、dpdc、dpddist:*都为可选参数。

在python中调用该函数如下,注意代码各参数与上述说明的对应关系:

cv.ProjectPoints2(objectPoints, rvec, tvec, cameraMatrix, distCoeffs, imagePoints, dpdrot=None, dpdt=None, dpdf=None, dpdc=None, dpddist=None)None

实例如下:

#-*- coding:utf-8 -*-
import pcl
import cv2 as cv
from pylab import *cloud = pcl.load('/home/song/pcl_test/test.pcd')
points_3d = []for i in range(0, cloud.size):x_raw = float(cloud[i][0])y_raw = float(cloud[i][1])z_raw = float(cloud[i][2])point_3d = []point_3d.append(x_raw)point_3d.append(y_raw)point_3d.append(z_raw)points_3d.append(point_3d)#输入projectpoints函数的各项参数数值。
cube = np.float64(points_3d)
rvec = np.float64([1.15230820843793, -1.268126207316489, 1.238632946715113])
tvec = np.float64([-1.6263959455325000e-01, -1.6604515286304664e-02, -9.2349015818599600e-01])camera_matrix = np.float64([[1.0251232727914867e+03, 0, 2.6218085751008294e+02],[0, 1.0180807639500672e+03, 2.0907527955373126e+02],[0, 0, 1]])distCoeffs = np.float64([-4.6155288063657413e-01, 2.2493781629153636e-01,2.5584176644194096e-03, 7.5604590879245655e-04, 3.1795661983727808e-01])point_2d, _ = cv.projectPoints(cube, rvec, tvec, camera_matrix, distCoeffs)
print(point_2d)

结果如下:
在这里插入图片描述

3、将二维坐标投影到图片上

这一步主要是对上一步得到的所有二维坐标进行过滤去除相机后方的点和超出图像尺寸外的点。再者就是利用scatter函数借助colormap对投影的点进行着色。完整代码如下:

#-*- coding:utf-8 -*-
import pcl
import numpy as np
import cv2 as cv
from PIL import Image
from pylab import imshow
from pylab import array
from pylab import plot
from pylab import title
from pylab import *
import matplotlib.pyplot as pltx=[]
y=[]
distance=[]    #存放需要投影点转换成二维前的雷达坐标的x坐标(距离信息),以此为依据对投影点进行染色。
distance_3d=[]    #存放转换前雷达坐标的x坐标(距离信息)。cloud = pcl.load('/home/song/pcl_test/test.pcd')
im = Image.open('/home/song/pcl_test/test.jpg')pix = im.load()
points_3d = []
# print('Loaded ' + str(cloud.width * cloud.height) +
#       ' data points from test_pcd.pcd with the following fields: ')
for i in range(0, cloud.size):x_raw = float(cloud[i][0])y_raw = float(cloud[i][1])z_raw = float(cloud[i][2])point_3d = []point_3d.append(x_raw)point_3d.append(y_raw)point_3d.append(z_raw)if x_raw>0:points_3d.append(point_3d)distance_3d.append(x_raw)cube = np.float64(points_3d)rvec = np.float64([1.15230820843793, -1.268126207316489, 1.238632946715113])
tvec = np.float64([-1.6263959455325000e-01, -1.6604515286304664e-02, -9.2349015818599600e-01])camera_matrix = np.float64([[1.0251232727914867e+03, 0, 2.6218085751008294e+02],[0, 1.0180807639500672e+03, 2.0907527955373126e+02],[0, 0, 1]])distCoeffs = np.float64([-4.6155288063657413e-01, 2.2493781629153636e-01,2.5584176644194096e-03, 7.5604590879245655e-04, 3.1795661983727808e-01])point_2d, _ = cv.projectPoints(cube, rvec, tvec, camera_matrix, distCoeffs)m=-1
for point in point_2d:m=m+1x_2d = point[0][0]y_2d = point[0][1]if 0<=x_2d<=640 and 0<=y_2d<=480:x.append(x_2d)y.append(y_2d)distance.append(-distance_3d[m]*100)#数值取反是为了让colormap颜色由红到蓝显示而非由蓝到红RGB=pix[x_2d,y_2d]print('x,y,z,(r,g,b):',([x_2d,y_2d,distance_3d[m]],RGB))x=np.array(x)
y=np.array(y)
plt.scatter(x, y, c=distance, cmap='jet',s=4,marker='.')
plt.imshow(im)
plt.show()

结果如下:上面的为autoware投影的效果图,下面的为自己手动投影的效果图。
在这里插入图片描述
由于本次实验标定时抽取帧数较少,标定效果较差,本文重点在于功能的实现。另外对于点云的染色,采用目前的染色方案,效果不是很好,仍在研究,可自己设计。

这篇关于.pcd格式的3维点云到图像平面的投影的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/272985

相关文章

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编