通过ROS和OpenCV实现摄像头人脸检测

通过ROS和OpenCV实现摄像头人脸检测 愚人陆陆 2023-06-06 09:03:09 792

一、实现目标及效果

利用笔记本电脑上的摄像头,通过ROS和OpenCV,利用Haar Cascade进行人脸检测

参考文档:https://docs.opencv.org/4.5.2/db/d28/tutorial\_cascade\_classifier.html

二、实现过程

1、安装usb_cam
  1. sudo apt-get install ros-kinetic-usb-cam
2、创建功能包,把xml文件下载到包里

在这里插入图片描述
xml是分类器文件,在OpenCV官网上可以下载到,我个人git账号上也有https://github.com/Grizi-ju/robot\_vision

3、启动命令
  1. $ roslaunch robot_vision usb_cam.launch
  2. $ roslaunch robot_vision face_detector.launch
  3. $ rqt_image_view

三、代码部分(Python)

1、cv_bridge_test.py
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import rospy
  4. import cv2
  5. from cv_bridge import CvBridge, CvBridgeError
  6. from sensor_msgs.msg import Image
  7. class image_converter:
  8. def __init__(self):
  9. # 创建cv_bridge,声明图像的发布者和订阅者
  10. self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
  11. self.bridge = CvBridge()
  12. self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)
  13. def callback(self,data):
  14. # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
  15. try:
  16. cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
  17. except CvBridgeError as e:
  18. print e
  19. # 在opencv的显示窗口中绘制一个圆,作为标记
  20. (rows,cols,channels) = cv_image.shape
  21. if cols > 60 and rows > 60 :
  22. cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)
  23. # 显示Opencv格式的图像
  24. cv2.imshow("Image window", cv_image)
  25. cv2.waitKey(3)
  26. # 再将opencv格式额数据转换成ros image格式的数据发布
  27. try:
  28. self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
  29. except CvBridgeError as e:
  30. print e
  31. if __name__ == '__main__':
  32. try:
  33. # 初始化ros节点
  34. rospy.init_node("cv_bridge_test")
  35. rospy.loginfo("Starting cv_bridge_test node")
  36. image_converter()
  37. rospy.spin()
  38. except KeyboardInterrupt:
  39. print "Shutting down cv_bridge_test node."
  40. cv2.destroyAllWindows()
2、face_detector.py
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import rospy
  4. import cv2
  5. import numpy as np
  6. from sensor_msgs.msg import Image, RegionOfInterest
  7. from cv_bridge import CvBridge, CvBridgeError
  8. class faceDetector:
  9. def __init__(self):
  10. rospy.on_shutdown(self.cleanup);
  11. # 创建cv_bridge
  12. self.bridge = CvBridge()
  13. self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
  14. # 获取haar特征的级联表的XML文件,文件路径在launch文件中传入
  15. cascade_1 = rospy.get_param("~cascade_1", "")
  16. cascade_2 = rospy.get_param("~cascade_2", "")
  17. # 使用级联表初始化haar特征检测器
  18. self.cascade_1 = cv2.CascadeClassifier(cascade_1)
  19. self.cascade_2 = cv2.CascadeClassifier(cascade_2)
  20. # 设置级联表的参数,优化人脸识别,可以在launch文件中重新配置
  21. self.haar_scaleFactor = rospy.get_param("~haar_scaleFactor", 1.2)
  22. self.haar_minNeighbors = rospy.get_param("~haar_minNeighbors", 2)
  23. self.haar_minSize = rospy.get_param("~haar_minSize", 40)
  24. self.haar_maxSize = rospy.get_param("~haar_maxSize", 60)
  25. self.color = (50, 255, 50)
  26. # 初始化订阅rgb格式图像数据的订阅者,此处图像topic的话题名可以在launch文件中重映射
  27. self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)
  28. def image_callback(self, data):
  29. # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
  30. try:
  31. cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
  32. frame = np.array(cv_image, dtype=np.uint8)
  33. except CvBridgeError, e:
  34. print e
  35. # 创建灰度图像
  36. grey_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  37. # 创建平衡直方图,减少光线影响
  38. grey_image = cv2.equalizeHist(grey_image)
  39. # 尝试检测人脸
  40. faces_result = self.detect_face(grey_image)
  41. # 在opencv的窗口中框出所有人脸区域
  42. if len(faces_result)>0:
  43. for face in faces_result:
  44. x, y, w, h = face
  45. cv2.rectangle(cv_image, (x, y), (x+w, y+h), self.color, 2)
  46. # 将识别后的图像转换成ROS消息并发布
  47. self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
  48. def detect_face(self, input_image):
  49. # 首先匹配正面人脸的模型
  50. if self.cascade_1:
  51. faces = self.cascade_1.detectMultiScale(input_image,
  52. self.haar_scaleFactor,
  53. self.haar_minNeighbors,
  54. cv2.CASCADE_SCALE_IMAGE,
  55. (self.haar_minSize, self.haar_maxSize))
  56. # 如果正面人脸匹配失败,那么就尝试匹配侧面人脸的模型
  57. if len(faces) == 0 and self.cascade_2:
  58. faces = self.cascade_2.detectMultiScale(input_image,
  59. self.haar_scaleFactor,
  60. self.haar_minNeighbors,
  61. cv2.CASCADE_SCALE_IMAGE,
  62. (self.haar_minSize, self.haar_maxSize))
  63. return faces
  64. def cleanup(self):
  65. print "Shutting down vision node."
  66. cv2.destroyAllWindows()
  67. if __name__ == '__main__':
  68. try:
  69. # 初始化ros节点
  70. rospy.init_node("face_detector")
  71. faceDetector()
  72. rospy.loginfo("Face detector is started..")
  73. rospy.loginfo("Please subscribe the ROS image.")
  74. rospy.spin()
  75. except KeyboardInterrupt:
  76. print "Shutting down face detector node."
  77. cv2.destroyAllWindows()

两个launch文件

3、usb_cam.launch
4、face_detector.launch

源码都传到git上了

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
愚人陆陆
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区