技术专栏
通过ROS和OpenCV实现摄像头人脸检测
一、实现目标及效果
利用笔记本电脑上的摄像头,通过ROS和OpenCV,利用Haar Cascade进行人脸检测
参考文档:https://docs.opencv.org/4.5.2/db/d28/tutorial\_cascade\_classifier.html
二、实现过程
1、安装usb_cam
sudo apt-get install ros-kinetic-usb-cam
2、创建功能包,把xml文件下载到包里

xml是分类器文件,在OpenCV官网上可以下载到,我个人git账号上也有https://github.com/Grizi-ju/robot\_vision
3、启动命令
$ roslaunch robot_vision usb_cam.launch$ roslaunch robot_vision face_detector.launch$ rqt_image_view
三、代码部分(Python)
1、cv_bridge_test.py
#!/usr/bin/env python# -*- coding: utf-8 -*-import rospyimport cv2from cv_bridge import CvBridge, CvBridgeErrorfrom sensor_msgs.msg import Imageclass 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.shapeif 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 eif __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()
2、face_detector.py
#!/usr/bin/env python# -*- coding: utf-8 -*-import rospyimport cv2import numpy as npfrom sensor_msgs.msg import Image, RegionOfInterestfrom cv_bridge import CvBridge, CvBridgeErrorclass faceDetector:def __init__(self):rospy.on_shutdown(self.cleanup);# 创建cv_bridgeself.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 = facecv2.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 facesdef 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()
两个launch文件
3、usb_cam.launch
4、face_detector.launch
源码都传到git上了
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
点赞
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据相关专栏
-
浏览量:1802次2024-03-14 17:53:46
-
浏览量:1008次2023-12-14 16:51:13
-
浏览量:2378次2023-04-17 16:03:03
-
浏览量:2416次2024-03-04 14:48:01
-
浏览量:6274次2021-07-09 11:16:51
-
浏览量:3356次2023-06-28 17:22:40
-
浏览量:5520次2021-04-23 14:11:19
-
浏览量:862次2023-12-15 14:28:09
-
浏览量:1731次2023-04-18 09:14:22
-
浏览量:2968次2024-02-20 10:27:52
-
浏览量:3103次2024-05-24 17:53:56
-
浏览量:2001次2022-12-08 17:12:46
-
浏览量:17683次2020-09-28 11:08:13
-
2020-12-14 22:33:31
-
浏览量:3608次2024-03-01 16:01:03
-
浏览量:3902次2023-06-26 08:57:07
-
浏览量:2348次2024-01-11 17:32:51
-
浏览量:1297次2023-12-11 16:56:37
-
浏览量:2573次2020-04-01 10:07:10
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
愚人陆陆
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注

微信扫码分享
QQ好友