计算机视觉实验八实验报告附代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
一、实验目的或要求;
二、实验原理;
三、实验仪器设备及系统;
四、操作方法与实验步骤(相关流程图);
五、实验数据记录(截图)及处理;
六、实验结果分析及讨论;
一、实验题目
根据双目视图几何原理,计算双目视觉中的相机平行像面的变换。
二、实验原理
两摄像头之间的旋转矩阵和平移矩阵可以由下式求出:
其中,R为两摄像头间的旋转矩阵,T为两摄像头间的平移矩阵。R r为右摄像头经过张氏标定得到的相对标定物的旋转矩阵,T r为右摄像头通过张氏标定得到的相对标定物的平移向量。R l为左摄像头经过张氏标定得到的相对相同标定物的旋转矩阵,T l为左摄像头经过张氏标定得到的相对相同标定物的平移向量。
两个式子是可以通过数学代换推导来的。但玉米觉得对这样有明显物理意义并且空间过程简单的计算式。物理上的空间想象,比纯代数代换,要生动的多。并且有利于大家揣摩整个物理过程。
在玉米眼里,这两个式子是这样的:
对于R,首先用T把左摄像机坐标系平移到右摄像机坐标系上(即两坐标系远点重合)。然后在同一参考系下的两个旋转矩阵相乘,表示世界坐标先向右旋转到R r,再向左旋转R l。那么两次旋转后得到的旋转,就是有摄像机旋转到左摄像机所需的旋转矩阵R。
对于T,那就更容易理解了,先用R对左坐标系旋转一下,把左右两摄像机调成平行,然后直接平移向量相减,即得到。两摄像机之间的平移向量T。
上面求得的R和T就是立体标定得到的参数了。
那么运用的立体标定所得的参数了,下一步我们该做什么呢?答案是:立体校正。
在介绍立体校正的具体方法之前,让我们来看一下,为什么要进行立体校正?
因为当两个图像平面是完全共面行对准时,计算立体视差是最简单的。但是,在现实的双目立体视觉系统中,是不存在完全的共面行对准的两个摄像机图像平面的。所以我们要进行立体校正。立体校正的目的就是,把实际中非共面行对准的两幅图像,校正成共面行对准。如下面示意图所示。(共面行对准是指:两摄像机图像平面在同一平面上,且同一点投影到两个摄像机图像平面时,应该在两个像素坐标系的同一行)
四、算法步骤
1、设置迭代终止条件
2、设置object points, 形式为 (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
3、用arrays存储所有图片的object points 和 image points
4、对左右侧相机分别标定
5、进行双目相机标定
6、对立体校正
7、在对好的极线的图片上画上直线
五、运行结果
六、主要代码
// 仿射变换—平移,旋转,缩放,翻转,错切
#include
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char* argv) {
Mat src, dst;
src = imread("left01.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("原图片", CV_WINDOW_AUTOSIZE);
imshow("原图片", src);
Mat dst_warp, dst_warpRotateScale, dst_warpTransformation, dst_w arpFlip;
Point2f srcPoints[3];//原图中的三点,一个包含三维点(x,y)的数组,其中x、y是浮点型数
Point2f dstPoints[3];//目标图中的三点
//第一种仿射变换的调用方式:三点法
//三个点对的值,上面也说了,只要知道你想要变换后图的三个点的坐标,就可以实现仿射变换