使用kinect2进行目标跟踪-ROS平台

2023-05-16

之前闲得无聊,在ROS平台上调用Kinect摄像头进行目标跟踪检测。

首先,要在ubuntu下安装好Kinect2和ROS的接口,参考http://www.mamicode.com/info-detail-1572423.html

我贴一个.cpp的代码,详细的工程文件放github了https://github.com/haicheng12/kinect2_track

#include<ros/ros.h> //ros标准库头文件
#include<iostream> //C++标准输入输出库
#include<cv_bridge/cv_bridge.h>
#include<sensor_msgs/image_encodings.h>
#include<image_transport/image_transport.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <sstream>
#include <string>
#include <iostream>

using namespace std;
using namespace cv;

namespace enc = sensor_msgs::image_encodings;

int MIN_H = 18;
int MIN_S = 138;
int MIN_V = 116;
int MAX_H = 44;
int MAX_S = 190;
int MAX_V = 243;

static const string RGB_Window = "RGB Image";
static const string Gray_Window = "Gray Image";
static const string HSV_Window = "HSV Image";
static const string Thresholded_Window = "Thresholded Image";
static const string Track_Window = "Track Image";

//定义一个转换的类
class KINECT2_ROS
{
  private:
    ros::NodeHandle nh_; //定义ROS句柄
    image_transport::ImageTransport it_; //定义一个image_transport实例
    image_transport::Subscriber img_sub_;//hsv
    image_transport::Publisher image_pub_; //定义ROS图象发布器
  public:
    Mat rgbImage;
    KINECT2_ROS()
      :it_(nh_) //构造函数
    {
        img_sub_ = it_.subscribe("/kinect2/sd/image_color_rect", 1,&KINECT2_ROS::img_callback, this);
        image_pub_ = it_.advertise("/kinect2/sd/image_color/output", 1);
        //初始化输入输出窗口
        namedWindow("Trackbars");
        createTrackbar("MIN_H","Trackbars",&MIN_H,180,NULL);
        createTrackbar("MAX_H","Trackbars",&MAX_H,180,NULL);
        createTrackbar("MIN_S","Trackbars",&MIN_S,256,NULL);
        createTrackbar("MAX_S","Trackbars",&MAX_S,256,NULL);
        createTrackbar("MIN_V","Trackbars",&MIN_V,256,NULL);
        createTrackbar("MAX_V","Trackbars",&MAX_V,256,NULL);

        namedWindow(RGB_Window);
        namedWindow(Gray_Window);
        namedWindow(HSV_Window);
        namedWindow(Thresholded_Window);
        namedWindow(Track_Window);
    }

    ~KINECT2_ROS() //析构函数
    {
         destroyWindow(RGB_Window);
         destroyWindow(Gray_Window);
         destroyWindow(HSV_Window);
         destroyWindow(Thresholded_Window);//Track_Window
         destroyWindow(Track_Window);
    }

    void img_callback(const sensor_msgs::ImageConstPtr& msg)
    {
        cv_bridge::CvImagePtr cv_ptr;
        try
        {
            cv_ptr = cv_bridge::toCvCopy(msg);
        }
        catch (cv_bridge::Exception& e)
        {
            ROS_ERROR("tutorialROSOpenCV::main.cpp::cv_bridge exception: %s", e.what());
            return;
        }
        cv_ptr->image.copyTo(rgbImage);

        Mat image_gray,img_hsv,img_mask;

        cvtColor(cv_ptr->image, image_gray, CV_RGB2GRAY);//灰度处理
        cvtColor(cv_ptr->image,img_hsv,CV_BGR2HSV);//hsv处理

        inRange(img_hsv,cv::Scalar(MIN_H,MIN_S,MIN_V),cv::Scalar(MAX_H,MAX_S,MAX_V),img_mask);//滚动条范围

        imshow(RGB_Window, cv_ptr->image);
        imshow(Gray_Window, image_gray);
        imshow(HSV_Window, img_hsv);
        imshow(Thresholded_Window, img_mask);

        Mat result = rgbImage.clone();

        //查找轮廓并绘制轮廓
        vector<vector<Point> > contours;
        findContours(img_mask, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
        drawContours(result, contours, -1, Scalar(0, 0, 255), 2);//在result上绘制轮廓

        //查找正外接矩形
        vector<Rect> boundRect(contours.size());
        for (int i = 0; i < contours.size(); i++)
        {
            boundRect[i] = boundingRect(contours[i]);
            rectangle(result, boundRect[i], Scalar(0, 255, 0), 2);//在result上绘制正外接矩形
        }

        //计算外界矩形的面积
        for (int i = 0; i < (int)boundRect.size(); i++)
        {
             double Outline_Area = contourArea(contours[i], true);//轮廓的面积
             cout << "【用轮廓面积计算函数计算出来的第" << i << "个轮廓的面积为:】" << Outline_Area << endl;
        }

        imshow(Track_Window, result);

        waitKey(3);

        image_pub_.publish(cv_ptr->toImageMsg());
    }

};

int main(int argc, char** argv)
{
    ros::init(argc, argv, "Image_test");
    KINECT2_ROS obj;

    ros::spin();
}

具体效果如图,其实也就是用了些HSV,调用个kinect图像,费这么大周转,服了我自己......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用kinect2进行目标跟踪-ROS平台 的相关文章

  • Python 实现 Dijkstar 路径规划算法

