搜档网
当前位置:搜档网 › 相机标定程序

相机标定程序

相机标定程序
相机标定程序

/*环境OpenCV2.3.1+visual studio2010

*calibdata.txt 保持标定图片的路径(根据实际设置)

*/

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include

#include

#include

using namespace std;

int main()

{

IplImage * show; //RePlay图像指针

cvNamedWindow("RePlay",1);

int number_image_copy=7; //复制图像帧数

CvSize board_size=cvSize(5,7); //标定板角点数

CvSize2D32f square_size=cvSize2D32f(10,10); //假设我的每个标定方格长宽都是1.82厘米

float square_length=square_size.width; //方格长度

float square_height=square_size.height; //方格高度

int board_width=board_size.width; //每行角点数

int board_height=board_size.height; //每列角点数

int total_per_image=board_width*board_height; //每张图片角点总数

int count; //存储每帧图像中实际识别的角点数

int found;//识别标定板角点的标志位

int step; //存储步长,step=successes*total_per_image;

int successes=0; //存储成功找到标定板上所有角点的图像帧数

int a=1; //临时变量,表示在操作第a帧图像

const int NImages = 7;//图片总数

CvMat *rotation_vectors;

CvMat *translation_vectors;

CvPoint2D32f * image_points_buf = new CvPoint2D32f[total_per_image]; //存储角点图像坐标的数组

CvMat * image_points=cvCreateMat(NImages*total_per_image,2,CV_32FC1); //存储角点的图像坐标的矩阵

CvMat * object_points=cvCreateMat(NImages*total_per_image,3,CV_32FC1); //存储角点的三维坐标的矩阵

CvMat * point_counts=cvCreateMat(NImages,1,CV_32SC1); //存储每帧图像的识别的角点数

CvMat * intrinsic_matrix=cvCreateMat(3,3,CV_32FC1);//内参数矩阵

CvMat * distortion_coeffs=cvCreateMat(5,1,CV_32FC1); //畸变系数

rotation_vectors = cvCreateMat(NImages,3,CV_32FC1);//旋转矩阵

translation_vectors = cvCreateMat(NImages,3,CV_32FC1);//平移矩阵

ifstream fin("calibdata.txt"); /* 定标所用图像文件的路径*/

while(a<=number_image_copy)

{

//sprintf_s (filename,"%d.jpg",a);

string filename;

getline(fin,filename);

show=cvLoadImage(filename.c_str(),1);

//寻找棋盘图的内角点位置

found=cvFindChessboardCorners(show,board_size,image_points_buf,&count,

CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);

if (found==0)

{ //如果没找到标定板角点时

cout<<"第"<

cvNamedWindow("RePlay",1);

cvShowImage("RePlay",show);

cvWaitKey(0);

}

else

{ //找到标定板角点时

cout<<"第"<

cvNamedWindow("RePlay",1);

IplImage * gray_image= cvCreateImage(cvGetSize(show),8,1);

cvCvtColor(show,gray_image,CV_BGR2GRAY);

cout<<"获取源图像灰度图过程完成...\n";

cvFindCornerSubPix(gray_image,image_points_buf,count,cvSize(11,11),cvSize(-1,-1),

cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,0.1));

cout<<"灰度图亚像素化过程完成...\n";

cvDrawChessboardCorners(show,board_size,image_points_buf,count,found);

cout<<"在源图像上绘制角点过程完成...\n\n";

cvShowImage("RePlay",show);

cvWaitKey(0);

}

if(total_per_image==count)

{

step=successes*total_per_image; //计算存储相应坐标数据的步长

for(int i=step,j=0;j

{

CV_MAT_ELEM(*image_points, float,i,0)=image_points_buf[j].x;

CV_MAT_ELEM(*image_points, float,i,1)=image_points_buf[j].y;

CV_MAT_ELEM(*object_points,float,i,0)=(float)((j/board_width)*square_length);

CV_MAT_ELEM(*object_points,float,i,1)=(float)((j%board_width)*square_height);

CV_MAT_ELEM(*object_points,float,i,2)=0.0f;

}

CV_MAT_ELEM(*point_counts,int,successes,0)=total_per_image;

successes++;

}

a++;

}

cvReleaseImage(&show);

cvDestroyWindow("RePlay");

cout<<"*********************************************\n";

cout<

cout<

cout<<"*********************************************\n\n";

cout<<"按任意键开始计算摄像机内参数...\n\n";

/*CvCapture* capture1;

capture1 = cvCreateCameraCapture(0);*/

IplImage * show_colie;

show_colie = cvLoadImage("D:\\openCV\\my_own_code\\Calibration3\\Calibration3\\image\\chess4.jpg",1);

CvMat * object_points2 = cvCreateMat(successes*total_per_image,3,CV_32FC1);

CvMat * image_points2 = cvCreateMat(successes*total_per_image,2,CV_32FC1);

CvMat * point_counts2 = cvCreateMat(successes,1,CV_32SC1);

for(int i=0;i

{

CV_MAT_ELEM(*image_points2, float,i,0)=CV_MAT_ELEM(*image_points, float,i,0);

CV_MAT_ELEM(*image_points2, float,i,1)=CV_MAT_ELEM(*image_points, float,i,1);

CV_MAT_ELEM(*object_points2,float,i,0)=CV_MAT_ELEM(*object_points,float,i,0);

CV_MAT_ELEM(*object_points2,float,i,1)=CV_MAT_ELEM(*object_points,float,i,1);

CV_MAT_ELEM(*object_points2,float,i,2)=CV_MAT_ELEM(*object_points,float,i,2);

}

for(int i=0;i

{

CV_MAT_ELEM(*point_counts2,int,i,0) = CV_MAT_ELEM(*point_counts,int,i,0);

}

cvReleaseMat(&object_points);

cvReleaseMat(&image_points);

cvReleaseMat(&point_counts);

CV_MAT_ELEM(*intrinsic_matrix,float,0,0)=1.0f;

CV_MAT_ELEM(*intrinsic_matrix,float,1,1)=1.0f;

cvCalibrateCamera2(object_points2,image_points2,point_counts2,cvGetSize(show_colie), intrinsic_matrix,distortion_coeffs,rotation_vectors,translation_vectors,0);

cout<<"摄像机内参数矩阵为:\n";

cout<

"<

<<" "<

<<"\n\n";

cout<

"<

<<" "<

<<"\n\n";

cout<

"<

<<" "<

<<"\n\n";

cout<<"畸变系数矩阵为:\n";

cout<

"<

<<" "<

<<" "<

<<" "<

<<"\n\n";

cvSave("Intrinsics.xml",intrinsic_matrix);

cvSave("Distortion.xml",distortion_coeffs);

cout<<"摄像机矩阵、畸变系数向量已经分别存储在名为Intrinsics.xml、Distortion.xml 文档中\n\n";

for(int ii = 0; ii < NImages; ++ii)

{ float tranv[3] = {0.0};

float rotv[3] = {0.0};

for ( int i = 0; i < 3; i++)

{

tranv[i] = ((float*)(translation_vectors->data.ptr+ii*translation_vectors->step))[i];

rotv[i] = ((float*)(rotation_vectors->data.ptr+rotation_vectors->step))[i];

}

cout << "第" << ii+1 << "幅图的外参数" << endl;

printf("ROTATION VECTOR 旋转向量: \n");

printf("[ %6.4f %6.4f %6.4f ] \n", rotv[0], rotv[1], rotv[2]);

printf("TRANSLATION VECTOR 平移向量: \n");

printf("[ %6.4f %6.4f %6.4f ] \n", tranv[0], tranv[1], tranv[2]);

printf("-----------------------------------------\n");

}

CvMat * intrinsic=(CvMat *)cvLoad("Intrinsics.xml");

CvMat * distortion=(CvMat *)cvLoad("Distortion.xml");

IplImage * mapx=cvCreateImage(cvGetSize(show_colie),IPL_DEPTH_32F,1);

IplImage * mapy=cvCreateImage(cvGetSize(show_colie),IPL_DEPTH_32F,1);

cvInitUndistortMap(intrinsic,distortion,mapx,mapy);

cvNamedWindow("原始图像",1);

cvNamedWindow("非畸变图像",1);

cout<<"按‘E’键退出显示...\n\n";

/*while(show_colie)

{*/

IplImage * clone=cvCloneImage(show_colie);

cvShowImage("原始图像",show_colie);

cvRemap(clone,show_colie,mapx,mapy);

cvReleaseImage(&clone);

cvShowImage("非畸变图像",show_colie);

cvWaitKey(0);

/*if(cvWaitKey(10)=='e')

{

break;

}*/

/*show_colie=cvQueryFrame(capture1);

}*/

return 0;

}

双目立体相机自标定方案的研究

双目立体相机自标定方案的研究 一、双目立体相机自标定原理 双目视觉是通过两个摄像机从不同的角度拍摄同一物体,根据两幅图像重构出物体。双目立体视觉技术首先根据已知信息计算出世界坐标系和图像坐标系的转换关系,即世界坐标系和图像坐标系的透视投影矩阵,将两幅图像上对应空间同一点的像点匹配起来,建立对应点的世界坐标和图像坐标的转换关系方程,通过求解方程的最小二乘解获取空间点的世界坐标系,实现二维图像到三维图像的重构。重构的关键问题是找出世界坐标系和图像坐标系的转换关系--透视投影矩阵。透视投影矩阵包含了图像坐标系和相机坐标系的转换关系,即相机的内参(主要是相机在两坐标轴上的焦距和相机的倾斜角度),以及相机坐标系和世界坐标系的转换关系,即相机的外参(主要是相机坐标系和世界坐标系的平移、旋转量)。相机标定的过程就是确定相机内参和相机外参的过程。 相机自标定是指不需要标定块,仅仅通过图象点之间的对应关系对相机进行标定的过程。相机自标定技术不需要计算出相机的每一项参数,但需要求出这些参数联系后生成的矩阵。二、怎样提高摄像机自标定精确度? 方法一、.提高估算基本矩阵F 传统的相机自标定采用的是kruppa方程,一组图像可以得到两个kruppa方程,在已知3对图像的条件下,就可以算出所有的内参数。在实际应用中,由于求极点具有不稳定性,所以采取基本矩阵F分解的方法来计算。通过矩阵的分解求出两相机的投射投影矩阵,进而实现三维重构。由于在获取图像过程中存在摄像头的畸变,环境干扰等因素,对图像会造成非线性变化,采用最初提出的线性模型计算 f 会产生误差。非线性的基本矩阵估计方法得到提出。近年来非线性矩阵的新发展是通过概率模型降低噪声以提高估算基本矩阵的精度。方法二、分层逐步标定法。 该方法首先对图像做射影重建,再通过绝对二次曲线施加约束,定出仿射参数和摄像机参数。由于它较其他方法具有较好的鲁棒性,所以能提高自标定的精度。 方法三、利用多幅图像之间的直线对应关系的标定法。 方法四、改进优化算法 自标定问题的求解可归结为求解一组非线性多项式方程组的问题,解决这类问题的常用方法是各种优化算法,所以改进优化算法也是提高精度的有效措施。 英文文献 1.题目:A Camera Self-calibration for Machine Vision Based on Kruppa’s Equation(基于机器视觉的相机自标定Kruppa方程) 作者:Zhaosheng Tao, Dawei Tu, Saisai He, Jinjie Ye 出处:Trans Tech Publ 日期:2013年8月 2.题目:Computer vision methods for optical microscopes(计算机视觉光学显微镜的方法) 作者:M. Boissenin, J. Wedekind *, A.N. Selvan, B.P. Amavasai, F. Caparrelli, J.R. Travis 出处:Elsevier 日期:2007年7月

【CN110033491A】一种相机标定方法【专利】

(19)中华人民共和国国家知识产权局 (12)发明专利申请 (10)申请公布号 (43)申请公布日 (21)申请号 201910299209.5 (22)申请日 2019.04.15 (71)申请人 南京工程学院 地址 211167 江苏省南京市江宁科学园弘 景大道1号 (72)发明人 郝飞 王宗荣 史晶晶 王帆  陈德林 胡运涛 汪海洋 张汝祥  (74)专利代理机构 南京纵横知识产权代理有限 公司 32224 代理人 董建林 范青青 (51)Int.Cl. G06T 7/80(2017.01) (54)发明名称一种相机标定方法(57)摘要本发明公开了相机标定技术领域的一种相机标定方法。旨在解决现有技术中基于一维标定杆标定精度较低,基于三维标定模板标定存在自遮挡问题,基于棋盘格形二维标定模板标定需进行角点检测而无法获取更高的标定精度,基于单个圆形图案作为特征的二维标定模板标定存在“原理性误差”。所述方法包括如下步骤:根据预制的标定模板采集标定模板图像;提取标定模板图像中的特征点,求解相机内参数及镜头畸变参数;根据相机内参数和镜头畸变参数构建多维向量;利用镜头畸变参数对所述标定模板图像进行去畸变处理并构建新的多维变量,直至相邻两次多维变量的欧式距离小于设定值,输出最后一次 相机内参数及畸变参数。权利要求书1页 说明书6页 附图5页CN 110033491 A 2019.07.19 C N 110033491 A

权 利 要 求 书1/1页CN 110033491 A 1.一种相机标定方法,其特征在于,所述方法包括如下步骤: 将预制的标定模板置于待标定相机的视场内,采集标定模板图像;所述标定模板为二维标定模板,标定模板上分布有多个圆形,多个圆形以标定模板的中心点为环心围成多个直径不同的环形阵列; 提取标定模板图像中圆形的特征点,求解相机内参数及镜头畸变参数;所述特征点为圆形的圆心; 根据相机内参数和镜头畸变参数构建多维向量; 利用镜头畸变参数对所述标定模板图像进行去畸变处理,重复相机内参数及畸变参数的求解过程,并构建新的多维变量,直至相邻两次多维变量的欧式距离小于设定值,输出最后一次相机内参数及畸变参数。 2.根据权利要求1所述的相机标定方法,其特征在于,所述特征点的提取方法包括: 对标定模板图像中的圆形进行边缘检测,利用最小二乘法拟合圆环透视投影后产生的两个椭圆; 连接两个椭圆圆心的直线与每个椭圆形成两个交点,采用交比不变原理求解特征点像点的像素坐标。 3.根据权利要求2所述的相机标定方法,其特征在于,所述特征点的提取方法还包括:对标定模板图像进行预处理,所述预处理包括灰度化处理和或滤波处理。 4.根据权利要求1所述的相机标定方法,其特征在于,所述相机内参数包括:主点坐标的两个分量、横向和纵向缩放因子; 所述相机内参数的求解方法包括: 在标定模板图像上标定四个圆形的特征点,利用四个特征点之间的几何约束和定量关系建立关于相机内参数的四元方程组,所述方程组为无约束非线性方程组; 求解无约束非线性方程组,得到相机内参数。 5.根据权利要求1所述的相机标定方法,其特征在于,所述求解镜头两个畸变参数包括如下步骤: 标定一组特征,所述特征包括标定模板图像中满足调和共轭的三个特征点和一个无穷远点; 根据调和比建立关于两个畸变参数的超定方程组; 运用最小二乘法求解超定方程组,得到镜头两个畸变参数。 6.根据权利要求1至中5任一项所述的相机标定方法,其特征在于,所述设定值≤10-5。 2

机器视觉之工业相机传统标定与自标定

机器视觉之工业相机传统标定与自标定机器视觉的基本任务之一是从摄像机获取图像信息并计算三维空间中物体的几何信息,以此重建和识别物体。而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数。在大多数条件下,这些参数必须通过实验与计算才能得到,这个过程被称为摄像机标定。 总的来说,工业相机的标定可以分为传统标定方法和自标定方法两大类。传统工业相机标定的基本方法是在一定的相机模型下,通过对特定标定参照物进行图像处理,并利用一系列数学变换公式计算及优化,来求取相机模型内部参数和外部参数。传统的工业标定方法按照标定参照物与算法思路可以分成若干类,如基于3D立体靶标的相机标定、基于2D平面靶标的相机标定、以及基于径向约束的相机标定等。 然而,该方法在场景未知和摄像机任意运动的一般情况下,其标定很难实现。20世纪90年代初,Faugeras,Luong,Maybank等人首次提出了摄像机自标定方法。这种自标定法利用摄像机本身参数之间的约束关系来标定,而与场景和摄像机的运动无关,不依赖于标定参照物,仅利用相机在运动过程中周围环境图像与图像之间的对应关系来对相机进行标定。目前已有的自标定技术大致可以分为基于主动视觉的摄像机自标定技术、直接求解Kruppa 方程的摄像机自标定方法、分层逐步标定法、基于二次曲面的自标定方法等几种。 相机自标定相对于传统方法有更好的灵活性和实用性,通过十多年的不懈努力,理论上的问题已基本解决,目前研究的重点是如何提高标定算法的鲁棒性以及如何很好地用这些理论来解决实际视觉问题。维视图像VS220双目立体视觉测量系统平台采用双相机或多相机对空间自由运动体的三维位置坐标及姿态进行高精度测量,高精度的标定模板、完善的摄像机标定数学模型对标靶特征点进行子像素检测,保证系统的标定精度,为系统的高精度测量提供保证。

一种多相机视觉测量系统的全局标定方法

一一第39卷一第5期一吉首大学学报(自然科学版)V o l.39一N o.5一一一一2018年9月J o u r n a l o f J i s h o uU n i v e r s i t y(N a t u r a l S c i e n c eE d i t i o n)S e p t.2018一一 文章编号:10072985(2018)05003808 一种多相机视觉测量系统的全局标定方法? 黄东兆,赵前程 (湖南科技大学机械设备健康维护湖南省重点实验室,湖南湘潭411201) 一一摘一要:提出了一种基于双平面靶标的多相机全局标定方法,要求两靶标之间为刚性联接,绕同一根轴旋转,但它们之间的相对位姿关系可以是未知的.该方法不仅适用于立体视觉测量系统,也适用于基于单目视觉的多相机测量系统,应用于四轮定位仪中多相机相对位姿关系的出厂标定,标定精度满足出厂要求. 关键词:多相机测量系统;全局标定;视觉测量;单目视觉 中图分类号:T P391.7一一一一一一一文献标志码:A D O I:10.13438/j.c n k i.j d z k.2018.05.009 单个相机都受一定的视野范围限制,为了满足高精度二宽视野的工业测量任务,通常需要用多个相机组建一个具有更大视觉空间范围的测量系统.对每个相机进行内参标定,只能在单个相机坐标系下建立视觉测量模型.由于各相机坐标系彼此独立,因此所有相机的测量结果需要统一到其中一个相机坐标系或一个全局坐标系中来表达.统一的过程被称为多相机测量系统位姿关系的全局标定.通常使用 金规校准 (需1个制作精确的标准件作为参考基准)与 银规校准 (需1个经过坐标测量机标定后的标准件作为参考基准)对多相机系统进行全局标定,但在日常搬运中要防止标准件不受损害是相当困难的.因此,张广军[1]提出了使用双电子经纬仪或单电子经纬仪加靶标进行全局标定的方法.该方法精度高,但电子经纬仪价格昂贵,普适性受限.其他一些方法[23]无需贵重仪器,但仅适用于立体视觉测量系统,不能应用于单目视觉系统.多相机测量系统全局标定的本质是确定系统中相机两两之间的相对位姿关系[4],只要任意两相机间的相对位姿关系确定了,就完成了多相机系统的全局标定.笔者提出了一种基于双平面靶标的两相机相对位姿关系的标定方法,在阐述其原理的基础上通过仿真标定与实际标定实验来验证其可行性. 1一基于双平面靶标的两相机间相对位姿关系的标定方法 1.1原理 多相机全局标定装置如图1所示,两靶标之间为刚性联接.两相机的位姿关系的标定如图2所示. 图1一多相机全局标定装置 F i g.1一 G l o b a lM u l t i-C a m e r aC a l i b r a t i o nD e v i c e 图2一两相机间相对位姿关系的标定 F i g.2一T w o-C a m e r aC a l i b r a t i o n f o rR e l a t i v eP o s eR e l a t i o n ?收稿日期:20180322 基金项目:国家自然科学基金资助项目(51345009);湖南省自然科学基金资助项目(13J J4082) 作者简介:黄东兆(1978 ),男,安徽桐城人,湖南科技大学讲师,博士,主要从事机器视觉测量二数控技术等研究.

相机标定方法

摄像机标定的方法和具体的步骤 1.理想的摄像机成像模型 在不考虑畸变的情况下,建立如图所示的摄像机模型。 物体到图像之间的转化,经历了下面四个坐标系的转换: 1.三维世界坐标系 O X Y Z w w w w 这是基于不存在误差的基础上建立的坐标系,是一个理想的模型。这是后两个模型 的参考,可以作为对比的基础。 2.摄像机坐标系Oxyz 该坐标系的原点是摄像机的光心,CCD像平面到原点的距离为f,即理想成像系统 的有效焦距,坐标系的轴与光轴重合。 3.摄像机图像坐标系'O XY O,X轴、该二维坐标系定义在CCD像平面上,其中光轴与像平面的交点定义为原点' Y轴分别平行于x、y轴。 4.计算机像平面坐标系Ouv 在这一坐标系中,原点在图像的左上角。这是一个建立在CCD像平面中的二维坐标 系,u轴和v轴组成坐标系,前者为水平轴,后者为垂直轴,方向向右、向下。 上面我们讨论的四个坐标系中,只有最后一个坐标系的单位是像素。前三者的单位 都是毫米。 一被测点P,其三维坐标为(x,y,z) ,摄像机坐标系为(x,y,z),其经过拍摄后, w w w

在摄像机图像坐标系中的坐标为(X,Y),最后得到计算机像面坐标系的坐标(u,v),这四步的变换过程如下图所示: 一、刚体变换(从世界坐标系到摄像机坐标系) 在刚体变换过程中世界坐标系中的一点到摄像机坐标系中的点,可以由一个旋转矩阵R以及一个平移矩阵t来描述,则存在如下刚体变换公式: 其中R为3X3的旋转矩阵(),t是一个三维平移向量,化为其次坐标形式有:

二、透视投影(相机坐标系到理想图像物理坐标系) 根据针孔模型下透镜成像焦距f,物距u和相距v的关系,以及下图可得:(注意此时的点M是摄像机坐标系的点) y是理想图像物理坐标系坐标)将上面的关系式化成其次坐标式为:(注意:x, u u 三、畸变校正 在上面所有的坐标系公式推导的过程中,我们遵循的是线性摄像机模型,但是实际的摄像机由于镜头制作工艺等原因,使摄像机获取的原始图像是含有畸变的,畸变的图像的像点、投影中心、空间点不存在共线关系,所以如果要想直接运用线性模型来描述三维世界空间的点与像点之间的关系,必须先对畸变的图像进行校正。 畸变模型矫正公式为: y为针孔线性模型计算出来的图像点坐标的理想值,(x,y)是实际的图像点的坐(x,) u u

相机标定个人总结

本文是一篇关于相机标定意义和原理的个人总结,包含了OpenCV和Matlab中常用的相机标定函数的注解。 相机标定是机器视觉的基础,标定结果的好坏直接决定了机器视觉的系统精度,作用可见一斑。在这一年半的时间里,我个人也是随着实验和程序的进一步理解,对标定的原理和意义有了更多的想法。同样,由于博文的关系,仍有一些朋友会常常询问标定的程序问题。本人的2010-05-17OpenCV标定程序的问题也多次被朋友询问,由于当时对标定的认识还不够系统,因此现在认为该文对标定的意义和原理有很多误解,并在此推荐一些较好的博文拱大家学习: 双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目标定; 双目测距与三维重建的OpenCV实现问题集锦(二)双目标定与双目校正; 双摄像头测距的OpenCV实现; 分享一些OpenCV实现立体视觉的经验; 下面结合本人的毕业论文及一年半来对机器视觉的学习,对相机标定的意义和原理进行叙述。 1.单目相机模型 单目相机模型中的三种坐标系关系如图1所示,相机坐标系即是以光轴中心O为原点的坐标系,其z轴满足右手法则,成像原点 f O所代表平面即为像平面坐标系(实际应用中,均以图像左上角为坐标系原点),实际物体坐标系即为世界坐标系。 光轴中心O 图1 单目相机模型的三坐标系统关系 其中,P在世界坐标系的值为() W W W X,Y,Z,P u 是P在像平面坐标系的投影点,其相机 坐标系的值为(X,Y,Z) u u u 。θ是相机坐标系Z轴与像平面夹角,一般情况下Z轴与像平面垂直,θ值为90。且相机坐标系x y O与像平面 f f f x y O平行,f为相机的焦距。

halcon单相机标定详细说明

相机标定 1 相机标定基本原理 1.1 相机成像模型 目前大多数相机模型都是基于针孔成像原理建立的,因为针孔成像原理简单,并且能满足建模的要求。除此之外还有基于应用歪斜光线追踪法和近轴光线追踪法的成像模型[1]。针孔成像虽然已经展示出了相机的成像原理,但是由于针孔成像是理想的物理模型,没有考虑相机本身的尺寸、镜头与相机轴心的偏斜等因素的影响,因此精度很低,不能满足工业机器视觉的要求。为了使相机模型能高精度的反应相机的实际成像过程,需要再针孔成像模型的基础上考虑镜头畸变等的因素。 图1 针孔成像 基于针孔成像原理建立的相机的成像模型,如下图所示。在相机的成像模型中,包含有几个坐标系分别是世界坐标系、相机坐标系、图像坐标系,相机的成像过程的数学模型就是目标点在这几个坐标系中的转化过程。 图2 针孔成像模型 (1)世界坐标系(X w,Y w,Z w),就是现实坐标系,是实际物体在现实世界中的数学描述,是一个三维的坐标空间。 (2)摄像机坐标系(X c, Y c),以针孔相机模型的聚焦中心为原点,以摄像机光学轴线为Z c轴 (3)图像坐标系:分为图像像素坐标系和图像物理坐标系 为了便于数学描述将图像平面移动到针孔与世界坐标系之间。如下图所示。

图3 将相机平面移至针孔与目标物体之间后的模型 1.2 坐标系间转换 从世界坐标系到相机坐标系: P(X c ,Y c ,Z c )=R(α,β,γ)?P(X w ,Y w ,Z w )+T 每一个世界坐标的对象都可以通过旋转和平移转移到相机坐标系上。将目标点旋转θ角度,等价于将坐标系方向旋转θ。如下图所示,是二维坐标的旋转变换,对于三维坐标而言,旋转中绕某一个轴旋转,原理实际与二维坐标旋转相同。如果,世界坐标分别绕X ,Y 和Z 轴旋转α,β,γ,那么旋转矩阵分别为R (α),R (β),R (γ) 图4 坐标旋转原理 R (α)=[10 00cosα ?sinα0sinαcosα] (1-1) R (β)=[cosβ 0sinβ0 10?sinβ 0cosβ ] (1-2)

工业相机标定深度解析

工业相机标定深度解析 机器视觉的基本任务之一是从摄像机获取图像信息并计算三维空间中物体的几何信息,以由此重建和识别物体。而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数。在大多数条件下,这些参数必须通过实验与计算才能得到,这个过程被称为摄像机定标(或称为标定)。标定过程就是确定摄像机的几何和光学参数,以及摄像机相对于世界坐标系的方位。由于标定精度的大小,直接影响着计算机视觉(机器视觉)的精度。因此,只有做好了摄像机标定工作,后续工作才能正常展开,可以说,提高标定精度也是当前科研工作的重要方面。 摄像机通过成像透镜将三维场景投影到摄像机二维像平面上,这个投影可用成像变换(即摄像机成像模型)来描述。摄像机成像模型分为线形模型和非线性模型。针孔成像模型就属于线形摄像机模型,本文就讨论在这种模型下,某空间点与其图像投影点在各种坐标系下的变换关系。 总的来说,摄像机标定可以分为传统的摄像机标定方法和摄像机自标定方法两大类。传统摄像机标定的基本方法是在一定的摄像机模型下,通过对特定标定参照物进行图像处理,并利用一系列数学变换公式计算及优化,来求取摄像机模型内部参数和外部参数。然而,该方法在场景未知和摄像机任意运动的一般情况下,其标定很难实现。20世纪90年代初,Faugeras,Luong,Maybank等人首次提出了摄像机自标定方法。这种自标定法利用摄像机本身参数之间的约束关系来标定,而与场景和摄像机的运动无关,所以更为灵活。 一、传统标定方法 传统的摄像机标定方法按照标定参照物与算法思路可以分成若干类,如基于3D立体靶标的摄像机标定、基于2D平面靶标的摄像机标定、以及基于径向约束的摄像机标定等。维视图像公司的CCAS双目标定系统运用的就是传统标定方法。

相关主题