linux学习opencv+ros实现人脸识别(ubantu16.04)(代码片段)

猿力猪 猿力猪     2022-10-21     607

关键词:

目录

前言

一、环境配置  

1.安装ROS 

2.摄像头调用

3.导入OpenCV

二、创建工作空间和功能包

1.创建工作空间

2.创建功能包

三、人脸识别检测相关代码

1.python文件

2.lanuch文件 

3.CvBridge

四、代码实测

1.执行命令行 

2.人脸识别效果

五、报错解决

六、总结


前言

本文主要学习 ROS机器人操作系统 ,在ROS系统里调用 OpenCV库 实现人脸识别任务

一、环境配置  

1.安装ROS 

sudo apt-get install ros-kinetic-desktop-full

如果ROS还不懂如何安装的,可以看下这一篇:【Linux学习】虚拟机VMware 安装ROS 一条龙教程+部分报错解决_猿力猪的博客-CSDN博客_ros vmwareLinux下载安装ROS,一条龙详解!希望对您有所帮助!https://blog.csdn.net/m0_61745661/article/details/124534353

2.摄像头调用

安装摄像头组件相关的包,命令行如下:

sudo apt-get install ros-kinetic-usb-cam

启动摄像头,命令行如下:

roslaunch usb_cam usb_cam-test.launch

调用摄像头成功,如下图所示:

摄像头的驱动发布的相关数据,如下图所示:

摄像头 usb_cam/image_raw 这个话题,发布的消息的具体类型,如下图所示:

那么图像消息里面的成员变量有哪些呢?

打印一下就知道了!一个消息类型里面的具体成员变量,如下图所示:

  • Header:很多话题消息里面都包含的

        消息头:包含消息序号,时间戳和绑定坐标系

        消息的序号:表示我们这个消息发布是排第几位的,并不需要我们手动去标定,每次

        发布消息的时候会自动地去累加

        绑定坐标系:表示的是我们是针对哪一个坐标系去发布的header有时候也不需要去配置

  • height:图像的纵向分辨率
  • width:图像的横向分辨率
  • encoding:图像的编码格式,包含RGB、YUV等常用格式,都是原始图像的编码格式,不涉及图像压缩编码
  • is_bigendian: 图像数据的大小端存储模式
  • step:一行图像数据的字节数量,作为数据的步长参数
  • data:存储图像数据的数组,大小为step×height个字节
  • format:图像的压缩编码格式(jpeg、png、bmp)

3.导入OpenCV

在ROS当中完成OpenCV的安装,命令行如下图所示:

sudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv

安装完成 

二、创建工作空间和功能包

1.创建工作空间

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
  • 创建完成工作空间后,在根目录下面,执行编译整个工作空间  
cd ~/catkin_ws/
catkin_make
  • 工作空间中会自动生成两个文件夹:develbuild
  • devel文件夹中产生几个setup.*sh形成的环境变量设置脚本,使用source命令运行这些脚本文件,则工作空间中的环境变量得以生效 
source devel/setup.sh
  •  将环境变量设置到/.bashrc文件
gedit ~/.bashrc
  • 在打开的文件,最下面粘贴以下代码即可设置环境变量 
source ~/catkin_ws/devel/setup.bash

2.创建功能包

  •  开始创建
cd ~/catkin_ws/src
catkin_create_pkg learning std_msgs rospy roscpp
  • 回到根目录,编译并设置环境变量  
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.sh

三、人脸识别检测相关代码

  • 基于 Haar 特征的级联分类器检测算法
  • 核心内容,如下所示:
  • 灰阶色彩转换
  • 缩小摄像头图像
  • 直方图均衡化
  • 检测人脸

1.python文件

face_detector.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import cv2
import numpy as np
from sensor_msgs.msg import Image, RegionOfInterest
from cv_bridge import CvBridge, CvBridgeError

class faceDetector:
    def __init__(self):
        rospy.on_shutdown(self.cleanup);

        # 创建cv_bridge
        self.bridge = CvBridge()
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)

        # 获取haar特征的级联表的XML文件,文件路径在launch文件中传入
        cascade_1 = rospy.get_param("~cascade_1", "")
        cascade_2 = rospy.get_param("~cascade_2", "")

        # 使用级联表初始化haar特征检测器
        self.cascade_1 = cv2.CascadeClassifier(cascade_1)
        self.cascade_2 = cv2.CascadeClassifier(cascade_2)

        # 设置级联表的参数,优化人脸识别,可以在launch文件中重新配置
        self.haar_scaleFactor  = rospy.get_param("~haar_scaleFactor", 1.2)
        self.haar_minNeighbors = rospy.get_param("~haar_minNeighbors", 2)
        self.haar_minSize      = rospy.get_param("~haar_minSize", 40)
        self.haar_maxSize      = rospy.get_param("~haar_maxSize", 60)
        self.color = (50, 255, 50)

        # 初始化订阅rgb格式图像数据的订阅者,此处图像topic的话题名可以在launch文件中重映射
        self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)

    def image_callback(self, data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")     
            frame = np.array(cv_image, dtype=np.uint8)
        except CvBridgeError, e:
            print e

        # 创建灰度图像
        grey_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 创建平衡直方图,减少光线影响
        grey_image = cv2.equalizeHist(grey_image)

        # 尝试检测人脸
        faces_result = self.detect_face(grey_image)

        # 在opencv的窗口中框出所有人脸区域
        if len(faces_result)>0:
            for face in faces_result: 
                x, y, w, h = face
                cv2.rectangle(cv_image, (x, y), (x+w, y+h), self.color, 2)

        # 将识别后的图像转换成ROS消息并发布
        self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))

    def detect_face(self, input_image):
        # 首先匹配正面人脸的模型
        if self.cascade_1:
            faces = self.cascade_1.detectMultiScale(input_image, 
                    self.haar_scaleFactor, 
                    self.haar_minNeighbors, 
                    cv2.CASCADE_SCALE_IMAGE, 
                    (self.haar_minSize, self.haar_maxSize))
                                         
        # 如果正面人脸匹配失败,那么就尝试匹配侧面人脸的模型
        if len(faces) == 0 and self.cascade_2:
            faces = self.cascade_2.detectMultiScale(input_image, 
                    self.haar_scaleFactor, 
                    self.haar_minNeighbors, 
                    cv2.CASCADE_SCALE_IMAGE, 
                    (self.haar_minSize, self.haar_maxSize))
        
        return faces

    def cleanup(self):
        print "Shutting down vision node."
        cv2.destroyAllWindows()

if __name__ == '__main__':
    try:
        # 初始化ros节点
        rospy.init_node("face_detector")
        faceDetector()
        rospy.loginfo("Face detector is started..")
        rospy.loginfo("Please subscribe the ROS image.")
        rospy.spin()
    except KeyboardInterrupt:
        print "Shutting down face detector node."
        cv2.destroyAllWindows()

2.lanuch文件 

usb_cam.launch

  • 摄像头启动文件
<launch>

  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>

</launch>

face_detector.launch

  •  人脸识别启动文件
<launch>
    <node pkg="test2" name="face_detector" type="face_detector.py" output="screen">
        <remap from="input_rgb_image" to="/usb_cam/image_raw" />
        <rosparam>
            haar_scaleFactor: 1.2
            haar_minNeighbors: 2
            haar_minSize: 40
            haar_maxSize: 60
        </rosparam>
        <param name="cascade_1" value="$(find robot_vision)/data/haar_detectors/haarcascade_frontalface_alt.xml" />
        <param name="cascade_2" value="$(find robot_vision)/data/haar_detectors/haarcascade_profileface.xml" />
    </node>
</launch>

3.CvBridge

  • ROS 与 OpenCV 之间的数据连接是通过 CvBridge 来实现的
  • ROS Image Message与 OpenCV Ipllmage 之间连接的一个桥梁 

cv_bridge_test.py 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image

