(一)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 对象复制数据

猜你喜欢

转载自blog.csdn.net/qq_45907168/article/details/132912068
今日推荐