ubuntu16.04下usb相机和kinect1相机
- ROS中的图像数据。
- 摄像头标定。
- ROS+Opencv应用实例(人脸识别、物体跟踪)。
- 二维码识别。5
- 扩展内容:物体识别与机器学习。
- 启动usb相机:需要参照下面命令安装
sudo apt-get install ros-kinetic-usb-cam
安装完成后可以启动相机:
roslaunch usb_cam usb_cam-test.launch
- 启动kinect1相机:需要参照下面命令安装
以下2种方式,任选一种即可,当然全部安装也没有问题
1)使用openni_launch
sudo apt-get install ros-kinetic-openni-camera ros-kinetic-openni-launch
注意:openni2_launch已经不再支持Kinect任何产品。
2) 使用freenect_launch
sudo apt-get install ros-kinetic-freenect-camera ros-kinetic-freenect-stack ros-kinetic-freenect-launch
测试RGB摄像头
1)显示RGB图像
方式一:使用rqt_image_view,运行如下命令后弹出窗口
rosrun rqt_image_view rqt_image_view
彩色图像保存方法是最右测按钮,直接保存即可(在配置kinect成功的界面点击图像也可直接保存,保存的位置不一样)
方式二:使用rviz显示,运行后弹出窗口如下:
rosrun rviz rviz
修改“Fixed Frame”为/camera_rgb_color,接着点击add,选择camera类型。添加成功后选择camera菜单下的Iamge Topic选项,选择/camera/rgb/image_color。
测试深度摄像头
1)显示深度图
方式一:使用rqt_image_view,运行如下命令后弹出窗口
rosrun rqt_image_view rqt_image_view
深度图像保存方法是最右测按钮,直接保存即可
方式二:使用rviz显示,运行后弹出窗口如下:
rosrun rviz rviz
修改“Fixed Frame”为/camera_depth_optical_frame,接着点击add添加PointCloud2类型,修改“topic”,如下图所示
摄像头标定
摄像头这种精密仪器对光学器件的要求较高,由于摄像头内部与外部的一些原因,生成的物体图像往往会发生畸变,为避免数据源造成的误差,需要针对摄像头的参数进行标定。
1.标定usb相机
为了保证我们图像的质量,在采集图像之前,我们需要对摄像头做标定。
安装标定功能包:
sudo apt-get install ros-kinetic-camera-calibration
启动usb摄像头:
roslaunch usb_cam usb_cam-test.launch 或者 roslaunch robot_vision usb_cam.launch
启动成功之后没有摄像头的界面,因为包里面是没有去打开摄像头的:
启动相机标定包:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam
然后我们打开在功能包里面的doc文件,就可以看到这样一个黑白相见的图片,然后我们做旋转和平移等操作,标定好了之后如下图所示:
标定成功之后会显示灰绿色的这个按钮颜色。之后我们再点击这个绿色的按钮,然后图形将该会卡住,在后台做一些计算,运行一会之后就能看到如下效果:
我们接着点击save按钮。之后在终端里面会告诉我们标定的数据存放在哪个路径下面:
上图中摄像头的名称是narrow_stereo,camera_matrix为相机内参矩阵,distortion_model:plumb_bob 为畸变矩阵,
rectification_matrix为矫正模型(一般为单位矩阵),projection_matrix为外部世界坐标到像平面的投影矩阵。
到此,相机标定结束了。
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam
- size:标定棋盘格的内部角点个数,这里使用的棋盘一共有六行,内部8个角点;
- square:这个参数对应每个棋盘的边长,单位是米;
- image和camera:设置摄像头发布的图像话题。
找到刚刚产生的文件,解压后如下图所示:
然后里面有用的文件是 ost.yaml。然后放入我们的功能包,并将其重命名就可以了:
2.标定kinect相机
启动kinect
roslaunch robot_vision freenect.launch 或者roslaunch openni_launch openni.launch
启动彩色摄像头
rosrun camera_calibration cameracalibrator.py image:=/camera/rgb/image_raw camera:=/camera/rgb --size 8x6 --square 0.024
点击calibrate后 会稍微卡下
点击save按钮,参考上面usb标定流程,然后里面有用的文件是 ost.yaml。然后放入我们的功能包,并将其重命名就可以了:
同上,标定红外摄像头:
启动kinect:
1. roslaunch robot_vision freenect.launch 或者roslaunch openni_launch openni.launch
启动红外摄像头:
2.rosrun camera_calibration cameracalibrator.py image:=/camera/ir/image_raw camera:=/camera/ir --size 8x6 --square 0.024
Opencv
Open Source Computer Vision Library
在ROS当中完成Opencv的安装:
ROS与Opencv之间的数据连接是通过CvBridge来实现的。ROS Image Message与OpenCv Ipllmage之间连接的一个桥。
接下来我们测试一下:
roslaunch robot_vision usb_cam.launch
这个命令运行完之后是没有结果输出的,我们之后再启动节点:
rosrun robot_vision cv_bridge_test.py
再打开ROS测试:
第一张图片显示的是opencv的图像,是经过opencv的接口,与ros没有关系。而第二张图片是通过ros当中订阅话题来显示的。首先是在ros当中启动了一个节点,那么发布的消息也是ros消息的这种类型,然后通过bridge转接到了opencv系统,然后在opencv里面完成一些处理,像在左上角画出一个圈,并且把处理的图片通过opencv显示出来,再通过bridge发回到ros系统里面,ros再订阅这个话题就可以了.
在这个类的初始化里面,声明了一个发布者和一个订阅者。订阅者订阅的是usb摄像头发布的话题“”/usb_cam/image_raw“,后面还有一个callback函数。发布者发布的是最终经过opencv处理之后的图像,也就是我们之前在rqt工具里面看到的图像 ”cv_bridge_image“。之后还调用了一下CvBridge。self.bridge = CvBridge()。
订阅者接收到图像之后就调用回调函数callback:
在callback函数里面,我们将从ros中接收到的图片数据转换为opencv能够读取的格式。通过调用CvBridge函数就可以实现上述功能,最终的cv_image就是opencv能够去处理的格式。之后我们使用opencv函数里面的一些函数cv2.circle去绘制圆。然后将其显示出来。之后我们再通过bridge.cv2_to_imgmsg将其转换为ros系统的数据格式,再将其发布出去。
这里的话需要重点去知道两个函数:
imgmsg_to_cv2():将ros图像消息转换成OpenCv图像数据;
cv2_to_imgmsg():将OpenCv格式的图像数据转换成ros图像消息;
人脸检测
基于Haar特征的级联分类器检测算法主要步骤:
- 灰阶色彩转换
- 缩小摄像头图像
- 直方图均衡化
- 检测人脸