class image_converter:
    def __init__(self):    
        # 创建cv_bridge,声明图像的发布者和订阅者
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)

    def callback(self,data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print e

        # 在opencv的显示窗口中绘制一个圆,作为标记
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)

        # 显示Opencv格式的图像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)

        # 再将opencv格式额数据转换成ros image格式的数据发布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print e

if __name__ == '__main__':
    try:
        # 初始化ros节点
        rospy.init_node("cv_bridge_test")
        rospy.loginfo("Starting cv_bridge_test node")
        image_converter()
        rospy.spin()
    except KeyboardInterrupt:
        print "Shutting down cv_bridge_test node."
        cv2.destroyAllWindows()

四、代码实测

1.执行命令行 

分别在三个终端下运行,命令行如下:

  • 启动摄像头 
roslaunch robot_vision usb_cam.launch
  • 启动人脸识别
roslaunch robot_vision face_detector.launch
  • 打开人脸识别窗口
rqt_image_view

2.人脸识别效果

拿了C站官方送的书来进行测试,识别的效果还是相当不错的,效果如下图所示:

五、报错解决

报错1:E:无法定位软件包 ros-kinetic-usb-cam

解决方法: 网上下载编译安装

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

成功解决: 

报错2:启动摄像头报错

解决方法:输入以下命令行,再启动摄像头

source ~/catkin_ws/devel/setup.bash

成功解决: 

报错3:虚拟机摄像头没连接报错

解决方法:打开虚拟机设置,更改usb版本为3.1

可移动设备将摄像头设置连接

六、总结 

  • 在ROS操作系统中调用 OpenCV 完成人脸识别还是比较有意思的,目前图像处理和人脸识别还是比较常用到的,本文主要记录学习过程,以及遇到的相关报错问题进行记录
  • 如何对于特定目标的检测并显示出结果?如何优化让人脸识别的更精准?目前还在朝着这个方向进行思考和探究

参考:
ubuntu16.04下ROS操作系统学习笔记(六 )机器视觉-摄像头标定-ROS+OpenCv-人脸识别-物体跟踪-二维码识别_小小何先生的博客-CSDN博客

ROS+OpenCV 人脸识别,物体识别_JJH的创世纪的博客-CSDN博客_ros图像识别

《ROS机器人开发实践》功能包编译报错问题解决&&摄像头数据opencv_melodic18的博客-CSDN博客

Ubuntu 16.04 安装摄像头驱动usb_cam - 走看看

E: 无法定位软件包 ros-kinetic-usb-cam_>>>111的博客-CSDN博客

以上就是本文的全部内容啦!如果对您有帮助,麻烦点赞啦!收藏啦!欢迎各位评论区留言!!!

高性能云服务器 精品线路独享带宽,毫秒延迟,年中盛惠 1 折起

ros2之opencv人脸识别foxy~galactic~humble(代码片段)

