测量 Yolo 检测到的物体的尺寸。前任。高度,宽度,与相机的距离

Posted

技术标签:

【中文标题】测量 Yolo 检测到的物体的尺寸。前任。高度,宽度,与相机的距离【英文标题】:To measure the dimensions of the Yolo detected object. ex. Height, width, distance from camera 【发布时间】:2019-05-22 12:14:32 【问题描述】:

我正在使用带有 ROS 动力学的 ubuntu 16.04。对于我的项目工作,我使用 YOLO 暗网检测到了门和门把手。为此,我使用的是英特尔 realsense d435 相机。

现在我的问题如下:

如何测量门与摄像头之间的距离。

如何测量门的高度和宽度。

如何在 rviz 3d 中添加检测到的门。

【问题讨论】:

【参考方案1】:

(1) 如何测量门与摄像头之间的距离。

PCL 样本普查见 pcl 样本。它会给你 ax+by+cz+d=0 实际的垂直距离应该是d。

(2) 如何测量门的高度和宽度。

获取内联结果的样本共识结果,然后使用 PCA 或任何必要的方式确定原则方向。基于做主导方向,单独测量主导方向的最大值和最小值。那应该给你身高。对宽度做同样的事情

(3) 如何在 rviz 3d 中添加检测到的门。 同样的检测和发布

下面是一个简短的示例或者你是如何做到的

ros::Publisher pub;

float deg2rad(float alpha)

  return (alpha * 0.017453293f);


void ransac(pcl::PointCloud<pcl::PointXYZRGB>::Ptr input, pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_projected)

  pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
  *cloud = *input;

  pcl::ModelCoefficients::Ptr floor_coefficients(new pcl::ModelCoefficients());
  pcl::PointIndices::Ptr floor_indices(new pcl::PointIndices());
  pcl::SACSegmentation<pcl::PointXYZRGB> floor_finder;
  floor_finder.setOptimizeCoefficients(true);
  floor_finder.setModelType(pcl::SACMODEL_PARALLEL_PLANE);
  // floor_finder.setModelType (SACMODEL_PLANE);
  floor_finder.setMethodType(pcl::SAC_RANSAC);
  floor_finder.setMaxIterations(300);
  floor_finder.setAxis(Eigen::Vector3f(0, 0, 1));
  floor_finder.setDistanceThreshold(0.08);
  floor_finder.setEpsAngle(deg2rad(5));
  floor_finder.setInputCloud(boost::make_shared<pcl::PointCloud<pcl::PointXYZRGB> >(*cloud));
  floor_finder.segment(*floor_indices, *floor_coefficients);

  if (floor_indices->indices.size() > 0)
  
    // Extract the floor plane inliers
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr floor_points(new pcl::PointCloud<pcl::PointXYZRGB>);
    pcl::ExtractIndices<pcl::PointXYZRGB> extractor;
    extractor.setInputCloud(boost::make_shared<pcl::PointCloud<pcl::PointXYZRGB> >(*cloud));
    extractor.setIndices(floor_indices);
    extractor.filter(*floor_points);
    extractor.setNegative(true);
    extractor.filter(*cloud);

    // Project the floor inliers
    pcl::ProjectInliers<pcl::PointXYZRGB> proj;
    proj.setModelType(pcl::SACMODEL_PLANE);
    proj.setInputCloud(floor_points);
    proj.setModelCoefficients(floor_coefficients);
    proj.filter(*cloud_projected);

    floor_points->header.frame_id = "camera_link";
    floor_points->header.stamp = ros::Time::now().toNSec();
   


void passthrough_z(const sensor_msgs::PointCloud2ConstPtr& input, pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_passthrough)

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
    pcl::fromROSMsg(*input, *cloud);

    // Create the filtering object
    pcl::PassThrough<pcl::PointXYZRGB> pass;
    pass.setInputCloud (boost::make_shared<pcl::PointCloud<pcl::PointXYZRGB> >(*cloud));
    pass.setFilterFieldName ("z");
    pass.setFilterLimits (0.0, 6.0);
    pass.filter (*cloud_passthrough);


void passthrough_y(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_passthrough)

    // Create the filtering object
    pcl::PassThrough<pcl::PointXYZRGB> pass;
    pass.setInputCloud (boost::make_shared<pcl::PointCloud<pcl::PointXYZRGB> >(*cloud_passthrough));
    pass.setFilterFieldName ("y");
    pass.setFilterLimits (0.0, 5.0);
    pass.filter (*cloud_passthrough);


void passthrough_x(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_passthrough)

    // Create the filtering object
    pcl::PassThrough<pcl::PointXYZRGB> pass;
    pass.setInputCloud (boost::make_shared<pcl::PointCloud<pcl::PointXYZRGB> >(*cloud_passthrough));
    pass.setFilterFieldName ("x");
    pass.setFilterLimits (-2.0, 2.0);
    pass.filter (*cloud_passthrough);


void cloud_cb (const sensor_msgs::PointCloud2ConstPtr& input)

  // Do data processing here...

  // run pass through filter to shrink point cloud
  pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_passthrough(new pcl::PointCloud<pcl::PointXYZRGB>);
  passthrough_z(input, cloud_passthrough);
  passthrough_y(cloud_passthrough);
  passthrough_x(cloud_passthrough);

  // run ransac to find floor
  pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_projected(new pcl::PointCloud<pcl::PointXYZRGB>);
  ransac(cloud_passthrough, cloud_projected);
  pub.publish(*cloud_projected);


int main (int argc, char** argv)

  // Initialize ROS
  ros::init (argc, argv, "pcl_node");
  ros::NodeHandle nh;

  // Create a ROS subscriber for the input point cloud
  ros::Subscriber sub = nh.subscribe ("camera/depth_registered/points", 1, cloud_cb);

  // Create a ROS publisher for the output point cloud
  pub = nh.advertise<sensor_msgs::PointCloud2> ("output", 1);

  // Spin
  ros::spin ();

【讨论】:

以上是关于测量 Yolo 检测到的物体的尺寸。前任。高度,宽度,与相机的距离的主要内容,如果未能解决你的问题,请参考以下文章

yolo算法是啥?

经典论文解读YOLO 目标检测

经典论文解读YOLO 目标检测

Opencv项目实战:09 物体尺寸测量

翻译:YOLOv3版本3 YOLO:实时物体检测 CNN卷积神经网络

想法如何使用opencv for IOS测量检测到的物体与相机的距离?