(三)ROS2中利用OPENCV读取DS435摄像头视频流数据

在ROS2中利用OPENCV读取D435摄像头视频流

1、首先看自己的ubuntu系统能否识别到设摄像头

1.1、打开终端运行下面命令即可到自己的摄像头驱动
ls /dev/video*

在这里插入图片描述

1.2、可以使用下面的代码来确定那一个为自己所用的D435摄像头
首先安装v4l-utils库
sudo apt install v4l-utils
下面就进行驱动的查看
v4l2-ctl -d  /dev/video0 --all

在这里插入图片描述

边打印了一大堆信息,我们不用管,看重点打印了camera ok:那就说明这个摄像头的确是真的。这里我使用的是双目摄像头,客人要看到video0、video2均是camera ok。
如果把USB摄像头拔了运行
ls /dev/video*

在这里插入图片描述

可见上述方法能正确的在ubuntu20.04下检USB摄像头驱动设备。

2、在ROS2中使用opencv读取D435传出的视频流

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代码读取图片,完成第一个D435摄像头读取实例

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

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

int main(int argc, char ** argv)
{
  (void) argc;
  (void) argv;
  
  //读取视频或摄像头
  VideoCapture cap(2); 

  if (!cap.isOpened()) {
    std::cout<<"无法的开摄像头"<<std::endl;
}
  cv::Mat frame;
  while (cap.read(frame)) {
      // 在这里对每一帧图像进行处理
      
      imshow("Camera", frame);  // 显示图像
      if (cv::waitKey(1) == 27) {   // 按下ESC键退出循环
          break;
      }
  }

  cap.release();
  destroyAllWindows();

  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"
)

5、代码编译和实现

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

6、实现结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45907168/article/details/132921982