概念網上描述的很詳細,這裡簡單說一下
總的來說該演算法比surf還要快,而且準確率也很不錯。
主體部分來自高翔的視覺slam14講的**,在開頭加入了攝像頭讀取的**替換掉固定的演示。這裡用雙目攝像頭來進行匹配,實際上視覺里程計採用單目即可。
#include #include #include #include #include "opencv2/features2d/features2d.hpp"
#include #include using namespace cv;
using namespace std;
int main()
//將攝像頭從640*480改成320*240,速度從200ms提公升至50ms
cap1.set(cv_cap_prop_frame_width, 320);
cap1.set(cv_cap_prop_frame_height, 240);
cap2.set(cv_cap_prop_frame_width, 320);
cap2.set(cv_cap_prop_frame_height, 240);
//namedwindow("video", 1);
//namedwindow("video", 2);
//namedwindow("pts", 3);
//mat frame;
mat img_1;
mat img_2;
while (1)
//初始化
clock_t starttime, endtime;
starttime = clock();
ptrorb = orb::create(500, 1.2f, 8, 31, 0, 2, orb::harris_score, 31, 20);//均為預設引數
vectorkeypoints_1, keypoints_2;
mat descriptors_1, descriptors_2;
//orb檢測角點
orb->detect(img_1, keypoints_1);
orb->detect(img_2, keypoints_2);
if (keypoints_1.size() == 0 || keypoints_2.size() == 0)
//計算描述子
orb->compute(img_1, keypoints_1, descriptors_1);
orb->compute(img_2, keypoints_2, descriptors_2);
//匹配特徵點,hamming距離
vectormatches;
bfmatcher matcher(norm_hamming);
matcher.match(descriptors_1, descriptors_2, matches);
//篩選匹配點
double min_dist = matches[0].distance, max_dist = matches[0].distance;
for (int i = 0; i < descriptors_1.rows; i++)
printf("max: %f\n", max_dist);
printf("min: %f\n", min_dist);
//當描述子之間的距離大於兩倍的最小距離時,即認為匹配有誤.但有時候最小距離會非常小,設定乙個經驗值30作為下限.
std::vector< dmatch > good_matches;
for (int i = 0; i < descriptors_1.rows; i++)
}endtime = clock();
cout << "totle time : " << (double)(endtime - starttime) / clocks_per_sec << "s" << endl;
printf("goodmatches number:%d\n", good_matches.size());
//-- 第五步:繪製匹配結果
/*mat img_match;
mat img_goodmatch;
drawmatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_match);
drawmatches(img_1, keypoints_1, img_2, keypoints_2, good_matches, img_goodmatch);
imshow("所有匹配點對", img_match);
imshow("優化後匹配點對", img_goodmatch);
SLAM前端(里程計一) ORB特徵點提取
orb特徵 fast 描述子,fast判斷該點是不是特徵點,描述子計算該特徵點的方向資訊。1 fast角點 1 fast規則 如下圖,遍歷每個畫素點,檢測在畫素點附近的圓形視窗上的16個畫素的灰度,如果有n個連續點都比中心畫素的灰度大或者小的話,這樣的中心點就是fast角點。n可以是12或者9。2 ...
里程計 推算定位與視覺里程計
以下內容翻譯自wiki百科。里程計是一種利用從移動感測器獲得的資料來估計物體位置隨時間的變化而改變的方法。該方法被用在許多種機械人系統 輪式或者腿式 上面,來估計,而不是確定這些機械人相對於初始位置移動的距離。這種方法對由速度對時間積分來求得位置的估計時所產生的誤差十分敏感。快速 精確的資料採集,裝...
里程計 推算定位與視覺里程計
以下內容翻譯自wiki百科。里程計是一種利用從移動感測器獲得的資料來估計物體位置隨時間的變化而改變的方法。該方法被用在許多種機械人系統 輪式或者腿式 上面,來估計,而不是確定這些機械人相對於初始位置移動的距離。這種方法對由速度對時間積分來求得位置的估計時所產生的誤差十分敏感。快速 精確的資料採集,裝...