先简单回顾一下计算机视觉的知识。这里研究生的摄像机模型都是针孔摄像机,摄像机的标定问题是CV领域的一个入门级的问题,初学摄像机标定时会被各种坐标系弄晕,这里再介绍一下,常提到的坐标系有四个:世界坐标系(Ow,以空间一点为原点)、摄像机坐标系(Oc以小孔即光心为原点)、图像物理坐标系(O1以像平面中心为原点)、图像像素坐标系(O以像平面左下角为原点)。这样再看相关资料的时候就不会混了吧,这里再介绍一篇张正友的摄像机定标办法的相关资料http://beidou841026.blog.163.com/blog/static/4629535201021731344572/
其参数分为内参数和外参数:内参数是摄像机坐标系和理想坐标系之间的关系(5个内参数,分别为α、β、u0、v0、θ);外参数表示摄像机在世界坐标系里的位置和方向(6个外参数,3个表示旋转R的角度,3个表示平移t)。
利用calibrateCamera函数可以得到这些内外参数,而calibrationMatrixValues可以得到摄像机投影透视方程的投影矩阵,composeRT可以合并两个旋转平移变换,computeCorrespondEpilines计算其他图像的相应epilines,convertPointsToHomogeneous把点从欧式空间转换到齐次空间,convertPointsFromHomogeneous把点从齐次空间变换到欧式空间,而函数convertPointsHomogeneous把上述两个函数功能综合到一起了,decomposeProjectionMatrix可以将矩阵分解,drawChessboardCorners获得检测棋盘的角,findChessboardCorners获得棋盘的内角点位置,findCirclesGrid得到圆圈光栅的中心,solvePnP实现物体位置的3维坐标和2维坐标之间的转换,solvePnPRansac利用RANSAC实现上述功能,findFundamentalMat计算两幅图像关联点的基础矩阵,findHomography找出两个平面的透视变换,estimateAffine3D计算两个3维点集的理想仿射变换,filterSpeckles可以过滤不同块的小斑点,getOptimalNewCameraMatrix得到自由比例参数的新摄像机矩阵,initCameraMatrix2D得到3D到2D的初始化的摄像机矩阵,matMulDeriv计算矩阵的偏导数,projectPoints将3D坐标投影到图像平面上,reprojectImageTo3D根据一组差异图像重建3D空间,RQDecomp3x3计算3x3矩阵的RQ分解,Rodrigues实现旋转矩阵和旋转向量之间的转换,steroCalibrate校准立体摄像机,steroRectify是对校准过的摄像机计算修正变换,stereoRectifyUncalibrated是对未校准过的摄像机计算修正变换
还包括了BM块匹配算法类StereoBM、SGBM块匹配算法类StereoSGBM类
==================================================================================
源码下载:
Github: https://github.com/yuhuazou/StereoVision (2014-05-05 更新,新增StereoVar算法)
微盘: http://vdisk.weibo.com/s/sEby0 (已修正只能打开一个摄像头的bug)
CSDN资源:http://download.csdn.net/detail/chenyusiyuan/4702621 (有bug,只能打开一个摄像头)
==================================================================================
bug#01:
{
//打开第一个摄像头
...
一、原始编译环境
Ÿ Windows 7 64位旗舰版
Ÿ OpenCV SVN(v2.4.9)
Ÿ x64应用
二、编译修改说明(下载后必须按以下步骤根据你的本机环境调整设置,才能正常编译使用)
1. 双击 .sln文件打开解决方案
2. 在项目属性的“VC++目录”中分别修改OpenCV相关的 include路径和 lib路径;directshow的路径使用了相对路径,不需要修改
3. 在“解决方案平台”中选择“win32”或“x64”,分别对应32位系统和64位系统
三、使用说明
1. 界面
红色:摄像头初始化区域; 绿色:图像基本处理区域;
蓝色:摄像头定标区域; 橙色:双目匹配计算区域;
2. 操作步骤
(1) 摄像头初始化
1) 选择拟打开的摄像头:
Ÿ 当电脑接入多个摄像头时:A.从“选择左/右摄像头”下拉菜单中选择该视角应该对应的摄像头设备名称(序号);B. 注意不同视角的摄像头设备序号不能相同,若相同会弹出警告窗口。
Ÿ 当电脑只有一个摄像头接入时:直接从“选择左摄像头”下拉菜单中选择摄像头设备名称(序号)。
2) 选择摄像头的分辨率:
Ÿ 从“选择分辨率”下拉菜单中选择,目前有三种分辨率:640*480、352*288、320*240.
3) 启动摄像头:
Ÿ 点击“启动摄像头”按钮,界面上各功能按钮生效,即可进行摄像头定标、双目匹配等操作。
Ÿ 点击“关闭摄像头”按钮,可以重新调整摄像头的配置。
(2) 摄像机定标
1) 点击“默认设置”,加载默认参数和选项;
2) 按照实际需要调整相关参数和选项;
A. 棋盘角点数:nx和ny分别是棋盘上横向和纵向的角点个数,注意必须按照实际棋盘横向和纵向的最大角点数输入,否则会造成角点检测失败;
B. 棋盘方块大小:棋盘方块的实际大小,毫米为单位;
C. 棋盘检测次数:以10-20次为宜;
D. 双目校正缩放系数:取值范围为0至1,或者 -1。具体含义参见:http://blog.csdn.net/chenyusiyuan/article/details/8131496
E. 棋盘图像来源:默认为“从摄像机”,也可选择“从本地图片”;若选择“从本地图片”读入,在执行定标时,将弹出对话框分别选择左视图图像和右视图图像;注意左、右视图的图像数均需要至少4张;当左、右视图图像数与棋盘检测次数不一致时,取三者最小值为准;
F. 双目校正算法:默认为“BOUGUET”,也可选择“HARTLEY”;不过“HARTLEY”方法的双目校正尚未进行测试,可能存在bug;
G. 标志位选择:各标志位的设置请参见OpenCV相关文档;
FPP: CV_CALIB_FIX_PRINCIPAL_POINT
UIG: CV_CALIB_USE_INTRINSIC_GUESS
FAR: CV_CALIB_FIX_ASPECT_RATIO
ZTD: CV_CALIB_ZERO_TANGENT_DIST
SFL: CV_CALIB_SAME_FOCAL_LENGTH
FI: CV_CALIB_FIX_INTRINSIC
H. 读入角点坐标数据:如果曾进行过摄像机定标操作,程序文件夹内将保存有上一次操作的棋盘角点数据的文件(文件名为CornerData.yml)。点击该选项,将自动加载上一次操作的棋盘角点数据,跳过“棋盘角点检测”这一步,直接进行摄像机定标。如果文件夹内没有CornerData.yml文件或者文件读取失败,将弹出警告窗口,应检查该文件是否存在、或者不选择此项,重新进行棋盘角点检测;
I. 读入单目定标结果:将从本地文件(cameraParams_left.yml和cameraParams_right.yml)中加载摄像机参数,然后进行摄像机定标;如果加载失败,将弹出警告窗口;
J. 首先执行单目定标:在获取棋盘角点数据后,先调用cv::calibrate- Camera函数对左、右摄像机分别进行定标,获取摄像机内部参数,并将参数保存到 cameraParams_left/right.yml文件中。然后再执行双目定标(当电脑接入的摄像头数大于1个时);
K. 直接执行双目定标:在获取棋盘角点数据后,直接调用stereoCalibrate函数进行双目定标(当电脑接入的摄像头数大于1个时);定标结果保存到calib_paras.xml文件中。
注意:H、I、J项是三选一的选项。
L. 显示摄像机定标效果:如果仅接入一个摄像头,则显示单目定标后消除畸变的效果;否则显示双目定标后左右视图畸变消除和行对准的效果。
3) 点击“执行摄像机定标”,开始定标操作,程序将依次执行以下工作:
A. 棋盘角点检测
B. 单目定标
C. 双目定标
D. 双目校正
E. 显示定标效果
4) 点击“退出摄像机定标”,完成或中止定标操作,恢复摄像机正常显示。该按钮仅在“棋盘角点检测”和“显示定标效果”阶段有效。
(3) 双目匹配
1) 选择“双目匹配算法”:“BM”或“SGBM”,点击后将清零相关的参数;
2) 点击“默认配置”:载入所选算法的默认参数;
3) 视需要调整参数,可以在计算视差期间实时调整各项参数;
A. “参数设置”中各项参数的意义和取值请参见OpenCV相关文档;
B. 选择图像来源:“从摄像机”或“从本地图片”;
C. “双目校正”:点选后,将需要手动选择摄像机定标文件,然后程序将根据定标参数对图像进行校正,再进行双目匹配和视差计算。若不点选,则程序直接对原始的左右视图进行视差计算,这种情况一般用于从本地读取下载好的公共测试图像,这些公共测试图像一般都已经过标定和行对齐,可直接用于视差计算;
D. “三维点云”:点选后,将根据视差图生成三维点云,并检测距离最近的物体;但若读入的摄像机定标文件中记录的校正方法不是 BOUGUET 方法,则无法生成点云;
E. “保存画面”:点选后,将自动保存每帧左、右视图和视差图到本地;
F. “延时处理”:点选后,将在计算完每帧视图的视差图和三维点云后,延时一定时间,再进入下一帧的处理;延时时间默认为 5 秒;可自行调整;
G. “切换视图”:在“视差图”窗口中显示 彩色视差、灰度视差、环境俯视、环境侧视 图像;
H. “视场范围”:设置视场的宽度、高度和深度范围。
4) 点击“计算视差”,将执行如下操作:
A. 若选择“从本地图片”载入左右视图,则将弹出对话框分别选择左右视图图像,可单选或多选;
B. 若点选了“双目校正”,将弹出对话框,由用户选择双目摄像机标定参数文件(文件名一般为calib_paras.xml),程序将分析相关参数;
C. 程序进入循环,自动从本地或摄像机加载图像,进行双目匹配和视差计算等。
D. 如果点选了“生成点云”,程序将根据视差图生成三维点云,并检测出距离最近的物体,在界面中显示物体的相关信息。
5) 点击“停止计算”,退出双目匹配和视差计算操作,恢复摄像机正常显示。
(4) 帧处理测试
此处可进行各种简单的图像处理操作,目前有canny边缘检测、直方图平衡、颜色空间转换等。
四、其它
1、α=1的双目校正
2、 α=0的双目校正
3、α=-1的双目校正
==================================================================================
==================================================================================
源码下载:
Github: https://github.com/yuhuazou/StereoVision (2014-05-05 更新,新增StereoVar算法)
微盘: http://vdisk.weibo.com/s/sEby0 (已修正只能打开一个摄像头的bug)
CSDN资源:http://download.csdn.net/detail/chenyusiyuan/4702621 (有bug,只能打开一个摄像头)
==================================================================================
bug#01:
{
//打开第一个摄像头
...
一、原始编译环境
Ÿ Windows 7 64位旗舰版
Ÿ OpenCV SVN(v2.4.9)
Ÿ x64应用
二、编译修改说明(下载后必须按以下步骤根据你的本机环境调整设置,才能正常编译使用)
1. 双击 .sln文件打开解决方案
2. 在项目属性的“VC++目录”中分别修改OpenCV相关的 include路径和 lib路径;directshow的路径使用了相对路径,不需要修改
3. 在“解决方案平台”中选择“win32”或“x64”,分别对应32位系统和64位系统
三、使用说明
1. 界面
红色:摄像头初始化区域; 绿色:图像基本处理区域;
蓝色:摄像头定标区域; 橙色:双目匹配计算区域;
2. 操作步骤
(1) 摄像头初始化
1) 选择拟打开的摄像头:
Ÿ 当电脑接入多个摄像头时:A.从“选择左/右摄像头”下拉菜单中选择该视角应该对应的摄像头设备名称(序号);B. 注意不同视角的摄像头设备序号不能相同,若相同会弹出警告窗口。
Ÿ 当电脑只有一个摄像头接入时:直接从“选择左摄像头”下拉菜单中选择摄像头设备名称(序号)。
2) 选择摄像头的分辨率:
Ÿ 从“选择分辨率”下拉菜单中选择,目前有三种分辨率:640*480、352*288、320*240.
3) 启动摄像头:
Ÿ 点击“启动摄像头”按钮,界面上各功能按钮生效,即可进行摄像头定标、双目匹配等操作。
Ÿ 点击“关闭摄像头”按钮,可以重新调整摄像头的配置。
(2) 摄像机定标
1) 点击“默认设置”,加载默认参数和选项;
2) 按照实际需要调整相关参数和选项;
A. 棋盘角点数:nx和ny分别是棋盘上横向和纵向的角点个数,注意必须按照实际棋盘横向和纵向的最大角点数输入,否则会造成角点检测失败;
B. 棋盘方块大小:棋盘方块的实际大小,毫米为单位;
C. 棋盘检测次数:以10-20次为宜;
D. 双目校正缩放系数:取值范围为0至1,或者 -1。具体含义参见:http://blog.csdn.net/chenyusiyuan/article/details/8131496
E. 棋盘图像来源:默认为“从摄像机”,也可选择“从本地图片”;若选择“从本地图片”读入,在执行定标时,将弹出对话框分别选择左视图图像和右视图图像;注意左、右视图的图像数均需要至少4张;当左、右视图图像数与棋盘检测次数不一致时,取三者最小值为准;
F. 双目校正算法:默认为“BOUGUET”,也可选择“HARTLEY”;不过“HARTLEY”方法的双目校正尚未进行测试,可能存在bug;
G. 标志位选择:各标志位的设置请参见OpenCV相关文档;
FPP: CV_CALIB_FIX_PRINCIPAL_POINT
UIG: CV_CALIB_USE_INTRINSIC_GUESS
FAR: CV_CALIB_FIX_ASPECT_RATIO
ZTD: CV_CALIB_ZERO_TANGENT_DIST
SFL: CV_CALIB_SAME_FOCAL_LENGTH
FI: CV_CALIB_FIX_INTRINSIC
H. 读入角点坐标数据:如果曾进行过摄像机定标操作,程序文件夹内将保存有上一次操作的棋盘角点数据的文件(文件名为CornerData.yml)。点击该选项,将自动加载上一次操作的棋盘角点数据,跳过“棋盘角点检测”这一步,直接进行摄像机定标。如果文件夹内没有CornerData.yml文件或者文件读取失败,将弹出警告窗口,应检查该文件是否存在、或者不选择此项,重新进行棋盘角点检测;
I. 读入单目定标结果:将从本地文件(cameraParams_left.yml和cameraParams_right.yml)中加载摄像机参数,然后进行摄像机定标;如果加载失败,将弹出警告窗口;
J. 首先执行单目定标:在获取棋盘角点数据后,先调用cv::calibrate- Camera函数对左、右摄像机分别进行定标,获取摄像机内部参数,并将参数保存到 cameraParams_left/right.yml文件中。然后再执行双目定标(当电脑接入的摄像头数大于1个时);
K. 直接执行双目定标:在获取棋盘角点数据后,直接调用stereoCalibrate函数进行双目定标(当电脑接入的摄像头数大于1个时);定标结果保存到calib_paras.xml文件中。
注意:H、I、J项是三选一的选项。
L. 显示摄像机定标效果:如果仅接入一个摄像头,则显示单目定标后消除畸变的效果;否则显示双目定标后左右视图畸变消除和行对准的效果。
3) 点击“执行摄像机定标”,开始定标操作,程序将依次执行以下工作:
A. 棋盘角点检测
B. 单目定标
C. 双目定标
D. 双目校正
E. 显示定标效果
4) 点击“退出摄像机定标”,完成或中止定标操作,恢复摄像机正常显示。该按钮仅在“棋盘角点检测”和“显示定标效果”阶段有效。
(3) 双目匹配
1) 选择“双目匹配算法”:“BM”或“SGBM”,点击后将清零相关的参数;
2) 点击“默认配置”:载入所选算法的默认参数;
3) 视需要调整参数,可以在计算视差期间实时调整各项参数;
A. “参数设置”中各项参数的意义和取值请参见OpenCV相关文档;
B. 选择图像来源:“从摄像机”或“从本地图片”;
C. “双目校正”:点选后,将需要手动选择摄像机定标文件,然后程序将根据定标参数对图像进行校正,再进行双目匹配和视差计算。若不点选,则程序直接对原始的左右视图进行视差计算,这种情况一般用于从本地读取下载好的公共测试图像,这些公共测试图像一般都已经过标定和行对齐,可直接用于视差计算;
D. “三维点云”:点选后,将根据视差图生成三维点云,并检测距离最近的物体;但若读入的摄像机定标文件中记录的校正方法不是 BOUGUET 方法,则无法生成点云;
E. “保存画面”:点选后,将自动保存每帧左、右视图和视差图到本地;
F. “延时处理”:点选后,将在计算完每帧视图的视差图和三维点云后,延时一定时间,再进入下一帧的处理;延时时间默认为 5 秒;可自行调整;
G. “切换视图”:在“视差图”窗口中显示 彩色视差、灰度视差、环境俯视、环境侧视 图像;
H. “视场范围”:设置视场的宽度、高度和深度范围。
4) 点击“计算视差”,将执行如下操作:
A. 若选择“从本地图片”载入左右视图,则将弹出对话框分别选择左右视图图像,可单选或多选;
B. 若点选了“双目校正”,将弹出对话框,由用户选择双目摄像机标定参数文件(文件名一般为calib_paras.xml),程序将分析相关参数;
C. 程序进入循环,自动从本地或摄像机加载图像,进行双目匹配和视差计算等。
D. 如果点选了“生成点云”,程序将根据视差图生成三维点云,并检测出距离最近的物体,在界面中显示物体的相关信息。
5) 点击“停止计算”,退出双目匹配和视差计算操作,恢复摄像机正常显示。
(4) 帧处理测试
此处可进行各种简单的图像处理操作,目前有canny边缘检测、直方图平衡、颜色空间转换等。
四、其它
1、α=1的双目校正
2、 α=0的双目校正
3、α=-1的双目校正
==================================================================================
转自 http://blog.csdn.net/chenyusiyuan/article/details/8131496