在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、实现结果