当前位置: 首页 > news >正文

ros2人脸检测

第一步:

首先在工作空间/src下创建数据结构目录service_interfaces

ros2 pkg create service_interfaces --build-type ament_cmake

然后再创建一个srv目录

在里面创建FaceDetect.srv(注意,首字母要大写

sensor_msgs/Image photo
---
uint16 number
float32 use_timeint32[] top
int32[] right
int32[] bottom
int32[] left

CmakeList.txt

cmake_minimum_required(VERSION 3.8)
project(service_interfaces)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
# 添加依赖
find_package(sensor_msgs REQUIRED)  # 确保这个包在这里被找到
# 声明srv文件所属的工程名字, 文件位置, 依赖DEPENDENCIES
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}"srv/FaceDetect.srv"DEPENDENCIES sensor_msgs    )if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# comment the line when a copyright and license is added to all source filesset(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# comment the line when this package is in a git repo and when# a copyright and license is added to all source filesset(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()ament_package()

package.xml

加上依赖

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>service_interfaces</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="root@todo.todo">root</maintainer><license>TODO: License declaration</license><buildtool_depend>ament_cmake</buildtool_depend><depend>sensor_msgs</depend><build_depend>rosidl_default_generators</build_depend><exec_depend>rosidl_default_runtime</exec_depend><member_of_group>rosidl_interface_packages</member_of_group><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

第二步:

要准备好人脸识别的库,不懂的可以看我的另一篇文章《Ubuntu如何使用pip》

要安装好face_recognition的库

pip install face_recognition

安装成功后即可

第三步

在工作空间/src下创建功能包


ros2 pkg create hj_service --build-type ament_cmake --dependencies rclcpp service_interfaces

接着创建face_detect_client.py

在这个代码里面,你需要准备好一张里面有人脸的图片

import rclpy
from rclpy.node import Node
from service_interfaces.srv import FaceDetect
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import cv2
import sysclass FaceDetectClientNode(Node):def __init__(self):super().__init__('face_detect_client_node')self.client = self.create_client(FaceDetect, 'face_detect_service')while not self.client.wait_for_service(timeout_sec=1.0):self.get_logger().info('Service not available, waiting again...')self.bridge = CvBridge()self.cv_image = None  # 初始化cv_image为类属性def send_request(self, image_path):try:# 读取图像文件self.cv_image = cv2.imread(image_path)  # 保存cv_image为类属性if self.cv_image is None:self.get_logger().info('Failed to read image')return# 将OpenCV图像转换为ROS图像消息msg = self.bridge.cv2_to_imgmsg(self.cv_image, encoding="bgr8")# 构建服务请求request = FaceDetect.Request()request.photo = msg# 调用服务self.future = self.client.call_async(request)except CvBridgeError as e:self.get_logger().info('CvBridge Error: {0}'.format(e))def get_response(self):while rclpy.ok():rclpy.spin_once(self)if self.future.done():try:response = self.future.result()except Exception as e:self.get_logger().info('Service call failed %r' % (e,))else:self.get_logger().info('Service response: use_time: %f, number: %d' % (response.use_time, response.number))for i in range(response.number):self.get_logger().info('Face %d: top: %d, right: %d, bottom: %d, left: %d' %(i, response.top[i], response.right[i], response.bottom[i], response.left[i]))# 绘制人脸边框for i in range(response.number):top = response.top[i]right = response.right[i]bottom = response.bottom[i]left = response.left[i]cv2.rectangle(self.cv_image, (left, top), (right, bottom), (0, 255, 0), 2)# 显示图像cv2.imshow('Detected Faces', self.cv_image)cv2.waitKey(0)  # 等待按键cv2.destroyAllWindows()  # 关闭所有窗口breakdef main(args=None):rclpy.init(args=args)node = FaceDetectClientNode()# 替换'image.jpg'为你的图像文件路径node.send_request('/home/phj/Downloads/test.jpeg')node.get_response()node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

face_detect_server.py

import rclpy
from rclpy.node import Node
from service_interfaces.srv import FaceDetect
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import cv2
import face_recognition
import timeclass FaceDetectServerNode(Node):def __init__(self, node_name):super().__init__(node_name)self.service = self.create_service(FaceDetect, 'face_detect_service', self.face_detect_callback)self.bridge = CvBridge()self.get_logger().info('Service created.')def face_detect_callback(self, request, response):if request.photo.data:try:cv_image = self.bridge.imgmsg_to_cv2(request.photo, "bgr8")except CvBridgeError as e:self.get_logger().info('CvBridge Error: %s' % e)returnelse:self.get_logger().info("No image data received")returnstart = time.time()face_locations = face_recognition.face_locations(cv_image, model="hog")response.use_time = time.time() - startresponse.number = len(face_locations)# Initialize lists in the responseresponse.top = []response.right = []response.bottom = []response.left = []for (top, right, bottom, left) in face_locations:response.top.append(top)response.right.append(right)response.bottom.append(bottom)response.left.append(left)return responsedef main(args=None):rclpy.init(args=args)node = FaceDetectServerNode('face_detect_server_node')rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>hj_service</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="root@todo.todo">root</maintainer><license>TODO: License declaration</license><depend>rclpy</depend><depend>service_interfaces</depend><depend>sensor_msgs</depend><test_depend>ament_copyright</test_depend><test_depend>ament_flake8</test_depend><test_depend>ament_pep257</test_depend><test_depend>python3-pytest</test_depend><export><build_type>ament_python</build_type></export>
</package>

