下面简单记录一下我利用ros标定相机参数的过程,Ubuntu 16.04 ,摄像头用的罗技C920

ROSwiki有相机矫正的官方文档,有单目的也有立体相机的教程,建议直接看原文,原汁原味:链接

1、相机标定第一步,准备一张标定板,打印出来下载

标定板为8x6,我用A4纸打印出来为,用直尺量square边长为24.5mm(这个根据自己标定板的大小自己量,大点好),即0.0245m,作为标定输入参数。

2、打开相机

利用usb_cam驱动 ,直接git到电脑上编译就可以运行,没安装的参考ros.wiki.usb_cam

开启roscore,打开相机

roslaunch usb_cam usb_cam-test.launch
//launch文件里面默认设备为/dev/video0,我的外接USB摄像头是/dev/video1)
//如果你没有矫正过的话,你会发现打开相机时会有一条警告

因为相机启动时自动检查矫正文件,而你还没有!哈哈

3、打开矫正窗口

一般来说正常安装ros都是包含了camera_calibration,输入下面命令检查一下

sun@sun-pc:~$ rosdep install camera_calibration
#All required rosdeps installed successfully

之后执行相机矫正py文件,从Damondback版本开始,ROS就支持使用多个标定板来进行标定了,如果你使用多个标定板进行标定,请输入复数个–size和–square参数来说明各个标定板的大小。

 rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0245 image:=/usb_cam/image_raw camera:=/usb_cam

应该弹出一个display的窗口如下:

如果没有的话检查你命令输入是否输入正确,例如:8x6,中间不能用 "*" ,是字母 "x",--size,--square前面是两个"-",还要注意你的相机发出的话题是不是usb_cam/image_raw

4、采集样本数据

为了得到一个好的标定结果,应该使得标定板尽量出现在摄像头视野的各个位置里:标定板出现在视野中的左边,右边,上边和下边,标定板既有倾斜的,也有水平的,离得近的远的都要有,最好保证所有的进度条都是绿色满格的 。

界面中的x:表示标定板在视野中的左右位置。

y:表示标定板在视野中的上下位置。

size:标定板在占视野的尺寸大小,也可以理解为标定板离摄像头的远近。

skew:标定板在视野上下左右中的倾斜位置。

5、计算矫正参数

点击CALIBRATE按钮,稍等1-2分钟,可以在命令窗中看到标定参数,点击COMMIT将结果保存到电脑路径:/home/sun/.ros/camera_info/head_camera.yaml,再次启动相机时就不会有Camera Calibration文件找不到的警告了。

只需加载校准文件不会纠正图像。 为了矫正图像,请使用image_proc包。

如果没有自动载入矫正文件 ,那么就需要调用下image_proc这个包。两种解决方案1.在启动usb_cam的launch文件下面再加上<node name="image_proc" pkg="image_proc" type="image_proc" ns="usb_cam"/>。2.或者启动usb_cam后,在终端命令窗口加上ROS_NAMESPACE=usb_cam rosrun image_proc image_proc。 来源于参考链接评论!

[image]
width
640
height
480
[narrow_stereo]
camera matrix
644.987121 0.000000 331.735116
0.000000 647.308571 248.505845
0.000000 0.000000 1.000000distortion
0.248372 -0.436036 -0.008074 -0.000495 0.000000rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000projection
669.478394 0.000000 331.064954 0.000000
0.000000 669.226440 245.232233 0.000000
0.000000 0.000000 1.000000 0.000000

yaml格式参数:

image_width: 640
image_height: 480
camera_name: head_camera
camera_matrix:rows: 3cols: 3data: [644.9871208555877, 0, 331.7351157700301, 0, 647.3085714349502, 248.5058450461932, 0, 0, 1]
distortion_model: plumb_bob
distortion_coefficients:rows: 1cols: 5data: [0.2483720478627449, -0.4360360704160953, -0.008073532467450732, -0.0004951782308249399, 0]
rectification_matrix:rows: 3cols: 3data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
projection_matrix:rows: 3cols: 4data: [669.4783935546875, 0, 331.064954159061, 0, 0, 669.2264404296875, 245.2322330954958, 0, 0, 0, 1, 0]

参数意义:image_width、image_height代表图片的长宽 camera_name为摄像头名
camera_matrix规定了摄像头的内部参数矩阵
distortion_model指定了畸变模型
distortion_coefficients指定畸变模型的系数
rectification_matrix为矫正矩阵,一般为单位阵

projection_matrix为外部世界坐标到像平面的投影矩阵  参考链接

6、关于这里面的理论,网上很多,自己去发现吧!

7. 小尺寸图像标定

一般标定为640*480图像,或者更大尺寸的(相机支持的),但对于比较小的尺寸相机不支持怎么标定?这时候使用usb_cam修改尺寸会出现图像条纹和重影,无法标定可以采用opencv打开相机,发布图片消息到一个/camera/image话题上,让标定程序订阅这个话题,但ros的标定程序还需要订阅相机信息,没办法,我就先用usb_cam打开另外一个相机,同时再运行opencv打开需要标定的相机。

