转载自古月居
编辑:东岸因为@一点人工一点智能
01 人脸识别
大家在生活中经常会看到在我们进入商城时,门口会有相机在拍摄我们,并且会统计有多少人数进入商店,它是如何进行人数量统计的呢?
这就是是计算机视觉领域的一项关键技术——人脸识别,它使计算机系统能够自动检测、识别和验证图像或视频中的人脸。
人脸识别通过分析图像中的人脸特征来执行各种视觉任务。因为其重要性,所以解决方法很多,如卷积神经网络(CNN)、级联分类器等来提取和比对人脸特征。这些算法能够处理各种光照、姿势和表情条件下的人脸,从而实现高度准确的识别。
图片来源:https://blog.csdn.net/u013117791/article/details/128834780
02 硬件环境
OriginBot 智能机器人
PC:Ubuntu (≥20.04) + ROS2 (≥Foxy)
03 代码
import cv2
import cv_bridge
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
class FaceDetection(Node):
def __init__(self):
super().__init__('face_detection')
self.classifier_path = "haarcascade_frontalface_default.xml"
self.bridge = cv_bridge.CvBridge()
self.face_cascade = cv2.CascadeClassifier(self.classifier_path)
self.image_sub = self.create_subscription(Image, '/image_raw', self.image_callback, 10)
self.pub = self.create_publisher(Image, '/camera/process_image', 10)
def image_callback(self, msg):
image = self.bridge.imgmsg_to_cv2(msg, 'bgr8')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = self.face_cascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=3,
minSize=(20, 20)
)
if len(faces) > 0:
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
self.pub.publish(self.bridge.cv2_to_imgmsg(image, 'bgr8'))
def main(args=None):
rclpy.init(args=args)
face_detection = FaceDetection()
rclpy.spin(face_detection)
face_detection.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
04 代码分析
• Haar Cascade 分类器:Haar Cascade 分类器是一种对象检测器,通过训练来识别特定的对象,这里主要用于人脸检测。
self.classifier_path = “haarcascade_frontalface_default.xml” 指定了已经训练好的人脸分类器的路径。
• ROS2节点初始化:rclpy.init(args=args) 和 rclpy.shutdown() 分别用于初始化和关闭ROS2节点。
• 图像订阅和发布:
self.image_sub = self.create_subscription(Image, ‘/image_raw’, self.image_callback, 10) 用于订阅原始图像。
self.pub = self.create_publisher(Image, ‘/camera/process_image’, 10) 用于发布处理后的图像。
• 图像处理回调函数:image_callback(self, msg) 处理订阅的图像,首先将ROS消息转换为OpenCV图像。
• 将图像转换为灰度图像:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)。
• 使用 Haar Cascade 分类器检测人脸:faces = self.face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(20, 20))。
• 如果检测到人脸,用矩形标记出来:cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)。最后,将处理后的图像发布出去:self.pub.publish(self.bridge.cv2_to_imgmsg(image, ‘bgr8’))。
• ROS2节点主函数:def main(args=None): 主函数初始化节点,并通过 rclpy.spin(face_detection) 进行节点的运行。
05 灰度图像的重要性
使用opencv实现人脸识别已经是一个特别成熟的技术了,这里抛砖引玉希望大家出一个更nice的版本呀!
1)为什么要使用 Haar Cascade 分类器进行人脸检测,Haar Cascade分类器的几个参数是什么含义?
Haar Cascade 分类器是一种经过训练的对象检测器,特别适用于检测面部特征,如人脸和眼睛。它具有高度准确的检测性能,因此广泛用于计算机视觉任务。Haar Cascade 分类器的优势在于它可以在不同尺度和旋转下检测对象,而且速度相对较快。
scaleFactor 参数用于指定每个图像尺度上要缩小图像的比例。这使得分类器能够检测不同尺寸的对象,而不仅仅适用于特定尺寸的对象。通过在不同尺寸上运行分类器,可以检测到远处和近处的对象,使检测更加全面。
minNeighbors 参数用于指定检测到目标后,要保留的邻近目标的最小数量。这有助于去除重叠的检测结果。较大的值会过滤掉一些检测结果,以确保只返回高置信度的检测结果。这有助于减少误报。
2)为什么需要将输入图像转换为灰度图像?
Haar Cascade 分类器通常在灰度图像上运行,因为灰度图像只包含亮度信息,而不包含颜色信息。这简化了图像处理,并使分类器能够更好地识别对象的边缘和纹理特征。此外,灰度图像的计算量更小,因此处理速度更快。
标签:OriginBot,人脸识别,self,cv2,分类器,如何,人脸,图像,image From: https://blog.51cto.com/u_15921966/9370079