Ros中使用find_object_2d快速实现物体的检测识别

运行环境:

Ubuntu16.04

ros-kinetic版本

准备工作:

需要r提前安装的webcam的驱动,这里推荐使用两种usb_cam和uvc_camera

(1)usb_cam的安装:清楚明了的usb_cam安装及使用

cd catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam.git  
cd ..  
catkin_make 

(2)uvc_camera的安装:usv_camera安装-主要看链接中-安装摄像头驱动

cd ~/catkin_ws/src
git clone https://github.com/ktossell/camera_umd
cd ~/catkin_ws
catkin_make
source devel/setup.bash

两种驱动都可以使用,也会说明两种驱动的运行方式,推荐uvc_camera,其节点可以单独运行,不一定只运行launch文件

具体步骤:

1.安装find_object_2d包

先安装依赖:

sudo apt-get install ros-kinetic-find-object-2d

然后定位到工作空间编译源码包:

cd ~/catkin_ws
git clone https://github.com/introlab/find-object src/find_object_2d
catkin_make

意思是将github里面的那个源码复制到src中自动创建的find_object_2d文件夹中。然后编译。

注意:我再编译的时候出现过问题,因为ros自带的opencv版本是3.3.1,而我系统中装的opencv版本是3.4.4,因此报错:

/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1:对‘TIFFSetErrorHandler@LIBTIFF_4.0’未定义的引用
collect2: error: ld returned 1 exit status
CMakeFiles/viso2.dir/build.make:262: recipe for target 'viso2' failed
make[2]: *** [viso2] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/viso2.dir/all' failed
make[1]: *** [CMakeFiles/viso2.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

解决方法:修改find_object_2d中CmakeList.txt文件中opencv依赖的版本,在find_object_2d包内的CmakeList.txt文件中,将FIND_PACKAGE(OpenCV  REQUIRED)强加上指定版本FIND_PACKAGE(OpenCV 3.3.1 REQUIRED)

然后编译正常就接着下面的工作:

2、运行find_object_2d节点检测网络摄像头图像中的物体

1、启动roscore:

roscore

2、启动摄像头节点:

(1)安装的usb-cam,新开终端输入:

roslaunch usb_cam usb_cam-test.launch

然后会弹出摄像头视频信息,如果是电脑的摄像头,就将usb_cam-test.launch文件中的device的video0改为video1,就读取外接摄像头的图像了。

然后查看话题:

rostopic list

摄像头图像话题就是/usb_cam/image_raw。

(2)安装的uvc_camera,终端输入:

rosrun uvc_camera uvc_camera_node device:=/dev/video1

此时并不会像usb_cam显示图像,只会显示一些节点启动的信息,然后就进入等待状态,同样的,再开一个终端查看话题:

rostopic list

该驱动下的图像话题名为:/image_raw

3、启动物体检测节点:

rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw  //usb_cam使用
rosrun find_object_2d find_object_2d image:=/image_raw   //uvc_camera使用

haar角点就能显现出来。

4、在此基础上实现检测物体

对准fin_object界面左侧 Objects下面的空白界面,单击鼠标右键->Add objects form scene ,就会显示出:

然后选择你准备识别的物体,按下Take picture

最好让物体的背景和周围很平滑,不然会出现很多检测点。

拍下照片后,用鼠标框处目标区域,越精确越好,我这里并不严谨,点击->next:

然后就会显示检测的特征点数,然后点击->end

OK,此处已经成功添加了一个待检测物体-杯子,然后用摄像头去拍摄时就会框出待检测物体:

还可以接续确定物体的位置,新开终端输入:

rosrun find_object_2d print_objects_detected

终端可以看到返回的位置信息

还可以通过回显话题名 /objects 来获取检测物体的完整信息:

rostopic echo /objects

其中213.0和401.0是检测物体宽和高,后面的九个数字是一个3*3的单应性矩阵。这个矩阵可以根据下图的公式找到目标的当前位置和方向。

到此基本物体检测和识别就结束了

猜你喜欢

转载自blog.csdn.net/zbr794866300/article/details/100538794