Ubuntu下usb_cam驱动安装与双目相机图像分割实战

张开发
2026/4/10 21:45:15 15 分钟阅读

分享文章

Ubuntu下usb_cam驱动安装与双目相机图像分割实战
1. Ubuntu下usb_cam驱动安装全攻略第一次在Ubuntu系统里折腾USB相机时我踩了不少坑。记得当时为了调试一个机器人视觉项目整整两天都卡在驱动安装环节。后来才发现问题出在几个关键的依赖项上。下面我就把这些年积累的实战经验用最直白的方式分享给大家。先说说usb_cam这个ROS功能包。它就像个万能翻译器能把普通USB相机拍到的画面转换成ROS系统能理解的语言也就是topic。这样其他程序就能方便地获取图像数据了。不过要注意不同版本的Ubuntu和ROS安装方法会有细微差别。我以Ubuntu 20.04 ROS Noetic为例带大家走完整套流程。首先创建专属工作空间mkdir -p usb_ws/src cd usb_ws/src catkin_init_workspace接着编译工作空间时90%的人会遇到第一个坑cd ~/usb_ws/ catkin_make这时系统可能会报错说找不到libv4l2。别慌开个新终端安装依赖就行sudo apt-get install libv4l-dev安装完重新编译就能顺利通过了。这里有个实用技巧建议把环境变量设置永久生效免得每次开新终端都要重新配置echo source ~/usb_ws/devel/setup.bash ~/.bashrc source ~/.bashrc验证环境变量是否生效可以用这个命令echo $ROS_PACKAGE_PATH如果显示出你的工作空间路径说明配置成功了。2. 双目相机特殊配置技巧现在市面上的双目相机主要有两种双USB接口的和单USB接口的。我重点说说后者因为它更麻烦——两个摄像头的画面会拼接成一幅图像输出。比如常见的2560x720分辨率其实就是两个1280x720的画面左右拼接。配置launch文件时要注意这几个关键参数param namevideo_device value/dev/video0 / param nameimage_width value2560 / param nameimage_height value720 / param namepixel_format valueyuyv /这里有个实用经验如果画面卡顿可以尝试把pixel_format轮流改成mjpeg或uyvy。我测试过5款不同品牌的双目相机发现yuyv格式兼容性最好但mjpeg有时会更流畅。启动相机节点的命令是roslaunch usb_cam usb_cam-test.launch启动后可以用rqt_image_view查看图像记得topic要选对。3. 双目图像分割实战代码解析拿到拼接图像后关键是要把它精准地分割成左右两幅。这就需要用OpenCV的ROI感兴趣区域功能。我写了个ROS节点专门处理这个下面拆解核心代码首先是订阅和发布的设置image_sub_ it_.subscribe(/usb_cam/image_raw, 1, CameraSplitter::imageCallback, this); image_pub_left_ it_.advertiseCamera(/left_cam/image_raw, 1); image_pub_right_ it_.advertiseCamera(/right_cam/image_raw, 1);图像回调函数里的分割逻辑是这样的// 截取左半部分图像 (x从0开始宽度为原图一半) leftImgROI_cv_ptr-image(cv::Rect(0,0,cv_ptr-image.cols/2, cv_ptr-image.rows)); // 截取右半部分图像 (x从中间开始) rightImgROI_cv_ptr-image(cv::Rect(cv_ptr-image.cols/2,0, cv_ptr-image.cols/2, cv_ptr-image.rows));这里有个坑我踩过时间戳同步问题。如果不处理header信息后续的图像处理会出问题ci_left_-header cv_ptr-header; ci_right_-header cv_ptr-header; leftPtr-headermsg-header; rightPtr-headermsg-header;4. 完整项目构建与调试建议为图像分割单独创建工作空间mkdir -p cut_ws/src cd cut_ws catkin_makeCMakeLists.txt的配置要点find_package(OpenCV REQUIRED) include_directories(${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS}) add_executable(camera_split_node src/camera_split.cpp) target_link_libraries(camera_split_node ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})launch文件配置示例node pkgimage_view typeimage_view nameimage_view_left remap fromimage to/left_cam/image_raw/ /node调试时建议先用简单的测试图像确认分割线是否精准。我常用的测试命令rosrun rqt_image_view rqt_image_view最后提醒下如果要做立体视觉记得先对左右相机单独标定。标定文件可以通过参数服务器加载string left_cal_file nh_.paramstd::string(left_cam_file, );在实际项目中我发现分辨率设置不当是最常见的问题。特别是使用廉价双目相机时一定要确认设备支持的分辨率模式。有些相机声称支持2560x720实际输出可能只有1280x480。

更多文章