fanfuhan OpenCV 教學099 ~ opencv-099-SIFT特徵提取之描述子生成 比對/匹配 已知對象 定位/標記
fanfuhan OpenCV 教學099 ~ opencv-099-SIFT特徵提取之描述子生成 比對/匹配 已知對象 定位/標記
資料來源: https://fanfuhan.github.io/
https://fanfuhan.github.io/2019/05/16/opencv-099/
GITHUB:https://github.com/jash-git/fanfuhan_ML_OpenCV
SIFT特徵提取是圖像特徵提取中最經典的一個算法,歸納起來SIFT特徵提取主要有如下幾步:
△構建高斯多尺度金字塔
△關鍵點查找/過濾與精準定位
△窗口區域角度方向直方圖
△描述子生成
C++
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>
using namespace cv;
using namespace cv::xfeatures2d;
using namespace std;
void find_known_object(Mat &box, Mat &box_scene);
int main(int argc, char** argv) {
Mat box = imread("D:/images/box.bmp");
Mat scene = imread("D:/images/scene.jpg");
imshow("box image", box);
imshow("scene image", scene);
find_known_object(box, scene);
//Mat gray;
//cvtColor(src, gray, COLOR_BGR2GRAY);
auto detector = SIFT::create();
vector<KeyPoint> keypoints_box, keypoints_scene;
Mat descriptor_box, descriptor_scene;
detector->detectAndCompute(box, Mat(), keypoints_box, descriptor_box);
detector->detectAndCompute(scene, Mat(), keypoints_scene, descriptor_scene);
Ptr<FlannBasedMatcher> matcher = FlannBasedMatcher::create();
vector<DMatch> matches;
matcher->match(descriptor_box, descriptor_scene, matches);
Mat dst;
drawMatches(box, keypoints_box, scene, keypoints_scene, matches, dst);
imshow("match-demo", dst);
waitKey(0);
return 0;
}
Python
"""
SIFT特征提取 – 描述子生成
"""
import cv2 as cv
box = cv.imread("D:/images/box.png")
box_in_sence = cv.imread("D:/images/box_in_scene.png")
cv.imshow("box", box)
cv.imshow("box_in_sence", box_in_sence)
# 创建sift特征检测器
sift = cv.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(box,None)
kp2, des2 = sift.detectAndCompute(box_in_sence,None)
# 暴力匹配
bf = cv.DescriptorMatcher_create(cv.DescriptorMatcher_BRUTEFORCE)
matches = bf.match(des1,des2)
# 绘制匹配
matches = sorted(matches, key = lambda x:x.distance)
result = cv.drawMatches(box, kp1, box_in_sence, kp2, matches[:15], None)
cv.imshow("orb-match", result)
cv.waitKey(0)
cv.destroyAllWindows()