• ROS opencv 人脸识别


    人脸识别需要在输入的图像中确定人脸(如果存在)的位置、大小和姿态,往往用于生物特征识别、视频监听、人机交互等应用中。2001年,Viola和Jones提出了基于Haar特征的级联分类器对象检测算法,并在2002年由Lienhart和Maydt进行改进,为快速、可靠的人脸检测应用提
    供了一种有效方法。OpenCV已经集成了该算法的开源实现,利用大量样本的Haar特征进行分类器训练,然后调用训练好的瀑布级联分类器cascade进行模式匹配。

    应用效果

    OpenCV已经集成了人脸识别算法,所以我们不需要重新开发该算法,只需要调用OpenCV相应的接口就可以实现人脸识别的功能。

    下面运行例程看一下人脸识别是一种怎样的效果。
    使用以下命令启动摄像头,然后运行face_detector.launch文件启动人脸识别功能:

    roslaunch robot_vision usb_cam.launch
    
    • 1
    roslaunch robot_vision face_detector.launch
    
    • 1

    在这里插入图片描述

    源码实现

    现在再回头研究这个例程的源码实现方法。该应用的实现代码只有一个文件,即
    robot_vision/script/face_detector.py,主要分成以下三个部分。

    1.初始化部分
    初始化部分主要完成ROS节点、图像、识别参数的设置。

    def __init__(self):
    rospy.on_shutdown(self.cleanup);
    
    • 1
    • 2

    创建cv_bridge

    self.bridge = CvBridge()
    self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
    
    • 1
    • 2

    获取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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.ROS图像回调函数
    例程节点收到摄像头发布的RGB图像数据后进入回调函数,将图像转换成OpenCV的数据
    格式,然后预处理之后开始调用人脸识别的功能函数,最后发布识别结果。
    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"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.人脸识别
    人脸识别部分没有很多代码,直接调用OpenCV提供的人脸识别接口,与数据库中的人脸特
    征进行匹配。

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果正面人脸匹配失败,那么就尝试匹配侧面人脸的模型

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    代码中有一些参数和话题名需要在launch文件中设置,所以还需要编写一个运行例程的
    launch文件robot_vision/launch/face_detector.launch:

    <launch>
    <node pkg="robot_vision" 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    以上我们结合ROS和OpenCV实现了一个人脸识别的机器视觉应用。

  • 相关阅读:
    医院绩效考核系统源码 医院绩效考核系统方案
    关于JVM内存(堆和栈),线程共享和非线程共享。
    uniapp项目中防止用户重复提交
    FFmpeg源代码简单分析-其他-AVClass和AVoption
    STL—next_permutation函数
    nbcio-boot移植到若依ruoyi-nbcio平台里一formdesigner部分(三)
    jstat和jmap打印堆栈排查内存泄漏
    MySQL 学习记录 1
    iOS开发证书发布证书,推送证书,描述文件的生成总集(一)
    cookie、session、tooken
  • 原文地址:https://blog.csdn.net/hai411741962/article/details/133856873