Kinect v2.0实现对采集到的图像实时解算距离和坐标信息,并分析源码及其背后的算法原理

您所在的位置:网站首页 2021年大疆mini3 Kinect v2.0实现对采集到的图像实时解算距离和坐标信息,并分析源码及其背后的算法原理

Kinect v2.0实现对采集到的图像实时解算距离和坐标信息,并分析源码及其背后的算法原理

2023-09-20 13:05| 来源: 网络整理| 查看: 265

 

     Kinect2 v2.0 是一款深度相机,笔者想用它来测量距离信息,是在ROS系统下进行的,用鼠标去点击图片就能显示该位置的物体的距离和坐标相对于相机来说。

    首先要知道相机坐标系,Kinect使用以Kinect的IR传感器为中心的直角坐标系。Y轴正指向上方,Z轴正指向Kinect指向的位置,X轴正向左侧。此坐标系中的一个单位等于一米。

Jack Ju https://img-blog.csdnimg.cn/20200724114331678.png

 

   为了实现这个功能,资料很少,并且没有给出源码链接,为了避免后面的人走弯路。所以我这里给出了github链接,直接使用就可以。https://blog.csdn.net/hehedadaq/article/details/80557926   

  https://github.com/JackJu-HIT/kinect-v2.0

  参考了博客https://blog.csdn.net/sunbibei/article/details/51594824

   运行效果如下图所示:

Jack Ju https://img-blog.csdnimg.cn/20200724114950928.png

 

      因为我也刚接触视觉和PCL点云,我只说明输出部分,我最终要用他的输出数据进行导航。

      下面的就是输出的数据要显示在屏幕上。

double distance=sqrt(ptMsg.point.x*ptMsg.point.x+ptMsg.point.y*ptMsg.point.y+ptMsg.point.z*ptMsg.point.z); cv::putText(color, oss.str(), pos, font, sizeText, colorText, lineText, CV_AA); ossXYZ.str(""); ossXYZ z = depthValue; itP->x = *itX * depthValue;//妙啊 itP->y = y * depthValue; itP->b = itC->val[0]; itP->g = itC->val[1]; itP->r = itC->val[2]; itP->a = 255; } } }

       我们实际上是根据像素来匹配点云,进而得到世界坐标系的xyz,点云的xyz信息。具体代码看如下:

      最关键的部分,你通过(img_x,img_y)匹配points,进而得到坐标。  const pcl::PointXYZRGBA& pt = cloud->points[img_y * depth.cols + img_x];//创建点云并赋值       ptMsg.point.x = pt.x;       ptMsg.point.y = pt.y;       ptMsg.point.z = pt.z;

基于此原理,我们可以写一个在你的屏幕中间提取一条竖线的障碍物距离信息并返回最小距离,代码如下

 /***实现屏幕中央一条竖线返回最小距离值***/       double min_distance=1000000000;       double middle_distance;       for(int i=0;i



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3