在进行图像预处理之后可得到左右图所有圆的圆心
以vector的格式储存
由相机标定可得,左右相机的内参矩阵,R,t向量,此时得到的是旋转向量,需要转化为旋转矩阵,采用罗德里格斯公式
可由R,t矩阵求得本质矩阵和基础矩阵
其中需要获得t的反对称矩阵t_x。
Mat R = (Mat_<double>(3, 1) << 0.001903323, 0.614913706, -0.004505512); //旋转向量
Mat R_matrix(3, 3, CV_8UC1);//旋转矩阵
Rodrigues(R, R_matrix);//将旋转向量转化为旋转矩阵
Mat t = (Mat_<double>(3, 1) << -178.429272275, 0.955715978, 55.452245367);//移动向量
Mat t_x = (Mat_<double>(3, 3) <<
0, -t.at<double>(2, 0), t.at<double>(1, 0),
t.at<double>(2, 0), 0, -t.at<double>(0, 0),
-t.at<double>(1, 0), t.at<double>(0, 0), 0); //t的反对称矩阵
Mat kl = (Mat_<double>(3, 3) << 3705.036621094, 0, 1249.436523438,
0, 3704.723388672, 1053.494995117,
0, 0, 1);//左相机参数
Mat kr = (Mat_<double>(3, 3) << 3701.171386719, 0, 1279.476196289,
0, 3701.118164063, 1056.655151367,
0, 0, 1);//右相机参数
Mat kl_1, kr_1;
invert(kl, kl_1, DECOMP_SVD);//左相机矩阵的逆
invert(kr, kr_1, DECOMP_SVD);//右相机矩阵的逆
//计算基础矩阵
Mat fundamental_matrix;
fundamental_matrix = kr_1.t()*t_x*R_matrix*kl_1;
得到基础矩阵之后,可求极线
计算对应点的外极线epilines是一个三元组(a,b,c),表示点在另一视图中对应的外极线ax+by+c=0;
vector<Vec<float, 3>> epilines1, epilines2;//两条极线
computeCorrespondEpilines(draw_cir_l, 1, fundamental_matrix, epilines1);
computeCorrespondEpilines(draw_cir_r, 2, fundamental_matrix, epilines2);
通俗来说,直线约束就是点与直线的对应。当我们在左右两图找到特征点后,我们要判断哪两个特征点是相匹配的,此时可以借助于极线约束判断,以此来确定它是同一个空间点在两个成像平面上的投影
即pl在品后面Ir上的点一定在极线Lprer上
极线绘制:
绘制外极线的时候,选择两个点,一个是x=0处的点,一个是x为图片宽度处
line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0);
由极线可知
pt1=Point(0, -epilines2[i][2] / epilines2[i][1]);
pt2=Point(g_src_l.cols, -(epilines2[i][2] + epilines2[i][0] * g_src_l.cols) / epilines2[i][1])