使用Kinect相机获取像素点对应世界坐标系下三维坐标的公式

Kinect相关topic

(1)RGB图像:/camera/rgb/image_color

    ROS数据格式:sensor_msgs/Image
    OPENCV数据格式:Mat
    图像尺寸:640*480
    像素数据类型:8UC3

(2)深度图像:/camera/depth/image

    ROS数据格式:sensor_msgs/Image
    OPENCV数据格式:Mat
    图像尺寸:640*480
    像素数据类型:32FC1 或 16UC1

(3)点云数据(无整合RGB): /camera/depth/points

    ROS数据格式:sensor_msgs/Image
    PCL点云库数据格式:pcl::PointCloud<pcl::PointXYZ>
    图像尺寸:有序点云,640*480
    像素数据类型:double

RGB以及深度图像的像素数据类型非常关键,一旦出错便不能得到正确的坐标

 

像素坐标系到世界坐标系的转化

[u,v,d]—->[x,y,z]

// 相机内参
const double camera_factor=1000;
const double camera_cx=325.5;
const double camera_cy=253.5;
const double camera_fx=518.0;
const double camera_fy=519.0;
//深度图中(m,n)处的值
ushort d = depth.ptr<ushort>(m)[n];

//点P的世界坐标
p.z = double(d)/camera_factor;
p.x = (n-camera_cx)*p.z/camera_fx;
p.y = (m-camera_cy)*p.z/camera_fy;

camera_factor是深度图里给的数据与实际距离的比例。

由于深度图给的都是short (mm单位),camera_factor通常为1000。

 

[x,y,z]—->[u,v,d]

u = (x*fx)/z + cx ;
v = (y*fy)/z + cy ;
d = z*camera_factor

 

    原文作者:leo-wkd
    原文地址: https://blog.csdn.net/qq_42037180/article/details/98133266
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