Bootstrap

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

;