机器人视觉项目:视觉检测识别+机器人跟随(17)

2023-05-16

参考一个实例行人检测
在ubuntu+ros环境下,利用RGBD采集数据给小车,实现行人跟随。

原作者开源的例子是出现一个窗口,用鼠标选择一个区域做kcf跟随,选择的物体不受限制,物体移动后,机器人随即跟随。
博主实现的是用opencv行人检测的demo,替换原作者的例子。该demo在opencv-2.4.13/samples/cpp/peopledetect.cpp下。

先认识一下原作者的例子中的runtracker.cpp,其中的ImageConverter类是核心,首先对接收/发送主题的Publisher/Subscrible初始化,
设置回调函数。

image_sub_ = it_.subscribe("/camera/rgb/image_rect_color", 1,&ImageConverter::imageCb, this);
depth_sub_ = it_.subscribe("/camera/depth/image", 1,&ImageConverter::depthCb, this);
pub = nh_.advertise<geometry_msgs::Twist>("/mobile_base/mobile_base_controller/cmd_vel", 1000);image_sub_是接受rgb图的subscribe,执行imageCb回掉函数,imageCb主要是将摄像头的数据显示在窗口中,选择感兴趣区域。 
depth_sub_是接受深度图的subscribe,执行depthCb回掉函数,depthCb作用就是计算距离和方向。 
将手动选择感兴趣区域改为自动选择感兴趣区域,是在imageCb函数中修改。
imageCb中 cv::setMouseCallback(RGB_WINDOW, onMouse, 0);监听鼠标操作,如果鼠标不动,程序不会往下执行。onMouse为鼠标监听回调。
要实现自动选择肯定就不能用这个了,将其注掉。 
onMouse函数:当按下鼠标左键时,这个点就是起始点,按住鼠标左键移动鼠标,会选择感兴趣区域,松开鼠标左键,bRenewROI = true;修改标志,
新的roi区域selectRect已经产生。在imageCb中程序继续执行,初始化KCFTracker,开始追踪。 
preparePeopleDetect()函数是初始化检测;
peopleDetect()行人检测。

void preparePeopleDetect()
    {
        has_dectect_people = false;
        //hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());//使用默认的训练数据,下面是使用自己的训练数据。
        MySVM svm;
        string path = ros::package::getPath("track_pkg")+"/src/12000neg_2400pos.xml";
        printf("path === %s",path.c_str());
        //svm.load("/home/server/catkin_ws/src/tracker_kcf_ros/src/track_pkg/src/12000neg_2400pos.xml");
        svm.load(path.c_str());
        DescriptorDim = svm.get_var_count();//特征向量的维数,即HOG描述子的维数
        int supportVectorNum = svm.get_support_vector_count();//支持向量的个数
        cout<<"支持向量个数:"<<supportVectorNum<<endl;

        Mat alphaMat = Mat::zeros(1, supportVectorNum, CV_32FC1);//alpha向量,长度等于支持向量个数
        Mat supportVectorMat = Mat::zeros(supportVectorNum, DescriptorDim, CV_32FC1);//支持向量矩阵
        Mat resultMat = Mat::zeros(1, DescriptorDim, CV_32FC1);//alpha向量乘以支持向量矩阵的结果

        //将支持向量的数据复制到supportVectorMat矩阵中
        for(int i=0; i<supportVectorNum; i++)
        {
            const float * pSVData = svm.get_support_vector(i);//返回第i个支持向量的数据指针
            for(int j=0; j<DescriptorDim; j++)
            {
                supportVectorMat.at<float>(i,j) = pSVData[j];
            }
        }

        //将alpha向量的数据复制到alphaMat中
        double * pAlphaData = svm.get_alpha_vector();//返回SVM的决策函数中的alpha向量
        for(int i=0; i<supportVectorNum; i++)
        {
            alphaMat.at<float>(0,i) = pAlphaData[i];
        }

        //计算-(alphaMat * supportVectorMat),结果放到resultMat中
        //gemm(alphaMat, supportVectorMat, -1, 0, 1, resultMat);//不知道为什么加负号?
        resultMat = -1 * alphaMat * supportVectorMat;

        //得到最终的setSVMDetector(const vector<float>& detector)参数中可用的检测子

        //将resultMat中的数据复制到数组myDetector中
        for(int i=0; i<DescriptorDim; i++)
        {
            myDetector.push_back(resultMat.at<float>(0,i));
        }
        //最后添加偏移量rho,得到检测子
        myDetector.push_back(svm.get_rho());
        cout<<"检测子维数:"<<myDetector.size()<<endl;
        hog.setSVMDetector(myDetector);
        ofstream fout("HOGDetectorForOpenCV.txt");
        for(int i=0; i<myDetector.size(); i++)
        {
            fout<<myDetector[i]<<endl;
        }
        printf("Start the tracking process\n");

    }
    //行人检测
    void peopleDetect()
    {
        if(has_dectect_people)
            return;
        vector<Rect> found, found_filtered;
        double t = (double)getTickCount();
        hog.detectMultiScale(rgbimage, found, 0, Size(8,8), Size(32,32), 1.05, 2);
        t = (double)getTickCount() - t;
        //printf("tdetection time = %gms\n", t*1000./cv::getTickFrequency());
        size_t i, j;
        printf("found.size==%d",found.size());
        for( i = 0; i < found.size(); i++ )
        {
            Rect r = found[i];
            for( j = 0; j < found.size(); j++ )
                if( j != i && (r & found[j]) == r)
                    break;
            if( j == found.size() )
                found_filtered.push_back(r);
        }
        Rect r ;
        for( i = 0; i < found_filtered.size(); i++ )
        {
            r = found_filtered[i];
            // the HOG detector returns slightly larger rectangles than the real objects.
            // so we slightly shrink the rectangles to get a nicer output.
            r.x += cvRound(r.width*0.1);
            r.width = cvRound(r.width*0.8);
            r.y += cvRound(r.height*0.07);
            r.height = cvRound(r.height*0.8);
            //rectangle(rgbimage, r.tl(), r.br(), cv::Scalar(0,255,0), 3);
            //printf("r.x==%d,y==%d,width==%d,height==%d\n",r.x,r.y,r.width,r.height);
        }
        //防止误检测
        if(r.width>100&&r.height>350){
            has_dectect_people=true;
            selectRect.x = r.x+(r.width-roi_width)/2;
            selectRect.y = r.y+(r.height-roi_height)/2;
            selectRect.width = roi_width;
            selectRect.height = roi_height;
            printf("selectRect.x==%d,y==%d,width==%d,height==%d\n",selectRect.x,selectRect.y,selectRect.width,selectRect.height);
        }//imshow(RGB_WINDOW, rgbimage);
    }


