(一)ROS2中OPENCV的使用步骤

ROS2中OPENCV的使用步骤

1、首先看自己的ros2是否安装了opencv

打开终端运行,即可得到自己的opencv版本
pkg-config --modversion opencv4

在这里插入图片描述

2、将opencv和ros2集成

2.1、创建工作环境
mkdir -p ~/OPENCV_WS/scr
2.2、创建ros2包的时候,添加opencv依赖项
ros2 pkg create opencv_use --build-type ament_cmake --dependencies rclcpp OpenCV sensor_msgs cv_bridge image_transport --node-name my_opencv

3、编写.cpp代码读取图片,完成第一个opencv实例

#include <cstdio>
#include <opencv2/opencv.hpp>

/*
  通过使用 using namespace cv;
  你可以方便地访问 cv 命名空间中的所有函数、类、变量等,而不必在每个使用之前添加 cv:: 限定符。这可以使代码更加简洁,
*/
using namespace cv;

int main(int argc, char ** argv)
{
  (void) argc;
  (void) argv;

  Mat scr = imread("/home/dzj/桌面/Opencv/图片/Lenna.png");
  imshow("scr", scr);
  waitKey(0);   			// 这句确保窗口一直打开

  printf("hello world opencv_use package\n");
  return 0;
}

4、配置CMakeList.txt

这里在创建包的时候增加了–node-name 因此不需要自己添加依赖项
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(OpenCV REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(cv_bridge REQUIRED)
find_package(image_transport REQUIRED)

add_executable(my_opencv src/my_opencv.cpp)
target_include_directories(my_opencv PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
  
ament_target_dependencies(
  my_opencv
  "rclcpp"
  "OpenCV"
  "sensor_msgs"
  "cv_bridge"
  "image_transport"
)

install(TARGETS 
  my_opencv
  DESTINATION lib/${PROJECT_NAME})

5、代码编译和实现

colcon build
source install/setup.bash 
ros2 run opencv_use my_opencv 

6、实现结果

在这里可以看到运行结果,一个经典的图像处理领域使用的lenna的图片。

在这里插入图片描述

到这里说明你ros2下的opencv库已经可以正常使用了。

##############知识补充################

Mat 类是OpenCV(Open Source Computer Vision Library)中的一个核心类,它用于表示图像和图像处理中的矩阵数据。Mat 类提供了一种灵活的方式来存储和处理图像数据,可以处理各种图像格式和通道数。
存储类型解释
图像数据储存Mat 类用于存储图像的像素数据。它可以存储单通道或多通道的图像数据,支持不同的数据类型(如整数、浮点数等)。
多通道图像Mat 对象可以表示多通道图像,例如彩色图像通常有三个通道:红色、绿色和蓝色。每个通道都可以是一个矩阵。
灵活的构造函数你可以使用不同的构造函数来创建 Mat 对象,包括指定行数、列数、通道数和数据类型等参数。
数据访问你可以通过 Mat 对象来访问和修改图像数据。例如,可以使用 Mat.at<type>(row, col) 来获取特定位置的像素值,其中 type 是数据类型(如 intfloat 等)。
图像操作Mat 类还提供了许多图像处理和操作的方法,例如裁剪、调整大小、滤波、变换等。
内存管理Mat 对象可以自动管理内存,因此你不必担心内存分配和释放。它使用智能指针来跟踪数据,以确保安全的内存管理。
Mat实例化构造函数
实例化形式code
创建Mat空对象cv::Mat emptyMat;
指定大小和数据类型的Mat对象cv::Mat image(height, width, CV_8UC3);
// 创建一个 3 通道的图像,数据类型为 8 位无符号整数
从已有的数据创建Mat对象int data[] = {1, 2, 3, 4, 5, 6};
cv::Mat matrix(2, 3, CV_32SC1, data); // 从数组 data 创建一个 2x3 的单通道整数型矩阵
从文件加载图像cv::Mat image = cv::imread(“image.jpg”); // 从文件加载图像
从其他Mat对象复制数据cv::Mat copyOfImage = image.clone(); // 从现有的 Mat 对象复制数据
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ROS使用OpenCV库实现人脸识别,可以按照以下步骤进行: 1. 安装OpenCV库 在Ubuntu 18.04下,可以使用以下命令安装OpenCV库: ``` sudo apt-get install libopencv-dev ``` 2. 创建ROS使用以下命令创建ROS包: ``` catkin_create_pkg face_recognition roscpp rospy std_msgs sensor_msgs cv_bridge image_transport ``` 3. 创建ROS节点 在ROS创建一个名为`face_recognition_node.cpp`的ROS节点,并在其实现人脸识别算法。 首先,需要包含以下头文件: ```cpp #include <ros/ros.h> #include <sensor_msgs/Image.h> #include <cv_bridge/cv_bridge.h> #include <opencv2/opencv.hpp> ``` 然后,定义ROS节点类,并在类添加订阅器和回调函数,用于接收图像消息和进行人脸识别: ```cpp class FaceRecognitionNode { public: FaceRecognitionNode() { image_sub_ = nh_.subscribe("/camera/rgb/image_raw", 1, &FaceRecognitionNode::imageCallback, this); } void imageCallback(const sensor_msgs::Image::ConstPtr& msg) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception: %s", e.what()); return; } // 人脸识别算法 cv::CascadeClassifier face_cascade; face_cascade.load("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"); std::vector<cv::Rect> faces; cv::Mat gray; cv::cvtColor(cv_ptr->image, gray, cv::COLOR_BGR2GRAY); cv::equalizeHist(gray, gray); face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30)); // 在图像绘制人脸框 for (size_t i = 0; i < faces.size(); i++) { cv::rectangle(cv_ptr->image, faces[i], cv::Scalar(0, 255, 0), 2); } // 发布识别结果 image_pub_.publish(cv_ptr->toImageMsg()); } private: ros::NodeHandle nh_; ros::Subscriber image_sub_; ros::Publisher image_pub_; }; ``` 在回调函数,将ROS图像消息转换为OpenCV图像格式,并使用OpenCV的人脸识别算法`CascadeClassifier`进行人脸检测。检测到人脸后,在图像绘制人脸框,并将识别结果发布为ROS图像消息。 4. 编译ROS节点 使用以下命令编译ROS节点: ``` cd ~/catkin_ws catkin_make ``` 5. 运行ROS节点 在终端运行以下命令启动ROS节点: ``` rosrun face_recognition face_recognition_node ``` 接着,使用以下命令启动相机节点,向ROS节点发送图像消息: ``` roslaunch usb_cam usb_cam-test.launch ``` 最后,可以使用以下命令查看ROS节点发布的人脸识别结果: ``` rosrun image_view image_view image:=/face_recognition/image_raw ``` 这样就可以在ROS实现基于OpenCV的人脸识别功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值