本文内容环境Ubuntu20.04。
首先,我们需要安装openCV。
sudo apt-get install ros-noetic-vision-opencv libopencv-dev python3-opencv
然后需要安装我们的三个功能包来启动。
首先创建工作空间在终端运行
~$ mkdir -p democv01_ws/src
~$ cd democv01_ws/
~/democv01_ws$ catkin_make
然后再src目录下,放置我们的三个功能包。
我们可以在vscode里面打开,在democv01_ws目录下,启动命令code .
此时我们发现有报错
可能是Python最新版本标准不一样,我们在报错的地方均加上括号就可以了。
然后要修改一下编译配置,启动ctrl+shift+B选择catkin_make.build修改tasks.json文件
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make:debug", //代表提示的描述性信息
"type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
"command": "catkin_make",//这个是我们需要运行的命令
"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
"group": {"kind":"build","isDefault":true},
"presentation": {
"reveal": "always"//可选always或者silence,代表是否输出信息
},
"problemMatcher": "$msCompile"
}
]
}
然后ctrl+shift+B编译一下。
之后我们在工作空间下运行
~/democv01_ws$ source ./devel/setup.bash
~/democv01_ws$ roslaunch robot_vision usb_cam.launch
切换终端窗口再运行
rosrun robot_vision cv_bridge_test.py
如果报错可能是没有加可执行权限,chmod +x *.py
此时可以出现窗口,还可以运行
rqt_image_view进行查看
之后就可以看到我们的人脸图像了。
我们可以看一下在程序中是如何实现的。打开cv_bridge_test.py
我们需要了解两个函数
imgmsg_to_cv2():将ROS图像消息装换位openCV图像消息。
cv2_to_imsmsg():将openCV图像格式的消息转换成ROS图像消息。
主要内容在我们的上面的发布者和订阅者,
发布者是通过openCV处理后的图像返回给ROS的数据。
订阅者是ROS订阅摄像头驱动起来的最原始的数据,一旦有数据进来后,就会调用我们的回调函数,这是关键。
try:
cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
except CvBridgeError as e:
print (e)
这里我们将ROS中的图像数据转换成OpenCV的图像格式,这里的data是消息,bgr8是消息的编码格式,此时cv_image就拿到了OpenCV的图像,接下来就是用OpenCV进行图像处理了,和ros就无关了。最后我们再将图像数据变回去ROS的图像数据。
# 再将opencv格式额数据转换成ros image格式的数据发布
try:
self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
except CvBridgeError as e:
print (e)
所以我们如果要使用OpenCV,就只需要更改中间的OpenCV的代码即可。ROS在这里就是做刚开始的图像驱动和后期的图像显示以及中间的桥接。
启动我们的人脸识别案例。
~/democv01_ws$ roslaunch robot_vision usb_cam.launch
~/democv01_ws$ roslaunch robot_vision face_detector.launch
rqt_image_view
此时我们便可以显示我们的人脸进行识别啦!
这里的代码我就不做解释了。