Opencv+ROS自编相机驱动
目录
一、工具
二、原理
代码
标定
三、总结
参考:
一、工具
opencv2+ros
ubuntu18.04
usb摄像头
二、原理
这里模仿usb_cam功能包对Opencv_ros进行修饰,加上相机参数和相机状态,难点在于相机参数的读取。
对于相机参数话题 camera_info内有
查看话题数据类型为sensor_msgs/CameraInfo
网址
其中有header,height,wirdth,和D,K,R,P四个矩阵参数,其中K是内参矩阵,D是畸变参数,P是投影矩阵,R是旋转矩阵
distortion_model是畸变模型,
plumb_bob 畸变模型是最常见的畸变模型之一,也是默认的畸变模型。钉形畸变模型
查看具体信息 https://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/CameraInfo.html
可以查到每个参数的类型其中header需要我们手动定义,后面参数矩阵通过读取配置文件即可。
进入/.ros/camear_info文件夹查看.yaml文件
这里面有所有内参数据
distortion_coefficients是D
camera_matrix是K
projection_matrix是P
rectification_matrix是R
那么我们要怎样读取呢,官方给出了读参函数
应用camera_info软件包
$ sudo apt-get install ros-$ROS_DISTRO-camera-info-manager
代码
引用头文件
#include <camera_info_manager/camera_info_manager.h>
定义发布话题
ros::Publisher camera_info_pub = nh.advertise<sensor_msgs::CameraInfo>("camera_info",10);
定义发布参数
Mat frame; //定义opencv形式图像参数
cv_bridge::CvImage cv_img;
sensor_msgs::Image ros_msg; //定义ros形式图像参数
sensor_msgs::CameraInfo ci; //定义相机内参
std_msgs::String ros_str; //定义相机状态参数
编写读取文件代码
//const string camurl = "file:///home/hsj/.ros/camera_info/head_camera.yaml";
const string camurl = ""; //空的会默认找从 camera_calibration 标定的yaml 文件
image_transport::ImageTransport it(nh);
camera_info_manager::CameraInfoManager camera_info(nh, "head_camera", camurl);
这里可以写绝对路径,也可以空着
然后ci作为参数要给其赋值
ros_msg.header.stamp= ros::Time::now();
ros_msg.header.frame_id = camera_frame_id;
ci = camera_info.getCameraInfo();
ci.header = ros_msg.header;
这里引用了getCameraInfo()函数
然后话题就有数据了
标定
先说明上述参数是怎么来的
下载相机标定工具
sudo apt-get install ros-$ROS_DISTRO-camera-calibration
提前打开相机驱动
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0254 image:=/opencv_camera/image camera:=/opencv_camera
(1)--size 8x6: 为当前标定板的大小(如果你的棋盘格的小方格的个数是9x7,那么我们这里就写–size 8x6)
(2)--square 0.108:为每个小棋盘格的边长,单位是米,上面打印的标定版尺寸 (3)image:=/usb_cam/image_raw:标定当前订阅图像来源自名为/usb_cam/image_raw的topic
(4)camera:=/usb_cam:为摄像机名
所以需要一个打印出来的标定板,会更加准确。可以在我的资源里下载标定板
会打开标定界面
在标定程序的界面能看到右侧有X Y Size Skew 还有CALIBRATE, SAVE 和COMMIT的标识
X:表示标定板在视野中的左右位置
Y:表示标定板在视野中的上下位置
Size:表示标定板在视野中的尺寸大小,其实就是离相机的远近
Skew:表示标定板在视野中的倾斜角度
没标定一张图片终端会有一行输出
等标定到三个参数变绿或者大于40张就可以进行 计算
然后save保存临时文件
会在终端输出相机参数
然后点击commit即可
如果出现按下commit卡住不动的情况,可以手动修改参数
对于保存的数据会在/tmp
cd /tmp
tar -xvzf calibrationdata.tar.gz
解压出的ost.txt内有参数
mv ost.txt ost.ini #修改名字
rosrun camera_calibration_parsers convert ost.ini head_camera.yaml #转换成相机引用信息
sudo mv head_camera.yaml ~/.ros/camera_info/ #移动到该文件下
这样驱动就会自动读取该文件
三、总结
到这里就完成了一个相机驱动的基本配置,可以作为yolo识别的相机话题数据进行应用。
这里提供我写的源码,可以参考
https://github.com/jiezz12/Opencv_ros.git
git clone https://github.com/jiezz12/Opencv_ros.git
参考:
usb_cam功能包源码
rocon_rtsp_camera_relay源码
https://blog.csdn.net/m0_56661101/article/details/132732905