一、概述
因为课程要求,需要在ros上完成人脸识别,并将识别出来的人脸对应相应的姓名。我们采用python中第三方库face-recognition进行实现。
二、具体实现过程
(一)版本
所使用的系统是ubuntu20.04,ros版本是noetic,在ros上面运行的python解释器是python3.8。程序先经过window系统下进行测试,在window下测试成功后,将其迁移至ubuntu系统下。
face-recognition是别人已经训练好的一个模型,只需要调用其接口就行。
(二)第三方库安装
程序主要使用两个库dlib和face-recognition。在终端中输入如下命令,安装即可。
pip install dlib
pip install face_recognition
需要注意的是,需要首先安装dlib,因为face-recognition需要依赖于dlib,安装顺序出现问题可能会导致之后程序运行出现问题。如果dlib安装不上去,可以考虑使用源码安装,或者进行换源。
可以参考这篇博客,上面也介绍face-recognition的安装和使用。Ros平台下基于face_recognition的人脸检测及识别_ros人脸识别gitee-优快云博客
(三) 测试版本
1.概述
首先编写测试版本,在ros中进行测试,主要是测试是否可以使用face-recogniton。这部分我用于提取图片特征信息的图片数量比较少。少量图片可以达到检测出人脸并对应姓名的效果,效果不太理想,极其容易误检。但能达到测试效果。
2.代码及分析
#!/usr/bin/env python
import rospy
import cv2
import numpy as np
import face_recognition
import os
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
from std_msgs.msg import Header
# 创建图像订阅者
class ImageConverter:
def __init__(self):
self.bridge = CvBridge()
# 训练集文件夹目录
self.train_dir = r"/home/gfc/study_BIT/ros/study/catkin_ws/src/testPublishPhoto/images"
# 准备空的列表来保存人脸编码和对应的人名
# 这个需要提前完成
self.known_face_encodings = []
self.known_face_names = []
# 训练数据
self.trainFunction()
# 计数,用于输出图像
self.num = 0
self.image_raw_sub = rospy.Subscriber('/usb_cam/image_raw', Image, self.subscriberPhotoCallback)
def convert_and_publish(self, img_path):
# 使用OpenCV读取图像
cv_image = cv2.imread(img_path)
# 转换OpenCV图像到ROS图像消息
ros_image = self.bridge.cv2_to_imgmsg(cv_image, "bgr8")
# 创建频率
rate = rospy.Rate(1)
# 发布图像消息
while not rospy.is_shutdown():
self.image_pub.publish(ros_image)
rospy.loginfo("Image converted and published.")
rate.sleep()
# rospy.sp
def subscriberPhotoCallback(self, data):
# 这个函数是用来接受摄像头的数据的
bridge = CvBridge()
image = bridge.imgmsg_to_cv2(data, "bgr8")
face_locations = face_recognition.face_locations(image)
face_encod

最低0.47元/天 解锁文章
2101





