我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【ROS】OpenCV+ROS 实现人脸识别(Ubantu16.04)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【ROS】OpenCV+ROS 实现人脸识别(Ubantu16.04)

目录

 

前言

一、环境配置  

1.安装ROS 

2.摄像头调用

3.导入OpenCV

二、创建工作空间和功能包

1.创建工作空间

2.创建功能包

三、人脸识别检测相关代码

1.python文件

2.lanuch文件 

3.CvBridge

四、代码实测

1.执行命令行 

2.人脸识别效果

五、报错解决

六、总结


前言

本文主要学习 ROS机器人操作系统 ,在ROS系统里调用 OpenCV库 实现人脸识别任务

一、环境配置  

1.安装ROS 

sudo apt-get install ros-kinetic-desktop-full

如果ROS还不懂如何安装的,可以看下这一篇:【Linux学习】虚拟机VMware 安装ROS 一条龙教程+部分报错解决_猿力猪的博客-CSDN博客_ros vmwareLinux下载安装ROS,一条龙详解!希望对您有所帮助!https://blog.csdn.net/m0_61745661/article/details/124534353

2.摄像头调用

安装摄像头组件相关的包,命令行如下:

sudo apt-get install ros-kinetic-usb-cam

启动摄像头,命令行如下:

roslaunch usb_cam usb_cam-test.launch

调用摄像头成功,如下图所示:

摄像头的驱动发布的相关数据,如下图所示:

摄像头 usb_cam/image_raw 这个话题,发布的消息的具体类型,如下图所示:

那么图像消息里面的成员变量有哪些呢?

打印一下就知道了!一个消息类型里面的具体成员变量,如下图所示:

  • Header:很多话题消息里面都包含的

        消息头:包含消息序号,时间戳和绑定坐标系

        消息的序号:表示我们这个消息发布是排第几位的,并不需要我们手动去标定,每次

        发布消息的时候会自动地去累加

        绑定坐标系:表示的是我们是针对哪一个坐标系去发布的header有时候也不需要去配置

  • height:图像的纵向分辨率
  • width:图像的横向分辨率
  • encoding:图像的编码格式,包含RGB、YUV等常用格式,都是原始图像的编码格式,不涉及图像压缩编码
  • is_bigendian: 图像数据的大小端存储模式
  • step:一行图像数据的字节数量,作为数据的步长参数
  • data:存储图像数据的数组,大小为step×height个字节
  • format:图像的压缩编码格式(jpeg、png、bmp)

3.导入OpenCV

在ROS当中完成OpenCV的安装,命令行如下图所示:

sudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv

安装完成 

二、创建工作空间和功能包

1.创建工作空间

mkdir -p ~/catkin_ws/class="lazy" data-srccd ~/catkin_ws/class="lazy" data-srccatkin_init_workspace
  • 创建完成工作空间后,在根目录下面,执行编译整个工作空间  
cd ~/catkin_ws/catkin_make
  • 工作空间中会自动生成两个文件夹:develbuild
  • devel文件夹中产生几个setup.*sh形成的环境变量设置脚本,使用source命令运行这些脚本文件,则工作空间中的环境变量得以生效 
source devel/setup.sh
  •  将环境变量设置到/.bashrc文件
gedit ~/.bashrc
  • 在打开的文件,最下面粘贴以下代码即可设置环境变量 
source ~/catkin_ws/devel/setup.bash

2.创建功能包

  •  开始创建
cd ~/catkin_ws/class="lazy" data-srccatkin_create_pkg learning std_msgs rospy roscpp
  • 回到根目录,编译并设置环境变量  
cd ~/catkin_wscatkin_makesource ~/catkin_ws/devel/setup.sh

三、人脸识别检测相关代码

  • 基于 Haar 特征的级联分类器检测算法
  • 核心内容,如下所示:
  • 灰阶色彩转换
  • 缩小摄像头图像
  • 直方图均衡化
  • 检测人脸

1.python文件

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_bridge        self.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 = face                cv2.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 faces    def 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()

2.lanuch文件 

usb_cam.launch

  • 摄像头启动文件
                            

face_detector.launch

  •  人脸识别启动文件
                                haar_scaleFactor: 1.2            haar_minNeighbors: 2            haar_minSize: 40            haar_maxSize: 60                            

3.CvBridge

  • ROS 与 OpenCV 之间的数据连接是通过 CvBridge 来实现的
  • ROS Image Message与 OpenCV Ipllmage 之间连接的一个桥梁 

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.shape        if 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()

四、代码实测

1.执行命令行 

分别在三个终端下运行,命令行如下:

  • 启动摄像头 
roslaunch robot_vision usb_cam.launch
  • 启动人脸识别
