永年网站建设,深圳市企业网站建设价格,网页制作的平台,凡科网站建设怎么样人脸识别需要在输入的图像中确定人脸#xff08;如果存在#xff09;的位置、大小和姿态#xff0c;往往用于生物特征识别、视频监听、人机交互等应用中。2001年#xff0c;Viola和Jones提出了基于Haar特征的级联分类器对象检测算法#xff0c;并在2002年由Lienhart和Mayd… 人脸识别需要在输入的图像中确定人脸如果存在的位置、大小和姿态往往用于生物特征识别、视频监听、人机交互等应用中。2001年Viola和Jones提出了基于Haar特征的级联分类器对象检测算法并在2002年由Lienhart和Maydt进行改进为快速、可靠的人脸检测应用提 供了一种有效方法。OpenCV已经集成了该算法的开源实现利用大量样本的Haar特征进行分类器训练然后调用训练好的瀑布级联分类器cascade进行模式匹配。 应用效果
OpenCV已经集成了人脸识别算法所以我们不需要重新开发该算法只需要调用OpenCV相应的接口就可以实现人脸识别的功能。
下面运行例程看一下人脸识别是一种怎样的效果。 使用以下命令启动摄像头然后运行face_detector.launch文件启动人脸识别功能
roslaunch robot_vision usb_cam.launchroslaunch robot_vision face_detector.launch源码实现
现在再回头研究这个例程的源码实现方法。该应用的实现代码只有一个文件即 robot_vision/script/face_detector.py主要分成以下三个部分。
1.初始化部分 初始化部分主要完成ROS节点、图像、识别参数的设置。
def __init__(self):
rospy.on_shutdown(self.cleanup);创建cv_bridge
self.bridge CvBridge()
self.image_pub rospy.Publisher(cv_bridge_image, Image, queue_size1)获取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_size1)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, dtypenp.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), (xw, yh), self.color, 2)
# 将识别后的图像转换成ROS消息并进行发布
self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, bgr8))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))如果正面人脸匹配失败那么就尝试匹配侧面人脸的模型
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代码中有一些参数和话题名需要在launch文件中设置所以还需要编写一个运行例程的 launch文件robot_vision/launch/face_detector.launch
launch
node pkgrobot_vision nameface_detector typeface_detector.py outputscreen
remap frominput_rgb_image to/usb_cam/image_raw /
rosparam
haar_scaleFactor: 1.2
haar_minNeighbors: 2
haar_minSize: 40
haar_maxSize: 60
/rosparam
param namecascade_1 value$(find robot_vision)/data/haar_detectors/haarcascade_frontalface_alt.xml /
param namecascade_2 value$(find robot_vision)/data/haar_detectors/haarcascade_profileface.xml /
/node
/launch以上我们结合ROS和OpenCV实现了一个人脸识别的机器视觉应用。