分享几行代码|yolo识别出物体像素坐标如何转成相机坐标

大家好,我是小鱼。

今天分享几行代码,是自己一两年前写的了,当时就是用来将yolo识别结果的位姿转换成相机坐标系下的位姿。

代码很简单,就一个函数,输入像素坐标xy和深度z即可求出对应的空间坐标,计算过程中还需要相机的内参和畸变参数,这个在相机标定时即可获取。

为什么要从像素坐标转换成三维的相机坐标系呢?

一般我们使用yolo等识别出物体在图像中的像素位置,像素位置并不能用于机械臂抓取或者3D的位姿计算,所以我们还需要将其转换成相机坐标系下的坐标使用~

重点函数:cv2.undistortPoints

需要注意的是,在opencv4.1版本中好像找不到该函数,后来小鱼安装了4.2版本的opencv-python库找到了该函数。

影响最终结果的主要是内参和畸变D,所以发现最终结果误差比较大,可以从这两个方面下手。

  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
您可以在C++中订阅`darknet_ros_msgs/BoundingBoxes`消息,并从中获取YOLO像素坐标。首先,您需要安装并配置ROS和相关的依赖项。然后,可以编写一个ROS节点来订阅该话题并处理消息。 以下是一个示例代码,演示如何在C++中订阅`darknet_ros_msgs/BoundingBoxes`话题并获取YOLO像素坐标: ```cpp #include <ros/ros.h> #include <darknet_ros_msgs/BoundingBoxes.h> void boundingBoxesCallback(const darknet_ros_msgs::BoundingBoxes::ConstPtr& msg) { // 在这里处理接收到的消息 for (const auto& box : msg->bounding_boxes) { // 获取YOLO像素坐标 int x = box.xmin; int y = box.ymin; int width = box.xmax - box.xmin; int height = box.ymax - box.ymin; // 打印坐标信息 ROS_INFO("YOLO像素坐标:x=%d, y=%d, width=%d, height=%d", x, y, width, height); } } int main(int argc, char** argv) { ros::init(argc, argv, "yolo_subscriber"); ros::NodeHandle nh; // 创建一个订阅者,订阅'darknet_ros_msgs/BoundingBoxes'话题 ros::Subscriber sub = nh.subscribe<darknet_ros_msgs::BoundingBoxes>("darknet_ros/bounding_boxes", 10, boundingBoxesCallback); // 循环等待回调函数 ros::spin(); return 0; } ``` 请确保将上述代码保存为ROS工作空间中的一个C++源文件,并在`CMakeLists.txt`中添加适当的编译指令。然后,构建并运行该节点,它将订阅`darknet_ros_msgs/BoundingBoxes`话题,并在接收到消息时打印YOLO像素坐标。 请注意,这只是一个示例代码,您可能需要根据实际情况进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值