ROS2+OpenCV综合应用--11. AprilTag标签码跟随

1. 简介

        apriltag标签码追踪是在apriltag标签码识别的基础上,增加了小车车体运动的功能,控制车体从而使摄像头会保持标签码在视觉中间左右运动,在根据物体在摄像头成像近大远小的原理根据这一特性,从而实现标签码跟随功能。

2. 启动

2.1 程序启动前的准备

        本次apriltag标签码使用的是TAG36H11格式,出厂已配套相关标签码,并贴在积木块上,需要将积木块拿出来放置到摄像头画面识别。

2.2 程序说明

        程序启动后,摄像头捕获到图像,将标签码放入摄像头画面,系统会识别并框出标签码的四个顶点,并显示标签码的ID号。然后缓慢移动积木块的位置,小车会跟着积木块前后移动、左旋右旋。

注意:积木块移动时,标签码要对着摄像头,并且移动速度不可以太快,避免摄像头云台跟不上。

2.3 程序启动

打开一个终端输入以下指令进入docker,

./docker_ros2.sh

出现以下界面就是进入docker成功

使用ROS2OpenCV实现人脸识别可按以下步骤进行: ### 环境准备 安装OpenCV以及ROS2相关功能包。在ROS2中,安装OpenCV相关依赖可以使用如下命令(以Ubuntu系统为例),不过原引用未提及ROS2下安装OpenCV命令,可参考通用方法: ```bash sudo apt-get install libopencv-dev python3-opencv ``` 同时,创建ROS2功能包,可使用如下命令: ```bash ros2 pkg create chapt4_interfaces --dependencies rosidl_default_generators sensor_msgs --license Apache-2.0 ``` 此命令创建了一个名为`chapt4_interfaces`的功能包,依赖于`rosidl_default_generators`和`sensor_msgs`,并使用Apache - 2.0许可证 [^2]。 ### 配置CMakeLists.txt 在创建的功能包中配置`CMakeLists.txt`文件,虽然原引用是ROS的配置示例,但ROS2有类似的配置思路。在ROS2中,需要找到并链接OpenCV库。以下是一个简化的示例: ```cmake cmake_minimum_required(VERSION 3.8) project(ros2_opencv_face_detection) 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) add_executable(face_detection_node src/face_detection_node.cpp) ament_target_dependencies(face_detection_node rclcpp sensor_msgs cv_bridge OpenCV) install(TARGETS face_detection_node DESTINATION lib/${PROJECT_NAME} ) ament_package() ``` ### 编写人脸识别代 在`src`目录下创建`face_detection_node.cpp`文件,以下是一个简单的示例代: ```cpp #include <rclcpp/rclcpp.hpp> #include <sensor_msgs/msg/image.hpp> #include <cv_bridge/cv_bridge.h> #include <opencv2/opencv.hpp> class FaceDetectionNode : public rclcpp::Node { public: FaceDetectionNode() : Node("face_detection_node") { subscription_ = this->create_subscription<sensor_msgs::msg::Image>( "image_topic", 10, std::bind(&FaceDetectionNode::imageCallback, this, std::placeholders::_1)); cascade_.load("/path/to/haarcascade_frontalface_default.xml"); } private: void imageCallback(const sensor_msgs::msg::Image::SharedPtr msg) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { RCLCPP_ERROR(this->get_logger(), "cv_bridge exception: %s", e.what()); return; } std::vector<cv::Rect> faces; cv::Mat gray; cv::cvtColor(cv_ptr->image, gray, cv::COLOR_BGR2GRAY); cascade_.detectMultiScale(gray, faces, 1.1, 3, 0, cv::Size(30, 30)); for (size_t i = 0; i < faces.size(); i++) { cv::rectangle(cv_ptr->image, faces[i], cv::Scalar(255, 0, 0), 2); } cv::imshow("Face Detection", cv_ptr->image); cv::waitKey(3); } rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr subscription_; cv::CascadeClassifier cascade_; }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); auto node = std::make_shared<FaceDetectionNode>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; } ``` 此代订阅一个图像话题`image_topic`,将接收到的图像转换为OpenCV格式,使用Haar级联分类器进行人脸识别,并在检测到的人脸周围绘制矩形框,最后显示图像。 ### 训练分类器(可选) 人脸识别的目的是在输入图像中确定人脸的位置、大小、姿态。利用大量样本的Haar特征进行分类器训练,然后调用训练好的瀑布型级联分类器`cascade`进行模式匹配,进而获取二维包围框。不过通常可以使用OpenCV自带的预训练分类器,如`haarcascade_frontalface_default.xml` [^1]。 ### 运行程序 编译功能包: ```bash colcon build --packages-select ros2_opencv_face_detection ``` 运行节点: ```bash ros2 run ros2_opencv_face_detection face_detection_node ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值