深度图像与点云数据之间的转换关系

来源:互联网 发布:登录我的淘宝 编辑:程序博客网 时间:2024/06/05 02:46
首先定义相机的一些参数(可以根据自己的相机参数进行相机参数的相应修改)
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;

深度图与点云数据之间的映射关系如下:

cv::Mat mDepth= cv::imread("C:\\Users\\XiRobot\\Desktop\\新兴铸管采图\\Right\\0_depth_09-19-16.png",-1);

PointCloud::Ptr cloud(new PointCloud);
// 遍历深度图
for (int m = 0; m < mDepth.rows; m++)
{
for (int n = 0; n < mDepth.cols; n++)
{
// 获取深度图中(m,n)处的值
ushort d = mDepth.ptr<ushort>(m)[n];
// d 没有值则跳过此点
if (d == 0)
{
continue;
}
PointT 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;
p.r = rand() % 255;
p.g = rand() % 255;
p.b = rand() % 255;
cloud->points.push_back(p);
}
}

深度图转换为点云数据就上面几行代码即可

若需要将点云数据转换为深度图:

unsigned int iSum = 0;
for (int i = 0; i < mReslt.rows; i++)
{
for (int j = 0; j < mReslt.cols; j++)
{
if (iSum < cloud3->points.size() && mReslt.ptr<ushort>(i)[j] != 1)//此处的判断是去掉像素为0的地方,像素为0的地方没有点云数据
{
mReslt.ptr<ushort>(i)[j] = cloud3->points[iSum].z*camera_factor;//255
iSum++;
}
else
{
mReslt.ptr<ushort>(i)[j] = 0;
}
}
}

若需要源码,请关注咱家的微信号。一起来学习

我的公众号:欢迎大家一起来学习

扫码关注我们:跟着数理化走天下

获得更多的信息哦,一起交流,一起成长哦:微信号:跟着数理化走天下,纯属个人的交流,无盈利目的

最近在做pcl的项目,不方便将源码上传,望谅解

如有疑问,欢迎交流

原创粉丝点击