本文内容环境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目录下,放置我们的三个功能包。

如何查看ROS2的opencv的位置 ros使用opencv_图像处理

 我们可以在vscode里面打开,在democv01_ws目录下,启动命令code .

此时我们发现有报错

如何查看ROS2的opencv的位置 ros使用opencv_如何查看ROS2的opencv的位置_02

可能是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在这里就是做刚开始的图像驱动和后期的图像显示以及中间的桥接。

如何查看ROS2的opencv的位置 ros使用opencv_图像处理_03

启动我们的人脸识别案例。

~/democv01_ws$ roslaunch robot_vision usb_cam.launch
~/democv01_ws$ roslaunch robot_vision face_detector.launch
rqt_image_view

 此时我们便可以显示我们的人脸进行识别啦!

这里的代码我就不做解释了。