如何把2D图像(2D点)投影到3D

现在有一个任务
是建造3D模型的一个偷懒的办法
TB上购买了一个7cm7cm7cm的正方体
我就可以根据已知的立体结果产生点云,但是对应的点云缺少RGB信息,
为了让这些点云更加可视化,怎么办呢?
首先制作了正方体六个面的贴纸,使得立方体更加有纹理
接下来就是要生成点云和对应的RGB信息
如以下代码所示:

#怎样2D图像warp到3D上
#也就是将2D点转换成3D点同时保留其RGB值
import cv2
import numpy as np
#src 是source——image上的点
image1=cv2.imread('1.jpg')
H,W,C=image1.shape
#不通过warp了,直接填充
file = open('model.txt','w')
image1=cv2.resize(image1,(700,700))
image2=cv2.imread('2.jpg')
image2=cv2.resize(image2,(700,700))
image3=cv2.imread('3.jpg')
image3=cv2.resize(image3,(700,700))
image4=cv2.imread('4.jpg')
image4=cv2.resize(image4,(700,700))
image5=cv2.imread('5.jpg')
image5=cv2.resize(image5,(700,700))
image6=cv2.imread('6.jpg')
image6=cv2.resize(image6,(700,700))
start=0.0
stop=69.9
num=700
x=np.linspace(start, stop, num)
y=np.linspace(start, stop, num)
z=np.linspace(start, stop, num)
points=[]

W1=0
for i in x:
    H1 = 0
    for j in y:
       points.append([i,j,0.0])
       points.append([i, j, 70.0])
       file.writelines(str(i)+' '+str(j)+' '+str(0.0)+' '+str(image1[H1][W1][2])+' '+str(image1[H1][W1][1])+' '+str(image1[H1][W1][0])+'\n')
       file.writelines(str(i) + ' '+str(j) + ' '+str(70.0)+' '+str(image2[W1][H1][2])+' '+str(image2[W1][H1][1])+' '+str(image2[W1][H1][0])+'\n')
       H1=H1+1
    W1=W1+1

W2=0
for i in x:
    H2 = 0
    for k in z:
        points.append([i,0.0,k])
        points.append([i, 70.0, k])
        file.writelines(str(i) + ' ' + str(0.0) + ' ' + str(k)+' '+str(image3[W2][H2][2])+' '+str(image3[W2][H2][1])+' '+str(image3[W2][H2][0])+'\n')
        file.writelines(str(i) + ' ' + str(70.0) + ' ' + str(k)+' '+str(image4[H2][W2][2])+' '+str(image4[H2][W2][1])+' '+str(image4[H2][W2][0])+'\n')
        H2=H2+1
    W2=W2+1
W3=0
for j in y:
    H3=0
    for k in z:
        points.append([0, j, k])
        points.append([70.0, j, k])
        file.writelines(str(0.0) + ' ' + str(j) + ' ' + str(k)+' '+str(image5[H3][W3][2])+' '+str(image5[H3][W3][1])+' '+str(image5[H3][W3][0])+'\n')
        file.writelines(str(70.0) + ' ' + str(j) + ' ' + str(k)+' '+str(image6[W3][H3][2])+' '+str(image6[W3][H3][1])+' '+str(image6[W3][H3][0])+'\n')
        H3=H3+1
    W3=W3+1
k=1
file.close()

然后生成的模型效果如下图所示:
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将KITTI数据集的点云数据投影到2D图像,可以使用ROS中的点云转换工具包`pcl_ros`来实现。具体步骤如下: 1. 安装`pcl_ros`工具包 ```bash sudo apt-get install ros-<distro>-pcl-ros ``` 其中`<distro>`是你使用的ROS版本,比如`melodic`。 2. 下载KITTI数据集 从KITTI官网下载点云数据集。 3. 创建ROS包并将数据集导入 在ROS工作空间中创建一个ROS包,将KITTI数据集导入到ROS包中。 4. 编写ROS节点 使用`pcl_ros`中的`PointCloud2`消息类型读取点云数据,并使用`sensor_msgs/Image`消息类型发布投影后的2D图像。 具体代码可以参考以下示例: ```python import rospy import sensor_msgs.point_cloud2 as pc2 from sensor_msgs.msg import Image, CameraInfo from cv_bridge import CvBridge import numpy as np import cv2 class PointCloudProjector(): def __init__(self): self.cloud_sub = rospy.Subscriber("/kitti/velo/pointcloud", pc2.PointCloud2, self.cloud_callback) self.image_pub = rospy.Publisher("/kitti/velo/image_raw", Image, queue_size=10) self.cam_info_pub = rospy.Publisher("/kitti/velo/camera_info", CameraInfo, queue_size=10) self.bridge = CvBridge() def cloud_callback(self, msg): # Convert PointCloud2 message to numpy array cloud = pc2.read_points(msg, skip_nans=True) # Project point cloud onto 2D image # ... # Publish image image_msg = self.bridge.cv2_to_imgmsg(image, encoding="passthrough") self.image_pub.publish(image_msg) # Publish camera info cam_info_msg = CameraInfo() # ... self.cam_info_pub.publish(cam_info_msg) if __name__ == '__main__': rospy.init_node('point_cloud_projector', anonymous=True) projector = PointCloudProjector() rospy.spin() ``` 在`cloud_callback`函数中,使用`pc2.read_points`函数将`PointCloud2`消息转换为numpy数组,然后将点云投影到2D图像中,并将结果转换为ROS中的`Image`消息类型,使用`self.image_pub.publish`函数发布2D图像。 同时,还需要发布相机信息,可使用`CameraInfo`消息类型,使用`self.cam_info_pub.publish`函数发布。 注意,这里的投影算法需要根据具体需求进行选择和实现。 5. 运行ROS节点 使用`rosrun`命令运行ROS节点。 ```bash rosrun <your_package_name> point_cloud_projector.py ``` 其中,`<your_package_name>`是你创建的ROS包的名称。 6. 查看投影结果 使用`rviz`或其他图像查看工具查看2D图像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值