附一个ros发布图像消息的程序(注意修改project对应的CMakeLists.txt 和 package.xml文件):

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
#include <sstream> // for converting the command line parameter to integerint main(int argc, char** argv)
{// Check if video source has been passed as a parameterif(argv[1] == NULL){ROS_INFO("argv[1]=NULL\n");return 1;}ros::init(argc, argv, "image_publisher");ros::NodeHandle nh;image_transport::ImageTransport it(nh);image_transport::Publisher pub = it.advertise("/camera/image", 1);// Convert the passed as command line parameter index for the video device to an integerstd::istringstream video_sourceCmd(argv[1]);int video_source;// Check if it is indeed a numberif(!(video_sourceCmd >> video_source)){ROS_INFO("video_sourceCmd is %d\n",video_source);return 1;}cv::VideoCapture cap(video_source);cap.set(cv::CAP_PROP_FRAME_WIDTH, 320);cap.set(cv::CAP_PROP_FRAME_HEIGHT, 180);// Check if video device can be opened with the given indexif(!cap.isOpened()){ROS_INFO("can not open video device\n");return 1;}cv::Mat frame;sensor_msgs::ImagePtr msg;ros::Rate loop_rate(30);while (nh.ok()) {cap >> frame;// Check if grabbed frame is actually full with some contentif(!frame.empty()) {msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();pub.publish(msg);}ros::spinOnce();loop_rate.sleep();}
}

以上为个人愚见,不过我也是这么用的,欢迎提出批评意见,互相交流。

ROS下单目相机标定过程相关推荐

  1. 一文图解单目相机标定算法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 有一天,蟹老板找底下的员工川建国同学: 等蟹老板走后,然后转头问旁边的学霸李雷同学: 李雷同学整理了下 ...

  2. 3.OpenCV可视化(Viz)——单目相机标定模拟

    单目相机标定模拟 基于OpenCV中的Viz模块,虚拟一个相机,设置相机的内参数.然后在相机视野下放置标定板,通过相机标定算法,最终再获取相机内参数. 当然最终相机标定还是存在误差,我猜测主要原因是标 ...

  3. 单目相机标定 分辨率1920X1080 利用libuvc

    单目相机标定 分辨率1920X1080 利用libuvc libuvc 安装 开始标定 之前一直使用 usb_cam 但是默认分辨率是 640X480,调节到1920X1080后运行出错,干脆用lib ...

  4. SLAM学习 | 单目相机标定(附代码实测可用)

    SLAM学习 | 单目相机标定(附代码实测可用) 1 针孔相机模型 2 张正友标定法 3 VS2013下配置openCV 4 标定过程与结果 5 经验总结与注意事项 概要: 这篇文章介绍如何解决做SL ...

  5. matlab单目相机标定步骤,matlab相机标定

    本文是一篇关于相机标定意义和原理的个人总结,包含了 OpenCV 和 Matlab 中常用的相机 标定函数的注解. 相机标定是机器视觉的基础, 标定结果的好坏直接决定了机器...... 图片数量一定程 ...

  6. 单目相机标定(使用OpenCV)

    关于相机标定的理论知识和使用Matlab软件进行相机标定请看这篇博文:单目相机标定(使用Matlab) 这次因为项目原因需要给海康工业相机进行标定了,下载Matlab软件有些麻烦(主要是我电脑内存小. ...

  7. Halcon例程(基于多个标定图的单目相机标定)详解—— Camera_calibration_multi_image.hdev

    一.前言 在我的工业相机专栏里已经将相机标定涉及到的理论部分讲解完毕,为什么要标定以及标定要求出什么参数呢,用一个Halcon 例程来帮助理解. 这个例程是比较经典的标定程序,基本将标定过程讲的比较清 ...

  8. 基于OpenCV的单目相机标定与三维定位

    相机是产生图像数据的硬件,广泛应用于消费电子.汽车.安防等领域.围绕着相机衍生出一系列的研究与应用领域,包括传统的图像处理和基于深度学习的智能应用等.目前大火的自动驾驶中相机也是重要的硬件组成,如环视 ...

  9. matlab单目相机标定

    文章目录 1.标定图片 2.标定 3.获取标定结果 使用matlab进行相机参数标定非常方便,相机畸变模型请参考另一篇文章相机内参与畸变模型,单目相机标定的结果就是得到相机内参与畸变系数. 1.标定图 ...

最新文章

  1. GNN 系列(三):GraphSAGE
  2. 5008.工程师职场能力自测评估
  3. 加速企业数字化转型,首届Spring Summit技术峰会圆满落幕
  4. 利用CMake编译内核模块
  5. Codeforces Round #192 (Div. 2)
  6. [转]一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
  7. leetcode491. 递增子序列(回溯算法)
  8. dd命令安装Linux
  9. 数据集可以导入mysql_利用数据集进行数据访问操作
  10. Python爬取“Python小屋”公众号所有文章生成独立Word文档
  11. jfinal后台获取权限树,以供前台展示
  12. ubuntu切换到root
  13. Netlink套接字
  14. 资源管理器 右键 反应慢 现象解决方案
  15. 关于 JVM 内存的 N 个问题(转)
  16. Pod 的生命周期及探针
  17. 小米卸载动画-图标爆炸实现
  18. h3c comware 使用 freeradius 统一认证---草稿
  19. mysql1055_MySQL5.7 group by新特性报错1055的解决办法
  20. 转载-css 属性clip-path之多边形polygon小窥

热门文章

  1. 《销售管理必读12篇》购买方法
  2. pow函数python_python pow函数怎么用
  3. html、css 实现二级菜单
  4. 百草药灸冷敷凝胶:学会呵护 才会跑步
  5. 图像处理 语音信号 matlab china-pub 当当,MATLAB数字信号与图像处理范例实战速查宝典...
  6. 练习8-8 移动字母 (10分)
  7. 二手车交易,原车牌可以保留吗?
  8. 群晖服务器显示灯,群晖猫盘LED呼吸灯显示网络状态
  9. android开发之ExpandableListView的使用,实现类似QQ好友列表
  10. 9月份四六级报名通知来啦!2020年上半年四六级考试特别提示