.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

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

求空间直线与平面的交点

若直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z): 将直线方程写成参数方程形式,即有: x = m1+ v1 * t y = m2+ v2 * t