setup.py

from setuptools import find_packages, setuppackage_name = 'hj_service'setup(name=package_name,version='0.0.0',packages=find_packages(exclude=['test']),data_files=[('share/ament_index/resource_index/packages',['resource/' + package_name]),('share/' + package_name, ['package.xml']),],install_requires=['setuptools'],zip_safe=True,maintainer='root',maintainer_email='root@todo.todo',description='TODO: Package description',license='TODO: License declaration',tests_require=['pytest'],entry_points={'console_scripts': ['service = hj_service.service_member_function:main','client = hj_service.client_member_function:main','param_sample = hj_service.param:main',"face_detect_server_node = hj_service.face_detect_server:main","face_detect_client_node = hj_service.face_detect_client:main"],},
)

第四步:

打开一个终端

ros2 run hj_service face_detect_server_node

打开另一个终端

ros2 run hj_service face_detect_client_node

成功!

相关文章:

ros2人脸检测

第一步&#xff1a; 首先在工作空间/src下创建数据结构目录service_interfaces ros2 pkg create service_interfaces --build-type ament_cmake 然后再创建一个srv目录 在里面创建FaceDetect.srv&#xff08;注意&#xff0c;首字母要大写&#xff09; sensor_msgs/Image …...

Pillow:强大的Python图像处理库

目录 一、引言 二、Pillow 库的安装 三、Pillow 库的基本概念 四、图像的读取和保存 五、图像的基本属性 六、图像的裁剪、缩放和旋转 七、图像的颜色调整 八、图像的滤镜效果 九、图像的合成和叠加 十、图像的绘制 十一、示例程序&#xff1a;制作图片水印 十二、…...

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…...

为什么类 UNIX 操作系统通常内置编译器?为什么 Windows 更倾向于直接使用二进制文件?

操作系统是否内置编译器&#xff0c;取决于该系统的设计目标、用户群体以及常见的使用场景。以下是内置编译器和直接使用二进制的设计理念和原因的分析&#xff1a; 为什么类 UNIX 操作系统通常内置编译器&#xff1f; 面向开发者的需求&#xff1a; 类 UNIX 系统&#xff08;如…...

吉林大学23级数据结构上机实验(第7周)

A 去火车站 寒假到了&#xff0c;小明准备坐火车回老家&#xff0c;现在他从学校出发去火车站&#xff0c;CC市去火车站有两种方式&#xff1a;轻轨和公交车。小明为了省钱&#xff0c;准备主要以乘坐公交为主。CC市还有一项优惠政策&#xff0c;持学生证可以免费乘坐一站轻轨&…...

实验13 使用预训练resnet18实现CIFAR-10分类

1.数据预处理 首先利用函数transforms.Compose定义了一个预处理函数transform&#xff0c;里面定义了两种操作&#xff0c;一个是将图像转换为Tensor&#xff0c;一个是对图像进行标准化。然后利用函数torchvision.datasets.CIFAR10下载数据集&#xff0c;这个函数有四个常见的…...

【开发文档】资源汇总,持续更新中......

文章目录 AI大模型数据集PytorchPythonUltralyticsOpenCVNetronSklearnCMakeListsNVIDIADocker刷题网站持续更新&#xff0c;欢迎补充 本文汇总了一些常用的开发文档资源&#xff0c;涵盖了常用AI大模型、刷题网站、Python、Pytorch、OpenCV、TensorRT、Docker 等技术栈。通过这…...

【k8s实践】 创建第一个Pod(Nginx)

环境 Rocky Linux9.4 x86_64 VM安装了Microk8s (参考:Microk8s安装方法) 说明: 其他k8s(例如: k3s, kubernetes)创建Pod的方法和Microk8s没啥区别&#xff0c;可以参考本文 目标 创建一个Nginx的Pod&#xff0c;映射宿主机30000端口到Pod容器的80端口&#xff1b;客户端能通…...

盘古大模型实战

