ROS2 Humble 开发专栏Ubuntu22.04|基于OpenCV 实现机器视觉人脸检测实验指南

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》

专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏

专栏传送门《产品测评专栏》 《Ai智能体专栏) 《ROS开发专栏

⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录

前言

一、实验原理

二、安装人脸检测依赖环境

三、编写人脸检测节点源码

[四、配置 CMakeLists.txt](#四、配置 CMakeLists.txt)

[五、配置 package.xml](#五、配置 package.xml)

六、编译与仿真完整运行

6.1、编译功能包

6.2、运行实验

总结


前言

前面三期博客我们依次完成了相机图像数据获取颜色特征提取与目标定位视觉目标小球跟随,已经熟练掌握 ROS2 与 OpenCV 结合的基础视觉开发流程。

本期博客我们来实现更贴近实际应用的人脸检测实验。


一、实验原理

Gazebo 仿真环境中已经封装好 face_detector.py 人脸检测节点,该节点会订阅 /face_detector_input 图像话题,自动识别人脸,并将人脸坐标、宽高信息通过 /face_position 话题发布出来。

所以我们在次只需要写一个节点,此节点从相机的话题中获取图片,再转发给face_detector.py节点进行人脸检测、然后从face_detector.py的"/face_position"话题获取人脸坐标结果即可。实现自动框选检测人脸。

二、安装人脸检测依赖环境

首次实验需要安装人脸检测所需依赖,打开终端,输入以下指令:

cpp 复制代码
cd ~/ros2_zice/src/wpr_simulation2/scripts/
./install_dep_face.sh

三、编写人脸检测节点源码

cv_pkg/src 目录下新建 cv_face_detect.cpp,编写人脸图像转发与结果接收代码,全部代码如下所示:

cpp 复制代码
#include <rclcpp/rclcpp.hpp>
#include <sensor_msgs/msg/image.hpp>
#include <sensor_msgs/msg/region_of_interest.hpp>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

// 定义节点句柄
std::shared_ptr<rclcpp::Node> node;
// 缓存相机图像
cv::Mat imgFace;
// 图像发布器,转发给人脸检测节点
rclcpp::Publisher<sensor_msgs::msg::Image>::SharedPtr frame_pub;

// 相机图像回调:接收图像并转发
void CamRGBCallback(const sensor_msgs::msg::Image::SharedPtr msg)
{
    // ROS图像转为OpenCV格式缓存
    cv_bridge::CvImagePtr cv_ptr;
    cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
    imgFace = cv_ptr->image;

    // 转发图像到人脸检测输入话题
    frame_pub->publish(*msg);
}

// 人脸位置回调:接收坐标,绘制矩形框
void FacePosCallback(const sensor_msgs::msg::RegionOfInterest::SharedPtr msg)
{
    // 根据返回的坐标和宽高绘制人脸框
    cv::rectangle(imgFace, 
        cv::Point(msg->x_offset, msg->y_offset), 
        cv::Point(msg->x_offset + msg->width, msg->y_offset + msg->height), 
        cv::Scalar(0, 0, 255), 
        2, 
        cv::LINE_8);
    
    // 实时显示带人脸框的画面
    cv::imshow("Face", imgFace);
    cv::waitKey(1);
}

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    // 创建人脸检测节点
    node = std::make_shared<rclcpp::Node>("cv_face_detect");

    // 订阅相机原始图像话题
    auto rgb_sub = node->create_subscription<sensor_msgs::msg::Image>(
        "/kinect2/qhd/image_raw", 1, CamRGBCallback);

    // 创建图像发布器,转发给人脸检测节点
    frame_pub = node->create_publisher<sensor_msgs::msg::Image>(
        "/face_detector_input", 1);

    // 订阅人脸检测结果坐标话题
    auto face_sub = node->create_subscription<sensor_msgs::msg::RegionOfInterest>(
        "/face_position", 1, FacePosCallback);

    // 创建人脸显示窗口
    cv::namedWindow("Face");

    // 循环监听话题
    rclcpp::spin(node);

    // 释放资源
    cv::destroyAllWindows();
    rclcpp::shutdown();
    return 0;
}

四、配置 CMakeLists.txt

打开 cv_pkg 下的 CMakeLists.txt,追加人脸检测节点编译配置,全部代码如下所示:

cpp 复制代码
cmake_minimum_required(VERSION 3.8)
project(cv_pkg)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# 声明依赖
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(cv_bridge REQUIRED)
find_package(OpenCV REQUIRED)

# 编译 cv_image.cpp,生成可执行节点 cv_image
add_executable(cv_image src/cv_image.cpp)
ament_target_dependencies(cv_image
  rclcpp
  sensor_msgs
  cv_bridge
  OpenCV
)

# 编译颜色识别节点
add_executable(cv_hsv src/cv_hsv.cpp)
ament_target_dependencies(cv_hsv
  rclcpp
  sensor_msgs
  cv_bridge
  OpenCV
)


# 编译目标追踪节点
add_executable(cv_follow src/cv_follow.cpp)
ament_target_dependencies(cv_follow
  rclcpp
  sensor_msgs
  cv_bridge
  OpenCV
  geometry_msgs
)

# 编译人脸检测节点
add_executable(cv_face_detect src/cv_face_detect.cpp)
ament_target_dependencies(cv_face_detect
  rclcpp
  sensor_msgs
  cv_bridge
  OpenCV
)

# 安装可执行文件
install(TARGETS
  cv_face_detect
  DESTINATION lib/${PROJECT_NAME})


# 安装可执行文件
install(TARGETS
  cv_follow
  DESTINATION lib/${PROJECT_NAME})




# 安装可执行文件
install(TARGETS
  cv_hsv
  DESTINATION lib/${PROJECT_NAME}
)

# 安装可执行文件
install(TARGETS
  cv_image
  DESTINATION lib/${PROJECT_NAME}
)

ament_package()

五、配置 package.xml

无需新增依赖,原有依赖已满足,保留即可,全部代码如下所示:

cpp 复制代码
<?xml version="1.0"?>
<package format="3">
  <name>cv_pkg</name>
  <version>0.0.0</version>
  <description>ROS2视觉功能包</description>
  <maintainer email="todo@todo.todo">todo</maintainer>
  <license>Apache-2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>sensor_msgs</depend>
  <depend>cv_bridge</depend>
  <depend>OpenCV</depend>
  <depend>geometry_msgs</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

六、编译与仿真完整运行

6.1、编译功能包

打开终端,输入以下指令:

cpp 复制代码
cd ~/ros2_zice
colcon build --packages-select cv_pkg
source install/setup.bash

6.2、运行实验

1、启动Gazebo仿真

打开终端,输入以下指令:

cpp 复制代码
source install/setup.bash
ros2 launch wpr_simulation2 wpb_face.launch.py

如下图所示:

2、启动人脸检测服务节点

新开终端,输入以下指令:

cpp 复制代码
source install/setup.bash
ros2 run wpr_simulation2 face_detector.py

打印 准备识别人脸 即启动成功,如下图所示:

3、启动自定义人脸检测中转节点

新开终端,输入以下指令:

cpp 复制代码
source install/setup.bash
ros2 run cv_pkg cv_face_detect

自动弹出 Face 显示窗口,如下图所示:

4、键盘控制机器人移动

此时还可以借助wpr_simulation2附带的键盘控制程序让机器人运动起来,通过不同视角去测人脸识别的鲁棒性。再打开一个终端,输入以下指令:

cpp 复制代码
source install/setup.bash
ros2 run wpr_simulation2 keyboard_vel_cmd

A/D 键控制机器人左右移动,从不同角度测试人脸检测效果。


总结

本期博客我们实现了更贴近实际应用的人脸检测实验。

相关推荐
不悔哥20 小时前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
优信电子21 小时前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡1 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
女神下凡1 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
开发笔记-阿牛1 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅1 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员1 天前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程
CHENKONG_CK1 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
祖力551 天前
ARM时钟
嵌入式硬件·arm·时钟·imx6ull
三佛科技-187366133971 天前
128KB~512KB Flash车规级MCU选型指南(FT32A072 / FT32A103 系列)
单片机·嵌入式硬件