    Dijstar 最短路径算法 用于计算起始点到最终点的最短路径 一般采用的是贪心算法策略 原理可以参考 图解 Open list 和 close list 环境 Terminal 需要预先安装两个库 matplotlib 和 math pi
  • 使用WTGAHRS2(JY-GPSIMU)在ROS中读取数据并发布话题

    目录 IMU简介 驱动程序 IMU串口通信协议 程序 效果 IMU简介 十轴惯性导航传感器WTGAHRS2传感器集成高精度的陀螺仪 加速度计 地磁场传感器 GPS 模块 采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法 能够快速求
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • 无人驾驶论坛

    1 百度Apollo论坛 http www 51apollo com 2 人工智能中文资讯网 http www ailab cn
  • ROS学习(1)——ROS1和ROS2的区别

    因为机器人是一个系统工程 它包括了机械臂结构 电子电路 驱动程序 通信框架 组装集成 调试和各种感知决策算法等方面 任何一个人甚至是一个公司都不可能完成机器人系统的研发工作 但是我们又希望自己能造出一个机器人跑一跑 验证一下自己的算法 所以
  • 1-如何安装ROS

    如何安装ROS 大家好 我是如何 今天尝试在Ubantu下安装ROS Robot Operating System 测试环境 虚拟机VMware Ubantu20 04 准备步骤 添加ROS软件源 sudo sh c echo deb ht
  • ModuleNotFoundError: No module named ‘rosbag‘

    1 ModuleNotFoundError No module named rosbag File opt ros kinetic lib python2 7 dist packages roslib launcher py line 42
  • 清华大学开源软件镜像站网址

    清华大学 TUNA 协会原名清华大学学生网管会 注册名清华大学学生网络与开源软件协会 是由清华大学网络技术和开源软件爱好者 技术宅组成的团体 现阶段向校内外提供开源软件镜像等服务 清华大学 TUNA 协会清华大学 TUNA 协会原名清华大学
  • 在Ubuntu 14.04.2 LTS上安装Qt

    Qt是一个跨平台的应用程序框架 广泛用于开发具有GUI界面的应用软件以及命令行工具 几乎所有操作系统都可以使用Qt 如Windows Mac OS X Android等 用于开发Qt应用程序的主要编程语言是C 但是可以使用诸如Python
  • 解决ros安装 使用roscore命令测试问题

    本人安装教程完成ROS的安装后 在进行测试如图1命令 出现 解决办法输入完命令1后要输入命令2才行 即可测试成功 测试成功的界面如下
  • Ubuntu16.04及ROS Kinetic环境下安装使用RealSense SR300

    Ubuntu16 04及ROS Kinetic环境下安装使用RealSense SR300 1 准备条件 需要安装Ubuntu16 04及ROS Kinetic 2 安装驱动 安装realsense的驱动流程可以根据Github上的官方推荐
  • 服务数据的定义和使用

    1 自定义数据服务 在包下创建srv文件夹 在文件夹下创建Person srv 在Person srv下输入以下内容 代表数据类型 string name uint8 age uint8 sex uint8 unknown 0 uint8
  • 《机器人操作系统入门》课程代码示例安装出错解决方法

    问题描述 学习 机器人操作系统入门 课程时 在Ubuntu 16 04 上安装了kinetic 安装ROS Academy for Beginners时依赖总是报错 如下所示 rosdep install from paths src ig
  • ubuntu18.04命令安装ros2

    ROS2官方文档 本教程为apt get命令安装方式 官网教程有点问题 借鉴一下大佬的安装方式 文章目录 1 安装ROS2 1 1 安装秘钥相关指令 1 2 授权秘钥 1 3 添加ROS2软件源 1 4 安装 2 设置环境 可选但是推荐 2
  • 在 CLion 中设置 ROS 包

    我正在使用 CLion C IDE 来编辑 ROS 包 我可以通过打开CMakeLists txt文件 但是 我收到一个错误 FATAL ERROR find package catkin 失败 在工作区和 CMAKE PREFIX PAT
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • catkin_make 编译报错 Unable to find either executable ‘empy‘ or Python module ‘em‘...

    文章目录 写在前面 一 问题描述 二 解决方法 参考链接 写在前面 自己的测试环境 Ubuntu20 04 一 问题描述 自己安装完 anaconda 后 再次执行 catkin make 遇到如下问题 CMake Error at opt
  • catkin_make 编译报错 Unable to find either executable ‘empy‘ or Python module ‘em‘...

    文章目录 写在前面 一 问题描述 二 解决方法 参考链接 写在前面 自己的测试环境 Ubuntu20 04 一 问题描述 自己安装完 anaconda 后 再次执行 catkin make 遇到如下问题 CMake Error at opt
  • ROS 从 python 节点发布数组

    我是 ros python 的新手 我正在尝试从 python ros 节点发布一个一维数组 我使用 Int32MultiArray 但我无法理解多数组中布局的概念 谁能给我解释一下吗 或者还有其他方式发布数组吗 Thanks usr bi
  • 如何在Windows上安装机器人操作系统ROSJava?

    ROS 的文档很糟糕 一个很大的讽刺是 ROS 的 Groovy 和 ROSJava 版本的创建是为了让 Windows 等平台上的开发人员能够利用出色的机器人 SDK 而所有安装说明仍然面向 Linux ubuntu 用户 The ROS

随机推荐