ROS 下利用 usb_cam 读取图像、opencv 图像、摄像头的标定

本文介绍了如何在ROS环境下利用usb_cam包读取和发布摄像头图像,并通过cv_bridge将ROS图像转换为OpenCV可处理的图像,同时提供了摄像头的标定流程和参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近导师让我做一个小项目:检测汽车的充电孔与充电桩的的距离(x,y,z)和角度。为了控制成本,扔给我一个淘宝上十几块钱的摄像头。检测和计算部分再此不细说,本文只总结一下,一个普通的摄像头,如何在 ubuntu 下写一个 ROS 包,将图像读取和发布出来。

      1、判断摄像头的类型

      在 ROS 中,有两类,一类是 uvc,一类是 usb 。不同类别对应不同的软件包。以我这个摄像头为例。先

lsusb

结果如下:(两幅图分别对应插入摄像头前后的结果)


由上可知,我的摄像头的 ID 是 05a3:9230 。接着,去网址 http://www.ideasonboard.org/uvc/ 查找 ID(05a3:9230 ),看是否支持。如果支持,就是 uvc 类型。如果不支持,就是 usb 类型,一般来说都是 usb 类型。我的是 usb 类型。


      2、 安装usb_cam包,读取图像

依次输入以下命令即可。

cd catkin_ws/src   // 你可以根据自己的需求,创建文件夹,我的直接安装在 catkin_make 里面了
git clone https://github.com/bosch-ros-pkg/usb_cam.git 
cd ..   
catkin_make

插入摄像头,确定自己的摄像头是viedo0

### 配置 ArUco 和 `usb_cam` 进行标记检测 为了实现 ArUco 标记检测并将其与 ROS 中的 `usb_cam` 节点集成,需完成几个关键步骤。这涉及设置摄像头节点、发布图像话题以及配置 ArUco 检测器来订阅这些图像数据。 #### 启动 USB 摄像头节点 当遇到错误 `[ERROR] [1623814244.863283145]: Cannot identify '/dev/video0': 2, No such file or directory`[^1] 表明系统无法识别指定设备路径 `/dev/video0`。确保连接了正确的USB摄像设备,并且该设备被操作系统正确挂载到预期位置。如果确认硬件正常工作,则可能需要调整启动文件中的设备名称或权限设置。 ```xml <launch> <!-- 设置相机参数 --> <node pkg="usb_cam" type="usb_cam_node" name="usb_cam"> <param name="video_device" value="/dev/videoX"/> <!-- X代表实际编号 --> <param name="image_width" value="640"/> <param name="image_height" value="480"/> <param name="pixel_format" value="mjpeg"/> <param name="camera_frame_id" value="usb_cam"/> <!-- 发布原始图像主题 --> <remap from="image_raw" to="/usb_cam/image_raw"/> </node> </launch> ``` #### 单目相机标定 在进行任何视觉处理之前,建议先对标定单目相机以获得更精确的结果: ```bash rosrun camera_calibration cameracalibrator.py \ --size 11x8 --square 0.02 image:=/usb_cam/image_raw ``` 上述命令会引导用户通过一系列棋盘格案拍摄来进行内参估计[^3]。 #### 使用 ArUco 库执行标记检测 安装必要的依赖项之后,在ROS环境中可以通过编写Python脚本或者创建新的ROS包来调用OpenCV自带的支持ArUco的功能模块。下面给出一段简单的 Python 示例代码片段展示如何读取来自`usb_cam`的话题消息并对其中包含的画面实施ArUco码解析: ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge, CvBridgeError import cv2.aruco as aruco import numpy as np class MarkerDetector(object): def __init__(self): self.bridge = CvBridge() self.image_subscriber = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback) def callback(self, data): try: frame = self.bridge.imgmsg_to_cv2(data, desired_encoding='bgr8') except CvBridgeError as e: print(e) return gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) dictionary = aruco.Dictionary_get(aruco.DICT_6X6_250) parameters = aruco.DetectorParameters_create() corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, dictionary, parameters=parameters) if ids is not None and len(ids)>0 : aruco.drawDetectedMarkers(frame,corners,ids,(0,255,0)) # 显示结果窗口 (仅限调试用途) cv2.imshow('frame', frame) key=cv2.waitKey(1)&0xFF if key==ord('q'): cv2.destroyAllWindows() if __name__ == '__main__': rospy.init_node('marker_detector') detector = MarkerDetector() rospy.spin() ``` 这段程序监听由`usb_cam`发布的图像流(`/usb_cam/image_raw`),利用 OpenCV 的 ArUco API 对每一帧画面做实时分析寻找特定模式下的编码标签,并将结果显示出来以便观察效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值