ROS+opencv 人脸,眼睛,手掌识别程序解读

2024-01-15 16:30

本文主要是介绍ROS+opencv 人脸,眼睛,手掌识别程序解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算是第一次在CSDN上写博客,之前在windows下有onenote神器,然而在ubuntu下真的没有找到比较好的记笔记方法,所以来到CSDN这个圣殿来记录一下学习的印记。学习ROS已经有一个月的时间了,曲曲折折,之前的经历和经验会找时间补上。
接下来进入正题,ros与opencv的用法。
首先要配置好launch文件,代码如下:

<?xml version="1.0"?>
<launch><node pkg="robot_vision" name="eyes_detector" type="eyes_detector.py" output="screen"><remap from="input_rgb_image" to="/usb_cam/image_raw" /><rosparam>haar_scaleFactor: 1.2haar_minNeighbors: 2haar_minSize: 40haar_maxSize: 60</rosparam><param name="cascade_1" value="$(find robot_vision)/data/haar_detectors/haarcascade_frontalface_alt.xml" /><param name="cascade_2" value="$(find robot_vision)/data/haar_detectors/haarcascade_profileface.xml" /><param name="cascade_3" value="$(find robot_vision)/data/haar_detectors/haarcascade_eye.xml" /><param name="cascade_4" value="$(find robot_vision)/data/haar_detectors/haarcascade_smile.xml" /><param name="cascade_5" value="$(find robot_vision)/data/haar_detectors/haarcascade_hand.xml" /></node>
</launch>

launch文件启动节点就不多讲了,eyes_detecor.py是一会要讲的程序,一会再说 ,rosparam是用来配置ros参数的,其中配置的是haar检测的相关参数,在我上篇转载的文章中有讲述到,下面的五个param是调用事先下载好的haarcascade,这个算法是2001年Viola和Jones提出来的基于Haar特征的级联分类器对象检测算法,想更多了解具体算法的话,自行谷歌。这里面是在github上下载的训练好的cascde,俗话理解就是在这些文件里面已经包含了很多人脸,眼睛的特征,只需要和你的脸进行匹配的算法。
接下来贴上节点代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import cv2
import numpy as np
from sensor_msgs.msg import Image, RegionOfInterest
from 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", "")  #侧脸识别导入cascade_3 = rospy.get_param("~cascade_3", "")  #眼睛识别导入cascade_4 = rospy.get_param("~cascade_4", "")  #微笑识别导入cascade_5 = rospy.get_param("~cascade_5", "")  #手掌识别导入# 使用级联表初始化haar特征检测器self.cascade_1 = cv2.CascadeClassifier(cascade_1)self.cascade_2 = cv2.CascadeClassifier(cascade_2)self.cascade_3 = cv2.CascadeClassifier(cascade_3)self.cascade_4 = cv2.CascadeClassifier(cascade_4)self.cascade_5 = cv2.CascadeClassifier(cascade_5)# 设置级联表的参数,优化人脸识别,可以在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", 10)self.haar_maxSize      = rospy.get_param("~haar_maxSize", 30)self.color_green = (50, 255, 50)self.color_blue = (0, 0, 255)# 初始化订阅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)# 尝试检测眼睛,手 eye_result = self.detect_eye(grey_image)hand_result = self.detect_hand(grey_image)#框出眼睛if len(eye_result)>0:for eye in eye_result:ex,ey,ew,eh =eyecv2.rectangle(cv_image, (ex, ey), (ex+ew, ey+eh), self.color_green, 2)#框出手掌if len(hand_result)>0:for hand in hand_result:hx,hy,hw,hh =handcv2.rectangle(cv_image, (hx, hy), (hx+hw, hy+hh), self.color_blue, 2)# 将识别后的图像转换成ROS消息并发布self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))#检测配置def detect_eye(self, input_image):eye = self.cascade_3.detectMultiScale(input_image, self.haar_scaleFactor, self.haar_minNeighbors, cv2.CASCADE_SCALE_IMAGE, (self.haar_minSize, self.haar_maxSize))return eyedef detect_hand(self, input_image):hand = self.cascade_5.detectMultiScale(input_image, self.haar_scaleFactor, self.haar_minNeighbors, cv2.CASCADE_SCALE_IMAGE, (self.haar_minSize, self.haar_maxSize))return handdef 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()

python相关的知识就不细说了,要是没学过python的小伙伴可以花几个小时看看语法,很快就会入门了。在py程序当中,需要获取haar特征的级联表的XML文件,文件路径在launch 文件中传入,然后使用级联表初始化haar特征检测器;
在回调函数中,首先利用cvbridge(ros和opencv的接口)将usb摄像头发布的图像转换成opencv图像,从而在opencv中进行处理;获取opencv图像后先进行灰度化转换,并进行边缘处理和噪声过滤,创建平衡直方图;然后进行眼睛人脸等检测,在检测配置中将事先设置好的参数进行调入;然后利用检测到的边缘,打印方框,框在检测到的眼睛和人脸上;最后再次利用cvbridge,将opencv图像转换成ros图像,最后可以通过rqt来查看效果。
最后划一下重点:

  • 下载好haarcascade_xxxx.xml文件,放到工作空间的你知道的位置,下载地址给出:https://github.com/opencv/opencv/tree/master/data/haarcascades,这个里面没有haarcascsde_hand,下载网址:https://github.com/JongJuJu/webcam-hand-detect/blob/master/haarcascade_hand.xml
  • launch文件和程序节点中都要导入haarcascade文件
  • 通过cvbridge进行ros图像和opencv图像之间的转换
  • 配置参数可以优化检测效果,参数讲解在上篇文章
  • 我给出的程序是检测眼睛和手掌的,其实其他的都一样,只要加载要检测的haarcascade.xml文件就可以检测了
    附上效果图片:

人脸识别
眼睛识别
手掌识别
眼睛手掌同时识别(眼睛小还带眼镜,只好大一点睁着)

第一次写,可能缩进相关的不好看,也没太组织好语言,之后会继续学习,继续完善。

怕什么真理无穷,进一步有进一步的喜悦。

这篇关于ROS+opencv 人脸,眼睛,手掌识别程序解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/609512

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。