//前几篇博客说了双目校正回顾一下代码
stereoCalibrate(objectPoints, image_leftPoints, image_rightPoints, intrinsic_left, distCoeffs_left, intrinsic_right, distCoeffs_right, s1, R_total, T_total, E, F);
printf("Starting Rectification\n");
stereoRectify(intrinsic_left, distCoeffs_left, intrinsic_right, distCoeffs_right, s1, R_total, T_total, R_L, R_R, P1, P2, Q, CALIB_ZERO_DISPARITY, -1, s1, &validROIL, &validROIR);
//这种校正方式,实现通过物点像点内参以及畸变矩阵求得两个相机相对的R,T
//再将R,T拆分成左右相机的r,t
//参考SLAM十四讲的解法,思路是先求出ORB匹配点(我上一篇博客有源码),通过匹配点,焦距f,光轴与成像面的交点坐标求出E,SVD方法分解E求出两个相机相对的R,T
//计算本质矩阵
Point2d principal_point(3251,249.7);//相机光心 标定值
double focal_lengh=521 ;//相机焦距
Mat essential_matrix;
essential_matrix=findEssentialMat(points1,points2,focal_lengh,principal_point);
cout<<"essential_matrix is"<<endl<<essential_matrix<<endl;
//从本质矩阵恢复旋转,平移
recoverPose(essential_matrix,points1,points2,R,t,focal_lengh,principal_point);
cout<<"R :"<<R<<endl;
cout<<"t is"<<t<<endl;
//先求ORB匹配点
oid find_feature_matches(const Mat &img_1, const Mat &img_2,
std::vector<KeyPoint> &keypoints_1,
std::vector<KeyPoint> &keypoints_2,
std::vector<DMatch> &matches) {
//-- 初始化
Mat descriptors_1, descriptors_2;
// used in OpenCV3
//FeatureDetector是虚类,通过定义FeatureDetector对象使用多种特征检测方法
Ptr<FeatureDetector> detector = ORB::create();
//DescriptorExtractor提取关键点的描述子基类
Ptr<DescriptorExtractor> descriptor = ORB::create();
//描述子匹配方式,此处是汉明距离
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
//-- 第一步:检测 Oriented FAST 角点位置
detector->detect(img_1, keypoints_1);
detector->detect(img_2, keypoints_2);
//-- 第二步:根据角点位置计算 BRIEF 描述子
descriptor->compute(img_1, keypoints_1, descriptors_1);
descriptor->compute(img_2, keypoints_2, descriptors_2);
//-- 第三步:对两幅图像中的BRIEF描述子进行匹配,使用 Hamming 距离
//match中存放匹配的描述子信息
vector<DMatch> match;
matcher->match(descriptors_1, descriptors_2