一、原理作用
ORB 原理(Oriented FAST and Rotated BRIEF):
特征點檢測:使用 FAST 算法檢測角點(關鍵點)。
方向計算:為每個關鍵點分配主方向,增強旋轉不變性。
特征描述:使用 BRIEF(快速二進制描述符),通過圖像灰度比較構造描述子。
描述子旋轉:將 BRIEF 描述子旋轉對齊主方向,增強旋轉魯棒性。
ORB作用:
提取圖像中穩定、重復性強的關鍵點;生成可用于圖像匹配、識別、跟蹤的緊湊二進制描述子。
應用場景:圖像匹配(如拼接、全景)、 SLAM / 視覺里程計(機器人/無人車定位)、物體識別與檢測、圖像配準與對齊、圖像檢索
二、實現效果
三、參考代碼
void demo(const cv::Mat& img1, const cv::Mat& img2, cv::Mat& outputImg) {if (img1.empty() || img2.empty()) {std::cerr << "[feature_matching] Error: Input images are empty." << std::endl;return;}cv::Ptr<cv::ORB> orb = cv::ORB::create();std::vector<cv::KeyPoint> kp1, kp2;cv::Mat desc1, desc2;orb->detectAndCompute(img1, cv::noArray(), kp1, desc1);orb->detectAndCompute(img2, cv::noArray(), kp2, desc2);if (desc1.empty() || desc2.empty()) {std::cerr << "[feature_matching] Warning: Descriptor computation failed." << std::endl;return;}cv::BFMatcher matcher(cv::NORM_HAMMING);std::vector<std::vector<cv::DMatch>> knn_matches;matcher.knnMatch(desc1, desc2, knn_matches, 2);std::vector<cv::DMatch> good_matches;for (const auto& m : knn_matches) {if (m.size() >= 2 && m[0].distance < 0.75f * m[1].distance) {good_matches.push_back(m[0]);}}cv::drawMatches(img1, kp1, img2, kp2, good_matches, outputImg);
}
//應用
void MainWindow::sltOrb()
{// 加載兩張灰度圖像cv::Mat img1 = cv::imread("img1.jpg", cv::IMREAD_GRAYSCALE);cv::Mat img2 = cv::imread("img2.jpg", cv::IMREAD_GRAYSCALE);cv::Mat output;// 調用封裝好的 ORB 特征匹配函數feature_matching::demo(img1, img2, output);// 顯示結果圖像if (!output.empty()) {cv::imshow("Feature Matching Result", output);cv::waitKey(0);}
}
歡迎關注我,一起交流!