CV,SLAM学习笔记(给自己看的)
Homograph求解
①在Homograph求解中,有两种方法:
第一种方法就是将H33设为1,去求剩下的八个元素,转载图片:
第二种方法就是直接求9个元素,同时满足约束:||H|| = 1,展开第二种方法继续写:
转载于:
https://blog.youkuaiyun.com/lyhbkz/article/details/82254893
c++实现:
/*
|x2| |H11 H12 H13| |x1|
|y2|=|H21 H22 H23| * |y1|
|1 | |H31 H32 H33| |1 |
*/
int PicturePoints = board_size.height * board_size.width; //54
int PointVec_xy = 2*PicturePoints;//54*2 =108
vector<Mat> Aall; //装了每幅图像的a
for(int i = 0; i < image_count; i++)
{
Mat a = Mat(PointVec_xy,9,CV_32FC1,Scalar::all(1));
/* |a1| 1
|a2| 2
a = |...| ..
|a1| 107
|a2| 108
*/
for(int j = 0; j < PicturePoints; j++)
{
/*
-H11x1-H12y1-H13+H31x1x2+H32x2y2+H33x2
-H21x1-H22y1-H23+H31y2x1+H32y2y1+H33y2
a * h = 0
h = (H11, H12, H13, H21, H22, H23, H31, H32, H33)T
a1 = (-x1, -y1, -1, 0, 0, 0, x1x2, x2y1, x2)
a2 = ( 0, 0, 0, -x1, -y1, -1, y2x1, y2y1, y2)
*/
Mat a1 = Mat(1,9,CV_32FC1,Scalar::all(1)); //a1
Mat a2 = Mat(1,9,CV_32FC1,Scalar::all(1)); //a2
a1.at<float>(0,0) = -xy1[i][j].x;
a1.at<float>(0,1) = -xy1[i][j].y;
a1.at<float>(0,2) = -1;
a1.at<float>(0,3) = 0;
a1.at<float>(0,4) = 0;
a1.at<float>(0,5) = 0;
a1.at<float>(0,6) = xy1[i][j].x*uv1[i][j].x;
a1.at<float>(0,7) = uv1[i][j].x*xy1[i][j].y;
a1.at<float>(0,8) = uv1[i][j].x;
a2.at<float>(0,0) = 0;
a2.at<float>(0,1) = 0;
a2.at<float>(0,2) = 0;
a2.at<float>(0,3) = -xy1[i][j].x;
a2.at<float>(0,4) = -xy1[i][j].y;
a2.at<float>(0,5) = -1;
a2.at<float>(0,6) = uv1[i][j].y*xy1[i][j].x;
a2.at<float>(0,7) = uv1[i][j].y*xy1[i][j].y;
a2.at<float>(0,8) = uv1[i][j].y;
//第j个点的a_x,a_y放进a中
a1.copyTo(a.row(j)); // a的第0行、第1行、第2行
a2.copyTo(a.row(PointVec_xy-1-j)); //108-0-1 a的第107行、第106行、第105行
}
Aall.push_back(a);//每幅图片中的a都放到Aall这个大容器里
}
//求解H矩陣 : a * H = 0
for(int i = 0; i < image_count; i++)
{
Mat H_col = Mat(9,1,CV_32FC1,Scalar::all(0));
Mat H3x3 = Mat(3,3,CV_32FC1,Scalar::all(0));
SVD::solveZ(Aall[i],H_col); //奇异值分解
H3x3.at<float>(0,0) = H_col.at<float>(0,0);
H3x3.at<float>(0,1) = H_col.at<float>(1,0);
H3x3.at<float>(0,2) = H_col.at<float>(2,0);
H3x3.at<float>(1,0) = H_col.at<float>(3,0);
H3x3.at<float>(1,1) = H_col.at<float>(4,0);
H3x3.at<float>(1,2) = H_col.at<float>(5,0);
H3x3.at<float>(2,0) = H_col.at<float>(6,0);
H3x3.at<float>(2,1) = H_col.at<float>(7,0);
H3x3.at<float>(2,2) = H_col.at<float>(8,0);
H.push_back(H3x3);
程序实现转载于:
https://blog.youkuaiyun.com/weixin_38907150/article/details/86622175
②矩阵二范数实现:
float value = (double) norm(m2,NORM_L2);