0 前言 前一段时间&#xff0c;在学习人工智能的同时&#xff0c;也去了解了一下几乎是作为人工智能在气象上应用的一大里程碑式的研究成果-华为盘古气象大模型。正是盘古大模型的出现&#xff0c;促使天气预报的未来发展方向多了个除天气学方法、统计学方法、数值预报方法之外…...

Python subprocess.run 使用注意事项,避免出现list index out of range

在执行iOS UI 自动化专项测试的时候&#xff0c;在运行第一遍的时候遇到了这样的错误&#xff1a; 2024-12-04 20:22:27 ERROR conftest pytest_runtest_makereport 106 Test test_open_stream.py::TestOpenStream::test_xxx_open_stream[iPhoneX-xxx-1-250] failed with err…...

包管理器npm,cnpm,yarn和pnpm

npm (Node Package Manager) 核心技术与工作原理 依赖解析&#xff1a; 广度优先搜索&#xff08;BFS&#xff09;&#xff1a;npm 使用 BFS 算法来解析依赖树&#xff0c;尽量扁平化 node_modules 目录以减少重复的依赖项。冲突处理&#xff1a;如果两个包需要同一个依赖的不…...

树莓派4B使用opencv读取摄像头配置指南

本文自己记录&#xff0c;给我们lab自己使用&#xff0c;其他朋友们不一定完全适配&#xff0c;请酌情参考。 一. 安装opecnv 我们的树莓派4B默认是armv7l架构&#xff0c;安装的miniconda最新的版本 Miniconda3-latest-Linux-armv7l.sh 仍然是python3.4几乎无法使用&#xff…...

Spring Boot 进阶话题:部署

部署是将应用程序从开发环境移动到可以供用户访问的生产环境的过程。Spring Boot提供了多种部署选项&#xff0c;包括打包为可执行jar文件&#xff0c;使用Docker容器化&#xff0c;以及部署到云平台。 打包Spring Boot应用 Spring Boot应用可以打包为包含所有依赖、类和资源…...

Python 3 和 MongoDB 的集成使用

Python 3 和 MongoDB 的集成使用 MongoDB 是一个流行的 NoSQL 数据库&#xff0c;以其灵活的数据模型和强大的查询功能而闻名。Python 3 作为一种广泛使用的编程语言&#xff0c;与 MongoDB 的集成变得日益重要。本文将介绍如何在 Python 3 环境中集成和使用 MongoDB&#xff…...

perl语言中模式匹配的左右关系

这里简单记录一下&#xff0c;在perl语言中&#xff0c;关于模式匹配的一个细节&#xff1a; 在进行模式匹配的时候&#xff0c;左边写需要查找的字符串&#xff0c;右侧写匹配的关键字&#xff0e; 两边的顺序不一样就会导致匹配结果不一样&#xff0e; 测试代码&#xff1a;…...

【漏洞复现】网动统一通信平台(ActiveUC)接口iactiveEnterMeeting存在信息泄露漏洞

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 @TOC 一、漏洞概述 1.1漏洞简介 漏洞名称:网动统一通信平台(ActiveUC)接口iactiveEnterMeeting存在信息泄露漏洞漏洞编号:无漏洞类型:信息泄露漏洞威胁等级:高危影…...

C++ STL 容器系列(三)list —— 编程世界的万能胶,数据结构中的百变精灵

STL系列学习参考&#xff1a; C STL系列__zwy的博客-CSDN博客https://blog.csdn.net/bite_zwy/category_12838593.html 学习C STL的三个境界&#xff0c;会用&#xff0c;明理&#xff0c;能扩展&#xff0c;STL中的所有容器都遵循这个规律&#xff0c;下面我们就按照这三个境…...

Java经典面试题总结(附答案)2025

点击获取PDF版 10、如何将字符串反转&#xff1f; 添加到StringBuilder中&#xff0c;然后调用reverse()。 11、String 类的常用方法都有那些&#xff1f; equals、length、contains、replace、split、hashcode、indexof、substring、trim、toUpperCase、toLowerCase、isEmpt…...

Stylus 浏览器扩展开发-Cursor AI辅助

项目起源 作为一个经常需要长时间盯着屏幕的开发者&#xff0c;我一直在寻找一个简单的方法来保护眼睛。最初的想法很简单&#xff1a;将网页背景色替换成护眼的豆沙绿。虽然市面上已经有类似的扩展&#xff0c;但我想要一个更加轻量且可定制的解决方案。 这个简单的需求逐渐…...

DAY35|动态规划Part03|LeetCode:01背包问题 二维、01背包问题 一维、416. 分割等和子集

目录 01背包理论基础&#xff08;一&#xff09; 基本思路 C代码 01背包理论基础&#xff08;二&#xff09; 基本思路 C代码 LeetCode:416. 分割等和子集 基本思路 C代码 01背包理论基础&#xff08;一&#xff09; 题目链接&#xff1a;卡码网46. 携带研究材料 文字…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...