OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
楼主: guvcolie

【代码】单目摄像机标定程序_分享

[复制链接]
 楼主| 发表于 2013-5-22 08:46:22 | 显示全部楼层

【代码】单目摄像机标定程序_分享

您好!我主要目的是单目测量路面的两点的距离,所以我想实现两幅图点的匹配,最后利用得到匹配点移动的像素距离转化成世界坐标系下的物理距离。先是标定我求出了内外参数,以及旋转平移矩阵等等,接下来我是harris目标图的边缘再提取角点并亚像素精度,然后、用Lucas-Kanade进行匹配,计算出两幅图像间匹配点的像素移动距离,然后呢?如何重建出这两点之间的物理距离?它们之间的物理换算关系式如何的?
没看到相关函数,老师请指点,有程序当然是最好,没有也请把思路给我讲下,小妹在此谢过!
我给你梳理一下思路你就明白了
你现在想计算两点之间的物理坐标,你只要计算出三个点的空间三维坐标就可以了啊,即(x1,y1,z1),(x2,y2,z2),所以现在关键就是求空间坐标
对于行对准图像,直接有公式就可以计算出来
X=-(x-Cx)*Tx/d;
Y=-(y-Cy)*Tx/d;
Z=-fTx/d;
其中x,y分别是左图像中标志点的横纵坐标,Cx,Cy分别是左目图像中心点的横纵坐标,Tx是立体标定是计算出来的两相机水平方向距离,d是视差。
这样就能计算出来了!
回复 支持 反对

使用道具 举报

发表于 2013-6-5 12:58:08 | 显示全部楼层

【代码】单目摄像机标定程序_分享

楼主好,现在正在用opencv做双目的标定,也正在看LZ的代码,有几个问题想请教一下
1 我的相机位置是垂直放置的,就是水平放置一个,竖直放置一个,视场也很小,3mmX4mm的视场,标定板是自己买的,上面有很多圆点类型的,我这种情况,LZ的程序还能用吗?
2 因为工作台是水平的,标定板也水平放置,水平的那个相机不能拍到标定板,这种情况只能一次标定一个相机,然后再计算两个相机之间的旋转矩阵和平移矩阵,不知道思路对不对,望楼主指点
现在正在研读LZ的程序中,希望与楼主交流,QQ是845905707~~谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2013-6-5 16:45:59 | 显示全部楼层

【代码】单目摄像机标定程序_分享

我是本帖贴主,我自己写了一个双目立体标定的代码,效果比较好,应用图如下



如果有需要的请留言,如果需要的人不多的话我就不写在帖子上了
楼主好人啊!最近在学习立体视觉,不知道能不能把双目标定的程序发一份学习一下?
QQ邮箱1040383255@qq.com
十分感谢!
回复 支持 反对

使用道具 举报

发表于 2013-6-5 23:13:44 | 显示全部楼层

【代码】单目摄像机标定程序_分享

楼主你好:能否给我发一份双目标定的程序,邮箱845905707@qq.com,3Q啦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-6 08:50:38 | 显示全部楼层

【代码】单目摄像机标定程序_分享

[quote="guvcolie":c18wgdb1]我是本帖贴主,我自己写了一个双目立体标定的代码,效果比较好,应用图如下



如果有需要的请留言,如果需要的人不多的话我就不写在帖子上了
楼主好人啊!最近在学习立体视觉,不知道能不能把双目标定的程序发一份学习一下?
QQ邮箱1040383255@qq.com
十分感谢![/quote:c18wgdb1]
其实立体标定的程序很简单,如果调用opencv自带的函数的话只需要在单目标定的基础上加几行代码就可以了:

CvSize imageSize = cvSize (1024,768);

CvMat * R = cvCreateMat (3,3,CV_64FC1); //旋转矩阵
CvMat * T = cvCreateMat (3,1,CV_64FC1); //平移矩阵

CvMat * object_points = (CvMat *) cvLoad ("Object_points.xml"); //以下将单目标定的结果矩阵调入,用作立体标定
CvMat * left_points = (CvMat *) cvLoad ("Left_points.xml");
CvMat * right_points = (CvMat *) cvLoad ("Right_points.xml");
CvMat * counts = (CvMat *) cvLoad ("Counts.xml");
CvMat * left_intrinsic = (CvMat *) cvLoad ("Left_intrinsic.xml");
CvMat * left_distortion = (CvMat *) cvLoad ("Left_distortion.xml");
CvMat * right_intrinsic = (CvMat *) cvLoad ("Right_intrinsic.xml");
CvMat * right_distortion = (CvMat *) cvLoad ("Right_distortion.xml");

cvStereoCalibrate ( object_points, left_points, right_points, counts, //立体标定
left_intrinsic, left_distortion,
right_intrinsic, right_distortion,
imageSize,
R, T, 0, 0,
cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
CV_CALIB_FIX_ASPECT_RATIO+CV_CALIB_FIX_PRINCIPAL_POINT+CV_CALIB_SAME_FOCAL_LENGTH
);

其中object_points, left_points, right_points, counts,left_intrinsic, left_distortion,
right_intrinsic, right_distortion,都是单目标定程序最后输出的矩阵,将这些矩阵作为参数传入cvStereoCalibrate函数中,就可以计算出两摄像机之间的旋转、平移关系了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-6 08:52:15 | 显示全部楼层

【代码】单目摄像机标定程序_分享

楼主你好:能否给我发一份双目标定的程序,邮箱845905707@qq.com,3Q啦
回复同上!
回复 支持 反对

使用道具 举报

发表于 2013-6-6 17:33:46 | 显示全部楼层

【代码】单目摄像机标定程序_分享

知道了,谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2013-6-15 17:12:28 | 显示全部楼层

【代码】单目摄像机标定程序_分享

真是好心人哪
回复 支持 反对

使用道具 举报

发表于 2013-7-9 15:45:05 | 显示全部楼层

【代码】单目摄像机标定程序_分享

我用第二页的那个源码在qt里跑的,opencv2.4.1,拍了5张,有生成2个矩阵内参的xml文件,但是后面标定时一用cvremap,程序就直接崩掉了~这个可能是什么原因?会不会是棋盘图的要求和我所拍的不符合,所以输入有误?或者有什么别的可能性?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-16 11:36:49 | 显示全部楼层

【代码】单目摄像机标定程序_分享

我用第二页的那个源码在qt里跑的,opencv2.4.1,拍了5张,有生成2个矩阵内参的xml文件,但是后面标定时一用cvremap,程序就直接崩掉了~这个可能是什么原因?会不会是棋盘图的要求和我所拍的不符合,所以输入有误?或者有什么别的可能性?
你好! 你能把你的问题再详细的说明一下吗?  5张标定图片肯定是精度不够的  至少20+   
而且你生成的2个xml是什么文件,文件中具体的内容有什么,最好截个图给我看看,这样我才能回答你的问题
现在我只能是猜的节奏了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-5-10 16:09 , Processed in 0.009090 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表