检测到人后,人所在的区域是一个矩形,在矩形区域内取其中间100*100的矩形为感兴趣区域。检测到人后将has_dectect_people置为true,
使其不会再次检测。设置bRenewROI = true;select_flag = true; select_flag:当追踪目标未消失时,为true,消失时为false,
与bRenewROI一起作为是否重新检测行人追踪的标记。
 

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

机器人视觉项目:视觉检测识别+机器人跟随(17) 的相关文章

  • 进程、线程以及上下文切换概念详解

    目录 1 线程和进程的概念 2 进程间的通信方式有哪些 xff1f 3 线程的同步和互斥操作 4 在Java中线程是如何实现同步和互斥的 xff1f 4 什么是线程的上下文切换 xff1f 5 什么是用户模式和内核模式 xff1f 1 线程
  • 【计算机网络】(五)拨号上网与宽带上网PPP,PPPoE,ADSL,FTTH(GPON)

    可见链接 https www zhihu com question 48988005 它们都是个人用户接入Ethernet的协议 小学的时候家里就是拨号上网的 xff0c 每次有人打电话到家里网就会断掉 xff0c 游戏就掉线 xff0c
  • 旧版本PX4固件编译报错:error: converting a packed ‘flash_entry_header_t‘ {aka ‘struct flash_entry_header_t‘}..

    文章目录 前言一 解决办法1二 解决办法2三 总结 前言 旧版本PX4 Autopilot固件编译报错 xff0c 报错内容如下 xff1a src lib parameters flashparams flashfs c 190 2 er
  • SNMP测试

    SNMP测试 测试环境 xff1a Solaris10 10 10 128 89 Linux xff1a 10 10 151 8 windows 测试方案 xff1a 1 本地测试 2 远程测试 配置文件 xff1a 修改环境变量 在sol
  • apex编译错误解决方案

    这里写自定义目录标题 apex编译错误解决方案 csrc mlp cpp 123 3 note in expansion of macro AT DISPATCH FLOATING TYPES AND HALF AT DISPATCH FL
  • Javaweb项目实践MVC入门到精通

    Javaweb项目实践MVC入门到精通 目标配置环境实体模型 user Dao的实现实体模型 ModelViewController xff1a 转发任务 xff0c 路由器的功能安全sql注入常见问题 目标 这个目标是写一个MVC模型 通
  • C++ 铪铪铪铪 烫烫烫 屯屯屯

    VS中 xff0c Debug模式下 xff0c 对于未初始化的内存 xff1a 1 xff09 若为栈内存 xff0c 默认为一连串 烫烫烫 xff0c 0xcc 2 xff09 若为堆内存 xff0c 默认为一连串 屯屯屯 xff0c
  • 创新的力量

    创新是个非常好的词 xff0c 虽然这个词已经被用滥了 xff0c 但我依然固执的认为这是一个充满了迷人光辉的词汇 如果把创新放入科技领域 xff0c 这应该是我在科技领域最喜欢的一个词了 我常常对同事或团队的成员说 xff0c 我们在做产
  • 魔方矩阵

    看到魔方矩阵 xff0c 好奇 xff0c 好玩儿 xff0c 正好赶上周五 xff0c 就来放松一下 xff0c 总结一下几种魔方矩阵的规律 xff0c 并写一下C 43 43 实现过程 定义 xff1a 平面魔方的一般定义 xff1a
  • 样条插值曲线类型及其优缺点说明

    Spline Types This page gives a breakdown of each spline type how to use each one and the advantages disadvantages of eac
  • caffe layer层详解

    1 基本的layer定义 xff0c 参数 1 基本的layer定义 xff0c 参数 如何利用caffe定义一个网络 xff0c 首先要了解caffe中的基本接口 xff0c 下面分别对五类layer进行介绍 Vision Layers
  • caffe编译中的python问题

    问题 usr include boost python detail wrap python hpp 50 23 fatal error pyconfig h No such file or directory 解决方案 make clea
  • latex图像注释位置

    latex图像注释的位置在左边 不知道谁把模板里的 usepackage caption 给注释掉了
  • pytorch pretrained model

    pytorch pretrained model two methods method 1 比较大小 self span class token punctuation span model span class token operato
  • 嵌入式100题(76):中断和异常的区别

    中断和异常的区别 1 异常 是指CPU内部出现的中断 即在CPU执行特定指令时出现的非法情况 同时异常也称为同步中断 因此只有在一条指令执行后才会发出中断 不可能在指令执行期间发生异常 产生的原因 程序的错误产生的 编程异常通常叫做软中断
  • 字节序、大端序与小端序及其相关转换

    大端序与小端序及其相关转换 一 字节序定义 字节序 xff0c 为字节的顺序 xff0c 就是大于一个字节类型的数据在内存中的存放顺序 xff0c 一个字节的数据当然就没有顺序可言了 xff0c 其实大部分人在实际的开发中都很少会直接和字节
  • SkeyeLive开源流媒体PC端推拉流直播软件源码功能框架解析

    SkeyeLive是OpenSKEYE开源流媒体团队开发的一款功能丰富的开源PC端流媒体推流拉流直播软件项目 xff0c 目前支持Windows Android版本 xff0c 后续将支持ios版本 xff0c 其中Windows版本的Sk
  • 融资租赁业务系统(财务中台)

    融资租赁业务系统 财务中台 产品白皮书 版本号 xff1a V1 1 李雷 微信号 xff1a yanan122914 平台概述 融资租赁财务中台产品是一套专门针对融资租赁行业设计的融资租赁财务统一解决方案 对租赁公司传统的大单回租 直租

