三维重构学习笔记(3):坚实的后盾 OpenCV3
程序员文章站
2022-03-16 17:44:11
...
三维重构学习笔记(3):坚实的后盾+OpenCV3
前面两篇笔记分别记录了关于三维重构中,有关相机标定、SFM流程的问题。除了公式的推倒和理解,仿真时始终仰仗OpenCV3大法,为了以后学习使用方便,把用到的函数总结一下。
我的代码参考 aipiano的代码,连接都在他对应的博客下面
1、相机标定函数 calibrateCamera()
调用相机标定函数之前需要findChessboardCorners(Mat 图片,Size 行列角点数,vector\<Point2f\> 图片上检测到角点)
寻找棋盘内角点,
然后调用find4QuadCornerSubpix(Mat 灰度图,vector\<Point2f\> 图片上检测到角点,Size 亚像素参数)
将内角点亚像素精确化
最后调用calibrateCamera(object_points角点实际世界坐标,image_points_seq图片检测到的亚像素角点,image_size图片尺寸,cameraMatrix内参矩阵,distCoeffs畸变系数,rvecsMat旋转向量,tvecsMat平移向量,0);
对相机进行标定。
标定完成后,可以根据标定所得矩阵(包括内参数矩阵、畸变系数、旋转平移矩阵等)调用projectPoints(tempPointSet,rvecsMat,tvecsMat,cameraMatrix,distCoeffs,image_points2重新估计获得的投影点);
将获得的投影点与对应图片的匹配点进行比较,获得标定误差。
2、特征提取SIFT相关函数
//建立SIFT
Ptr<Feature2D> sift = xfeatures2d::SIFT::create(0, 3, 0.04, 10);
vector<KeyPoint> key_points;
Mat descriptor;
//偶尔出现内存分配失败的错误
sift->detectAndCompute(image, noArray(), key_points, descriptor);
//匹配特征点
vector<vector<DMatch>> knn_matches;
BFMatcher matcher(NORM_L2);
matcher.knnMatch(query, train, knn_matches, 2);
3、本征矩阵计算
//计算本征矩阵
Mat E = findEssentialMat(p1, p2, focal_length, principle_point, RANSAC, 0.999, 1.0, mask);
//分解本征矩阵,获取相对变换,返回同时位于两个相机前方的点的数量
int pass_count = recoverPose(E, p1, p2, R, T, focal_length, principle_point, mask);
//根据图片中的点以以及这些点在空间的位置 求解变换矩阵:得到的是当前新加入的图片相对
solvePnPRansac(object_points, image_points, K, noArray(), r, T);
上一篇: 图片处理:对图片进行缩放
下一篇: SLAM