记录自己基于ubuntu20.04与ROS Noetic进行视频读取。
第一步——插拔USB采集卡,查看摄像头接口
先不插采集卡,打开终端,输入命令:
ls /dev/video*
得到如下所示:
插上采集卡后,再次执行上一个命令,得到如下所示:
我的多出来的是/dev/video2,根据自己情况来,记住这个接口号。
第二步——安装USB_CAM
先下载该包并进行编译:
cd catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam.git
cd ..
catkin_make
也可以直接使用如下命令(注意使用时要去ROS的对应目录下去寻找):
sudo apt-get install ros-noetic-usb-cam
第三步——修改对应的launch文件:
在usb_cam/launch下,修改usb_cam.launch,根据自己的号码修改:
第四步——测试
cd catkin_ws/src
source /devel/setup.bash
roslaunch usb_cam usb_cam.launch
成功获取到超声视频信息:
第五步——对源代码简单修改,自动保存当前图像
找到usb_cam/src,对usb_cam_node.cpp文件进行修改:
#include <ros/ros.h>
#include "usb_cam/usb_cam.h"
#include <sensor_msgs/Image.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/highgui/highgui.hpp>
// 回调函数,用于处理图像消息
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
// 将 ROS 图像消息转换为 OpenCV 图像格式
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::imwrite("/home/lwc/image.jpg", cv_ptr->image);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "usb_cam");
usb_cam::UsbCam& camera = usb_cam::UsbCam::Instance();
// 创建 ROS 节点句柄
ros::NodeHandle nh;
// 创建图像消息订阅者,订阅 usb_cam/image_raw 话题
ros::Subscriber image_sub = nh.subscribe("usb_cam/image_raw", 1, imageCallback);
// 创建定时器,每隔两秒触发一次回调函数
ros::Timer timer = nh.createTimer(ros::Duration(2.0), [](const ros::TimerEvent& event) {
ROS_INFO("Saving image...");
});
ros::spin();
return 0;
}
可以看到成功保存了图片:
如图: