.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

相关文章

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl