基于MFC和OpenCV的摄像机定标与立体匹配测试程序

最近整理了一下这两年一直在用的摄像机定标与立体匹配测试程序,将代码进行了重构,界面也做了调整,分享出来方便有需要的朋友使用。当然我的编程能力有限,程序可能还有各种bug,请大家多多包涵。相关问题欢迎留言或email联系讨论,谢谢!

 

==================================================================================

源码下载

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:

在 StereoVisionDlg.cpp 文件的 OnBnClkRunCam() 函数里,
...
if (m_nCamCount == 1)
{
//打开第一个摄像头
...
上面的m_nCamCount == 1 就是 bug,需要改为m_nCamCount >= 1
这样应该就能同时打开两个摄像头了。

==========================================================

 

一、原始编译环境

Ÿ  Windows 7 64位旗舰版

Ÿ  OpenCV SVNv2.4.9

Ÿ  x64应用


二、编译修改说明(下载后必须按以下步骤根据你的本机环境调整设置,才能正常编译使用)

1.      双击 .sln文件打开解决方案

2.      在项目属性的VC++目录”中分别修改OpenCV相关的 include路径和 lib路径;directshow的路径使用了相对路径,不需要修改

3.      在“解决方案平台”中选择“win32”或“x64”,分别对应32位系统和64位系统



三、使用说明

1.      界面


红色:摄像头初始化区域;          绿色:图像基本处理区域;

蓝色:摄像头定标区域;              橙色:双目匹配计算区域;

2.       操作步骤

(1)     摄像头初始化

1)         选择拟打开的摄像头:

   当电脑接入多个摄像头时:A.从“选择左/右摄像头”下拉菜单中选择该视角应该对应的摄像头设备名称(序号);B. 注意不同视角的摄像头设备序号不能相同,若相同会弹出警告窗口。

   当电脑只有一个摄像头接入时:直接从“选择左摄像头”下拉菜单中选择摄像头设备名称(序号)。

2)         选择摄像头的分辨率:

   从“选择分辨率”下拉菜单中选择,目前有三种分辨率:640*480352*288320*240.

3)         启动摄像头:

   点击“启动摄像头”按钮,界面上各功能按钮生效,即可进行摄像头定标、双目匹配等操作。

   点击“关闭摄像头”按钮,可以重新调整摄像头的配置。

(2)     摄像机定标

1)         点击“默认设置”,加载默认参数和选项;

2)         按照实际需要调整相关参数和选项;

A.        棋盘角点数:nxny分别是棋盘上横向和纵向的角点个数,注意必须按照实际棋盘横向和纵向的最大角点数输入,否则会造成角点检测失败;

B.        棋盘方块大小:棋盘方块的实际大小,毫米为单位;

C.        棋盘检测次数:以10-20次为宜;

D.        双目校正缩放系数:取值范围为01,或者 -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.ymlcameraParams_right.yml)中加载摄像机参数,然后进行摄像机定标;如果加载失败,将弹出警告窗口;

J.          首先执行单目定标:在获取棋盘角点数据后,先调用cv::calibrate- Camera函数对左、右摄像机分别进行定标,获取摄像机内部参数,并将参数保存到 cameraParams_left/right.yml文件中。然后再执行双目定标(当电脑接入的摄像头数大于1个时);

K.         直接执行双目定标:在获取棋盘角点数据后,直接调用stereoCalibrate函数进行双目定标(当电脑接入的摄像头数大于1个时);定标结果保存到calib_paras.xml文件中。

注意:HIJ项是三选一的选项。

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的双目校正

==================================================================================

最近整理了一下这两年一直在用的摄像机定标与立体匹配测试程序,将代码进行了重构,界面也做了调整,分享出来方便有需要的朋友使用。当然我的编程能力有限,程序可能还有各种bug,请大家多多包涵。相关问题欢迎留言或email联系讨论,谢谢!

 

==================================================================================

源码下载

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:

在 StereoVisionDlg.cpp 文件的 OnBnClkRunCam() 函数里,
...
if (m_nCamCount == 1)
{
//打开第一个摄像头
...
上面的m_nCamCount == 1 就是 bug,需要改为m_nCamCount >= 1
这样应该就能同时打开两个摄像头了。

==========================================================

 

一、原始编译环境

Ÿ  Windows 7 64位旗舰版

Ÿ  OpenCV SVNv2.4.9

Ÿ  x64应用


二、编译修改说明(下载后必须按以下步骤根据你的本机环境调整设置,才能正常编译使用)

1.      双击 .sln文件打开解决方案

2.      在项目属性的VC++目录”中分别修改OpenCV相关的 include路径和 lib路径;directshow的路径使用了相对路径,不需要修改

3.      在“解决方案平台”中选择“win32”或“x64”,分别对应32位系统和64位系统



三、使用说明

1.      界面


红色:摄像头初始化区域;          绿色:图像基本处理区域;

蓝色:摄像头定标区域;              橙色:双目匹配计算区域;

2.       操作步骤

(1)     摄像头初始化

1)         选择拟打开的摄像头:

   当电脑接入多个摄像头时:A.从“选择左/右摄像头”下拉菜单中选择该视角应该对应的摄像头设备名称(序号);B. 注意不同视角的摄像头设备序号不能相同,若相同会弹出警告窗口。

   当电脑只有一个摄像头接入时:直接从“选择左摄像头”下拉菜单中选择摄像头设备名称(序号)。

2)         选择摄像头的分辨率:

   从“选择分辨率”下拉菜单中选择,目前有三种分辨率:640*480352*288320*240.

3)         启动摄像头:

   点击“启动摄像头”按钮,界面上各功能按钮生效,即可进行摄像头定标、双目匹配等操作。

   点击“关闭摄像头”按钮,可以重新调整摄像头的配置。

(2)     摄像机定标

1)         点击“默认设置”,加载默认参数和选项;

2)         按照实际需要调整相关参数和选项;

A.        棋盘角点数:nxny分别是棋盘上横向和纵向的角点个数,注意必须按照实际棋盘横向和纵向的最大角点数输入,否则会造成角点检测失败;

B.        棋盘方块大小:棋盘方块的实际大小,毫米为单位;

C.        棋盘检测次数:以10-20次为宜;

D.        双目校正缩放系数:取值范围为01,或者 -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.ymlcameraParams_right.yml)中加载摄像机参数,然后进行摄像机定标;如果加载失败,将弹出警告窗口;

J.          首先执行单目定标:在获取棋盘角点数据后,先调用cv::calibrate- Camera函数对左、右摄像机分别进行定标,获取摄像机内部参数,并将参数保存到 cameraParams_left/right.yml文件中。然后再执行双目定标(当电脑接入的摄像头数大于1个时);

K.         直接执行双目定标:在获取棋盘角点数据后,直接调用stereoCalibrate函数进行双目定标(当电脑接入的摄像头数大于1个时);定标结果保存到calib_paras.xml文件中。

注意:HIJ项是三选一的选项。

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的双目校正

==================================================================================

猜你喜欢

转载自blog.csdn.net/monk1992/article/details/83181251