opencv-cvCalibrateCamera标定的一些问题

问题描述

cvCalibrateCamera标定的一些问题

最近研究摄像机标定,先用单目摄像机标定。发现如下问题:
1. cvCalibrateCamera第一个参数object_points是角点在世界坐标系中坐标(世界坐标系原点在第一个角点位置,标定板所有点坐标都在Z=0的平面上)。
第二个参数image_points是角点在图像坐标系中坐标(图像坐标系原点在第一个角点位置)。这个参数可以通过cvfindchessboardcorners函数得到。

提取出来的角点坐标image_points包含的是图像中先按照从左到右,再从上到下顺序存储的坐标值。理论上第一个参数的点应该和第二个参数对应上,可是我发现opencv书中的代码是先从上到下,再从左至右:

step = successes*board_n;
for( int i=step, j=0; j<board_n; ++i,++j ) {
CV_MAT_ELEM(*image_points, float,i,0) = corners[j].x;
CV_MAT_ELEM(*image_points, float,i,1) = corners[j].y;
CV_MAT_ELEM(*object_points,float,i,0) = (j/board_w)*21.5; // 个人觉得应该是CV_MAT_ELEM(*object_points,float,i,0) = j%board_w;
CV_MAT_ELEM(*object_points,float,i,1) = (j%board_w)*21.5; // 个人觉得应该是CV_MAT_ELEM(*object_points,float,i,0) = j/board_w;
CV_MAT_ELEM(*object_points,float,i,2) = 0.0f;
}

源代码坐标依次是(0,0,0),(0,1*21.5,0),(0,2*21.5,0).....是先从上到下。
我的代码坐标依次是(0,0,0),(1*21.5,0,0),(2*21.5,0,0) .....是从左至右。

而标定板上检测出的角点顺序是先从左至右,再从上到下。不知道哪个正确?? 两个方法我都试了,效果并没有明显不同。

得出的摄像机内矩阵和畸变系数分别是
<?xml version="1.0"?>

3
3

f

1.30523621e+003 0. 3.19316345e+002 0. 1.31042041e+003
1.88144318e+002 0. 0. 1.

<?xml version="1.0"?>

5
1

f

7.49643818e-002 -7.14159346e+000 2.39964016e-003 -1.75716709e-002
7.27485962e+001

////////////////////////////////////////////////////////////////////////////////////////

<?xml version="1.0"?>

3
3

f

1.30245691e+003 0. 3.19592133e+002 0. 1.30768018e+003
1.88326523e+002 0. 0. 1.

<?xml version="1.0"?>

5
1

f

7.38773346e-002 -7.05401230e+000 2.40107719e-003 -1.75304897e-002
7.13559875e+001

//////////////////////////////////////////////////////////////////////

本人使用matlab也做了校正,得出的摄像机内矩阵和畸变系数如下:

Focal Length: fc = [ 17702.95064 18428.99257 ]  [ 2237.98276 2860.08116 ]
Principal point: cc = [ 319.50000 239.50000 ]  [ 0.00000 0.00000 ]
Skew: alpha_c = [ 0.00000 ]  [ 0.00000 ] => angle of pixel axes = 90.00000  0.00000 degrees
Distortion: kc = [ -59.26465 210144.98702 0.23047 -0.55149 0.00000 ]  [ 62.11093 310619.70504 0.10025 0.08585 0.00000 ]
Pixel error: err = [ 1.10052 1.13712 ]

相差很多,不知道哪出现问题了。

  1. 如何验证校验结果,使用matlab进行标定发现得出的摄像机内矩阵和畸变系数与自己写代码得出差很多,见上面。通过右眼看校正后的图像看不出来校正效果。因为原图像本身就没有太大的畸变。
  2. 得出的旋转向量和平移向量是什么意思?为什么我得不到旋转向量和平移向量,这两个参数带NULL是没有问题的
    cvCalibrateCamera2(object_points2, image_points2, point_counts2, cvGetSize(image), intrinsic_matrix, distortion_coeffs, 0, 0,0);
    

但是带入向量就会出现unhandled exception,代码如下:

    cvCalibrateCamera2(object_points2, image_points2, point_counts2, cvGetSize(image), intrinsic_matrix, distortion_coeffs, rotation_vectors, translation_vectors, CV_CALIB_USE_INTRINSIC_GUESS);

新人刚研究opencv,希望各位出谋划策,给点帮助,谢谢了。

时间: 2024-09-13 00:47:14

opencv-cvCalibrateCamera标定的一些问题的相关文章

