把激光点投影到图像上并融合显示

把激光点投影到图像上并融合显示

示图:

在这里插入图片描述
全部代码如下(python):

# -*- 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 plt

x=[]
y=[]
distance=[]    #存放需要投影点转换成二维前的雷达坐标的x坐标(距离信息),以此为依据对投影点进行染色。
distance_3d=[]    #存放转换前雷达坐标的x坐标(距离信息)。



cloud = pcl.load('E:\\shu_ju\\selection\\2021-03-03-15-17-24\\pcd_1\\0_1614755848 - Cloud.pcd')
im = Image.open('E:\\shu_ju\\selection\\2021-03-03-15-17-24\\image2\\1614755848.902324.png')

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 y_raw>0:
        points_3d.append(point_3d)
        distance_3d.append(y_raw)
    '''    
    points_3d.append(point_3d)
    distance_3d.append(y_raw)'''

cube = np.float64(points_3d)
#print(cube.shape)


rvec = np.float64([1.680647483853886, 0.03782614262625567, 0.003707885488685594])  #旋转向量
tvec = np.float64([-0.3270823619145787, 1.994427053985835, -0.2688515838179673])  #平移向量

camera_matrix = np.float64([[1400.660521866737, 0, 989.6663020916587],
                            [0, 1397.477295771064, 594.9904177802305],
                            [0, 0, 1]])  #内参矩阵

distCoeffs = np.float64([-0.05694747808562394, -0.08329212973455258,
                         -0.0009314071183112955, 0.006712153417379347, 0.2493801178842133])  #畸变参数,[k1,k2,p1,p2,k3]


point_2d, _ = cv.projectPoints(cube, rvec, tvec, camera_matrix, distCoeffs)
#print(point_2d[0].shape)
point_2d_sque = np.squeeze(point_2d)
print(point_2d_sque)
np.savetxt('E:\\shu_ju\\selection\\2021-03-03-15-17-24\\pcd_1\\0_1614755848 - Cloud.txt', point_2d_sque)
m=-1
for point in point_2d:
    m=m+1
    x_2d = point[0][0]
    y_2d = point[0][1]

    if 0<=x_2d<1920 and 0<=y_2d<1200:
        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=1,marker='.')
plt.imshow(im)
plt.show()
2D激光点云数据与RGB图像信息的融合是一种将激光点云数据与图像信息结合起来的技术,旨在获得3D环境的更全面和精确的信息。 首先,激光点云数据是通过激光雷达扫描周围环境而获取的大量点云数据。这些数据包含了每个的位置信息和反射强度等属性。然而,仅仅依靠点云数据无法完全描述场景细节,因为它无法提供对象的纹理、颜色、光照等信息。 而RGB图像则能够提供物体的视觉外观信息,包括纹理、颜色、光照等。通过图像传感器获取的RGB图像可以提供丰富的视觉细节,但它无法提供物体的准确的空间位置信息。 因此,2D激光点云数据与RGB图像信息的融合就是将这两种数据进行融合,以获得更丰富、准确和完整的3D环境信息。 融合的方式包括两个步骤:首先,将RGB图像激光点云进行对齐。这可以通过激光雷达和相机之间的外部或内部参数进行校准来实现。对齐后,可以将每个的颜色信息与其对应的点云数据进行匹配。 其次,通过融合算法将点云数据和RGB图像进行融合。常用的方法包括投影法、插值法和特征提取等。投影法将点云数据映射到图像平面上,然后将图像上的颜色信息赋给相应的点云数据。插值法利用点云图像之间的一致性来填充点云数据中的颜色信息。特征提取法则通过提取图像点云中的共同特征来进行融合。 最终,通过2D激光点云数据与RGB图像信息的融合,可以得到更加真实和细致的3D环境信息。这种技术在机器人导航、虚拟现实和增强现实等领域具有广泛的应用前景。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值