随机推荐

  • InfoQ推荐语:我的梦想

    大家好 非常高兴能在这一期的架构师和大家见面 本人工作了十余载 先后在洪恩软件和用友集团任职 目前任职于用友集团瑞友科技研究院 主要关注领域 企业应用软件平台研发 领域驱动设计 OSGi 动态语言应 用 云计算 移动互联和Mac OS平台相
  • 【MySQL】------数据库连接

    分享第十九条励志语录 要想飞起来 xff0c 首先要有飞翔的信念 xff0c 如果没有这个信念 xff0c 永远不可能飞起来 但只要有了飞翔的信念 xff0c 再加上自己的努力 xff0c 就有可能能够飞起来 成功也是这样 xff0c 要想
  • 无人机调试记录(一)

    无人机调试记录 xff08 一 xff09 固件 xff1a PX4 地面站 xff1a QGC APM xff08 pixhawk xff09 飞控疑难杂症解决方法汇总 校准 1 确保陀螺仪 水平线校准正确 如果校准完成后 xff0c Q
  • VsCode中使用git

    你是否厌倦了每天早上到公司都要打开git 小黑框 执行git clone 地址去拉取代码 而强大的VsCode只需要点一下即可解决 1 添加到暂存区 xff0c 更改文件以后可以发现 点进去上图这个标志 如果没有 xff0c 右击左侧菜单栏
  • 虚拟机上无法运行ubuntu自带的gazebo仿真器报VMware: vmw_ioctl_command error 无效的参数

    问题说明 xff1a 虚拟机版本 xff1a VMware Workstation 16 Pro Ubuntu版本 xff1a Ubuntu 18 04 现象 xff1a gazebo闪退 xff0c 并报 VMware vmw ioctl
  • NVIDIA JETSON TX2镜像制作以及刷机流程

    一 安装环境准备 xff1a Ubuntu宿主主机一台 xff0c TX2新老板子各一个 xff08 老的用来镜像备份 xff0c 用这个镜像给新的刷机 xff09 xff0c USB Micro USB线一根 1 下载TX2驱动 直接在百
  • 各种排序混合---冒泡排序、选择排序、插入排序

    冒泡排序 不多说 xff0c 看代码 xff0c 就是把最大的数字或者最小的数字沉到最右边 xff0c 最后输出数组 include lt iostream gt include lt stdlib h gt include lt math
  • 【PyQt5】串口数据实时绘图

    常见的串口调试助手一般只有简单的文本界面 xff0c 偶然看到 Arduino IDE 自带的串口绘图工具 xff0c 觉得用户设计挺友好 想着利用一下周末空闲时间 xff0c 用 PyQt5 实现一个串口数据实时绘图小工具 xff0c 在
  • HTTPS、HTTPS、SSH、MSTSC等常用网络服务的端口号

    前言 今天在 powershell下使用curl命令访问 一个网址 返回 443 port 相关的错误信息 xff0c 我第一眼看 xff0c 还以为是HTTP STATUS CODE 于是去查了一会儿才发现 xff0c 是端口号的问题 下
  • vue服务端渲染——基础

    文章目录 vue服务端渲染 xff08 基础 xff09 Nuxt框架文件目录结构项目启动 打包生命周期SSRnuxtserverInitmiddleware 中间件全局中间件页面级中间件 validate 校验参数asynData校验参数
  • 变压变频调速的原理(VVVF)——基础补充

    1 变压变频调速系统的基本原则 xff1a 维持气隙磁通不变 根据电磁感应原理 xff0c 气隙磁通在定子绕组每相绕组中的感应电动势为 xff1a Fs 为定子频率 xff0c Ns 为定子每相绕组串联匝数 xff0c Kns为基波绕组系数
  • RIA迷你书序言

    RIA Minibook Prologue RIA迷你书序言 Rich Internet Applications or RIAs have truly revolutionized user experiences online When
  • Tensorflow版本和python对应关系,以及tensorflow下载路径

    A few installation mechanisms require the URL of the TensorFlow Python package The value you specify depends on your Pyt
  • 串口的应用层操作

    一 设备中一般会用第二串口与外设通信 需要可以配置波特率 xff0c 实现应用层面的串口读写 二 代码实现 span class token macro property span class token directive hash sp
  • 委托与事件

    委托与事件 一 委托 xff08 delegate xff09 1 委托是一种可以把引用存储为函数的类型 2 在定义了委托后 xff0c 就可以声明该委托类型的变量 xff0c 接着把这个变量初始化为与委托有相同返回类型和参数类别的函数引用
  • 类域

    class String public 错误 名字 index type 还没有被声明 char amp operator index type typedef int index type 在类定义中用到的名字必须在使用前首先被声明这个规
  • 怎样把自己写的组件、库推到npm服务上面,并给别人使用?

    1 创建npm账号 2 cmd命令行到某个文件夹下 xff0c 然后登录 span class nx npm span span class nx login span 3 npm init填写包名 xff0c 以及一些信息 4 通过npm
  • 浅析 耦合 紧耦合 松耦合 解耦

    耦合 指模块之间的依赖关系 xff0c 包括控制关系 调用关系 数据传递关系 模块间联系越多 xff0c 其耦合性越强 xff0c 同时表明其独立性越差 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准 划分模块的一个准则就是高内聚
  • 机器人视觉项目:视觉检测识别+机器人跟随(1)

    更新一波暑假做的机器人视觉检测跟随的项目 xff0c 有一些笔记都放在博客中 xff0c 有需要的可以交流 项目的目的是在机器人上搭建视觉检测系统 xff0c Kinect 43 ros 43 深度学习目标检测 43 行人识别 xff08
  • 机器人视觉项目:视觉检测识别+机器人跟随(17)

    参考一个实例行人检测 在ubuntu 43 ros环境下 xff0c 利用RGBD采集数据给小车 xff0c 实现行人跟随 原作者开源的例子是出现一个窗口 xff0c 用鼠标选择一个区域做kcf跟随 xff0c 选择的物体不受限制 xff0