三維重構學習筆記(3):堅實的後盾 OpenCV3

三維重構學習筆記(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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章