...xff1a;ROS2+Gazebo11+Car+OpenCV巡线识别和速度转向控制学习那么如何实现如下的人脸识别效果呢? 蒙娜丽莎的微笑,永远那么神秘……  遇到的问题如:[INFO][1655036597.738995500][face_detection]:ReceivingimageTraceback(mostrecen... 查看详情

树莓派---基于opencv实现人脸识别

目录你可以去调百度人脸识别的API,我这里是基于OpenCV进行人脸识别OpenCV(OpensourceComputerVisionLibrary)是一个开源的计算机视觉库,支持与计算机视觉和机器学习相关的众多算法,用C++编写1.安装OpenCV  查看详情

使用 LBP、深度学习和 OpenCV 进行实时人脸识别

】使用LBP、深度学习和OpenCV进行实时人脸识别【英文标题】:RealTimeFaceRecognitionwithLBP,DeepLearningandOpenCV【发布时间】:2021-08-0509:08:10【问题描述】:我是计算机视觉方面的新手。我正在尝试使用基于深度学习dnn模块的人脸检测部... 查看详情

dlib+opencv深度学习人脸识别

目录(?)[+]DlibOpenCV深度学习人脸识别前言人脸数据库导入人脸检测人脸识别异常处理  Dlib+OpenCV深度学习人脸识别   前言人脸识别在LWF(LabeledFacesintheWild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非... 查看详情

python+opencv人脸识别身份认证系统设计:专栏总述

...识别,均有详细的操作步骤和注释代码,能帮助学习者从零开始实现一个应用级别的人脸识别引擎。专栏分为4部分:人脸识别原理、人脸数据采集和存储、训练人脸识别模型和实现人脸识别。Python+OpenCV实现AI人脸... 查看详情

人脸识别实战:使用opencv+svm实现人脸识别(代码片段)

在本文中,您将学习如何使用OpenCV进行人脸识别。文章分三部分介绍:第一,将首先执行人脸检测,使用深度学习从每个人脸中提取人脸量化为128位的向量。第二,在嵌入基础上使用支持向量机(SVM)... 查看详情

ros-opencv-人脸识别-物体追踪-二维码识别(代码片段)

前言:人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做... 查看详情

opencv-python也能实现人脸检测了(代码片段)

opencv中也可以实现深度学习中的人脸识别算法了。是怎么一回事呢?就是opencv中的DNN库,更新了好多深度学习的模块或者说是库函数,这样就让我们摆脱了安装庞大繁琐的深度学习框架。我们只需下载相应的权重文件... 查看详情

opencv学习之路(41)人脸识别

一、人脸检测并采集个人图像//take_photo.cpp#include<opencv2/opencv.hpp>usingnamespacecv;usingnamespacestd;voidtake_photo(){VideoCapturecap(0);//打开摄像头if(!cap.isOpened())return;//加载级联检测器CascadeClassifiercascade 查看详情

人脸识别《一》opencv人脸识别之收集人脸并学习

   收集人脸就是把刚完成预处理的人脸放入到预处理人脸数组中,同时往数组中放入一个标签(明确这张人脸所属的人)。例如,你可以使用第一个人的10张预处理人脸,10张第二个人的预处理的人脸,... 查看详情

人脸识别基于dlib库实现人脸特征值提取(代码片段)

...考一、Dlib库介绍与安装1.Dlib库简介  Dlib库是一个机器学习的开源库,包含了机器学习的很多算法,使用起来很方便,直接包含头文件即可,并且不依赖 查看详情

基于opencv的人脸识别

...别 一点背景知识OpenCV是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV已被广泛运用在各种项目上,从谷歌街景的图片拼... 查看详情

基于opencv的人脸识别

...别 一点背景知识OpenCV是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV已被广泛运用在各种项目上,从谷歌街景的图片拼... 查看详情

基于opencv实现人脸识别案例(代码片段)

一、基础我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。我们需要从其中提取特征。下图中的Haar特征会被使用,就像我... 查看详情

opencv人脸识别

 背景知识OpenCV是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV已被广泛运用在各种项目上,从谷歌街景的图片拼接,到... 查看详情

opencv灰度图二分类(人脸识别非hog)sklearn机器学习(代码片段)

...手写数字识别的demo程序,模型没有评估,如需要学习可以看我的机器学习与深度学习博客专栏里的内容。代码实现样本采取与检测(直接复制不能Run、需要自己修改,仅供参考)代码多 查看详情

python-opencv实现人脸识别功能(代码片段)

使用python-opencv实现人脸识别功能。思路如下:1.使用opencv库打开摄像头。2.加载opencv中自带的人脸特征识别分类器3.输出结果代码如下:importcv2importmatplotlib.pyplotasplt#1.读取笔记本相机cap=cv2.VideoCapture(0)#2.在每一帧数据中进行人脸... 查看详情

《ros理论与实践》学习笔记机器视觉处理(代码片段)

《ROS理论与实践》学习笔记(六)机器视觉处理课程内容1.ROS摄像头驱动及数据接口2.摄像头参数标定3.ROS+OpenCV图像处理方法及案例4.ROS+Tensorflow物体识别方法及案例本讲作业1.通过人脸识别方式,发布速度控制指... 查看详情