opencv相机标定

   代码是我几个月前,不知道哪里下载的,原始版权不在我,也没法给出处.    opencv做相机标定经常碰到问题,就是超大图片无法找到角点.我做了小修改,就是把图片先缩小,等找到角点了,再放大到原来比例.    输入参数: 方格的数量,注意是内圈角点数量 boardsize 方格的物理 尺寸,单位毫米   squaresize CMakeLists: cmake_minimum_required(VERSION 2.8) project( Calibrate ) find_package( O

OpenCV相机标定和姿态更新

原帖地址: http://blog.csdn.net/aptx704610875/article/details/48914043 http://blog.csdn.net/aptx704610875/article/details/48915149 这一节我们首先介绍下计算机视觉领域中常见的三个坐标系:图像坐标系,相机坐标系,世界坐标系以及他们之间的关系,然后介绍如何使用张正友相机标定法标定相机. 图像坐标系: 理想的图像坐标系原点O1和真实的O0有一定的偏差,由此我们建立了等式(1)和(2)

xml-opencv摄像头标定,不知道XML怎么输入

问题描述 opencv摄像头标定,不知道XML怎么输入 用opencv samples里面的摄像头标定源文件,编译成功了,好像使用XML文件把图片调进去 <?xml version=""1.0""?> images/CameraCalibraation/VID5/xx1.jpgimages/CameraCalibraation/VID5/xx2.jpgimages/CameraCalibraation/VID5/xx3.jpgimages/CameraC

基于C++实现kinect+opencv 获取深度及彩色数据_C 语言

开发环境 vs2010+OPENCV2.4.10 首先,下载最新的Kinect 2 SDK  http://www.microsoft.com/en-us/kinectforwindows/develop/downloads-docs.aspx 下载之后不要插入Kinect,最好也不用插入除了键盘鼠标以外的其它USB设备,然后安装SDK,安装完成之后插入Kinect,会有安装新设备的提示.安装完成之后可以去"开始"那里找到两个新安装的软件,一个是可以显示Kinect深度图,另外一个软件

c++和opencv-利用opencv中的张正友方法进行摄像机标定

问题描述 利用opencv中的张正友方法进行摄像机标定 利用opencv和c++进行摄像机标定,采用的程序是网上的基于张正友的标定方法,网上说的结果和我的执行结果不同,是采用了不同角度的20张图片,理论上这20张图片的旋转向量和平移向量应该不相同,但是我最后求出来的旋转矩阵和平移向量竟然都是相同的,结果如下,,,,,,不知道是怎么回事儿??请教高手解答啊 第1幅图像的旋转向量: {{-2.65698e+303,-2.65698e+303,-2.65698e+303}} 第1幅图像的旋转矩阵: {

关于opencv标定角点的世界坐标求法的困惑

问题描述 关于opencv标定角点的世界坐标求法的困惑 关于opencv标定角点的世界坐标求法的困惑,目前发现有三种求法: 1.opencvsourcessamplescpp中calibration.cpp求法 for( int i = 0; i < boardSize.height; i++ ) for( int j = 0; j < boardSize.width; j++ ) corners.push_back(Point3f(float(j*squareSize),float(i*sq

opencv 摄像头-oencv摄像头标定 摄影头灰屏

问题描述 oencv摄像头标定 摄影头灰屏 一段标定的程序,从运行成功的同学那里拷来的,但是我每次运行都是 第一次运行是灰屏,之后都出来一个以视频源为标题的提示框,上面还有捕获源等,具体如图所示.请教大家这是怎么回事 解决方案 最初摄影头指示灯还是亮的,说明调用摄像头成功了,然而现在已经不亮了,求问这是怎么回事啊 解决方案二: 可能是那里没有配置正确吧,先看看opencv是好着没,完后看看摄像头的问题,用其他的软件看看摄像头好这么最后就是程序版本,32,还是64,逐个排除吧

摄像机标定opencv问题

问题描述 摄像机标定opencv问题 程序出现:Opencv Error:Incorrect size of input array(...) 怎么改? Matrix<double> object_points(1,board_size.width*board_size.height*image_count,3); /* 保存定标板上角点的三维坐标 */ 调试到这里就报那个错误 Matrix<double> image_points(1,image_points_seq.cvseq

初学者提问: opencv标定问题

问题描述 初学者提问: opencv标定问题 findChessboardCorners中,为什么传进vector> corners进去,回来后它的大小和内容完全不对劲呢?(大小目测是2亿多) 小白没有C币,请大神原谅!