roslaunch robot_vision face_detector.launch
  • 打开人脸识别窗口
rqt_image_view

2.人脸识别效果

拿了C站官方送的书来进行测试,识别的效果还是相当不错的,效果如下图所示:

五、报错解决

报错1:E:无法定位软件包 ros-kinetic-usb-cam

解决方法: 网上下载编译安装

$ cd catkin_ws/class="lazy" data-src
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git
$ cd ~/catkin_ws
$ catkin_make

成功解决: 

报错2:启动摄像头报错

解决方法:输入以下命令行,再启动摄像头

source ~/catkin_ws/devel/setup.bash

成功解决: 

报错3:虚拟机摄像头没连接报错

解决方法:打开虚拟机设置,更改usb版本为3.1

可移动设备将摄像头设置连接

六、总结 

  • 在ROS操作系统中调用 OpenCV 完成人脸识别还是比较有意思的,目前图像处理和人脸识别还是比较常用到的,本文主要记录学习过程,以及遇到的相关报错问题进行记录
  • 如何对于特定目标的检测并显示出结果?如何优化让人脸识别的更精准?目前还在朝着这个方向进行思考和探究

参考:
ubuntu16.04下ROS操作系统学习笔记(六 )机器视觉-摄像头标定-ROS+OpenCv-人脸识别-物体跟踪-二维码识别_小小何先生的博客-CSDN博客

ROS+OpenCV 人脸识别,物体识别_JJH的创世纪的博客-CSDN博客_ros图像识别

《ROS机器人开发实践》功能包编译报错问题解决&&摄像头数据opencv_melodic18的博客-CSDN博客

Ubuntu 16.04 安装摄像头驱动usb_cam - 走看看

E: 无法定位软件包 ros-kinetic-usb-cam_>>>111的博客-CSDN博客

以上就是本文的全部内容啦!如果对您有帮助,麻烦点赞啦!收藏啦!欢迎各位评论区留言!!!

来源地址:https://blog.csdn.net/m0_61745661/article/details/125578352

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【ROS】OpenCV+ROS 实现人脸识别(Ubantu16.04)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

OpenCV实现人脸识别

主要有以下步骤: 1、人脸检测 2、人脸预处理 3、从收集的人脸训练机器学习算法 4、人脸识别 5、收尾工作 人脸检测算法: 基于Haar的脸部检测器的基本思想是,对于面部正面大部分区域而言,会有眼睛所在区域应该比前额和脸颊更暗,嘴巴应该比
2022-06-04

Opencv+SVM怎样实现人脸识别

Opencv+SVM怎样实现人脸识别,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言如何使用 OpenCV 进行人脸识别。第一,将首先执行人脸检测,使用深度学习从每个人脸
2023-06-22

java+opencv如何实现人脸识别功能

这篇文章主要介绍了java+opencv如何实现人脸识别功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向
2023-06-15

Java OpenCV实现人脸识别过程详解

人脸识别是计算机视觉中的一个重要应用领域,OpenCV 是一个开源的计算机视觉库,提供了许多用于人脸识别的功能。下面是使用 Java OpenCV 实现人脸识别的详细过程:1. 下载和安装 OpenCV:首先需要从 OpenCV 官网下载并
2023-09-16

Python中基于Opencv怎么实现人脸识别

这篇文章主要讲解了“Python中基于Opencv怎么实现人脸识别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中基于Opencv怎么实现人脸识别”吧!检测人脸。这应该是最基本的
2023-06-02

springboot集成opencv如何实现人脸识别功能

这篇文章主要介绍springboot集成opencv如何实现人脸识别功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言项目中检测人脸图片是否合法的功能,之前用的是百度的人脸识别接口,由于成本高昂不得不寻求替代方案
2023-06-15

python opencv怎么实现人脸识别考勤系统

小编给大家分享一下python opencv怎么实现人脸识别考勤系统,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python可以做什么Python是一种编程语言
2023-06-14

基于opencv和pillow怎么实现人脸识别系统

这篇文章主要讲解了“基于opencv和pillow怎么实现人脸识别系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于opencv和pillow怎么实现人脸识别系统”吧!本文不涉及分类器、
2023-06-21

Java和OpenCV怎么实现图片中的人脸识别

要在Java中实现人脸识别,可以使用OpenCV库。以下是一个基本的示例代码:```javaimport org.opencv.core.Core;import org.opencv.core.Mat;import org.opencv.c
2023-08-18

python+opencv实现的简单人脸识别代码示例

# 源码如下:#!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv def detect_object(image
2022-06-04

基于OpenCV和Gradio怎么实现简单的人脸识别

今天小编给大家分享一下基于OpenCV和Gradio怎么实现简单的人脸识别的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。环境
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录