福彩3的分布图:Features2d?

關鍵點檢測?

關鍵點描述?

關鍵點匹配?

代碼?

河北快三遗漏分布图 www.ainysi.com.cn 來自 opencv/samples/cpp/matcher_simple.cpp 的一個簡短的例子:

Mat img1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
Mat img2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);
if(img1.empty() || img2.empty())
{
    printf("Can't read one of the images\n");
    return -1;
}

// detecting keypoints
SurfFeatureDetector detector(400);
vector<KeyPoint> keypoints1, keypoints2;
detector.detect(img1, keypoints1);
detector.detect(img2, keypoints2);

// computing descriptors
SurfDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(img1, keypoints1, descriptors1);
extractor.compute(img2, keypoints2, descriptors2);

// matching descriptors
BruteForceMatcher<L2<float> > matcher;
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

// drawing the results
namedWindow("matches", 1);
Mat img_matches;
drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
imshow("matches", img_matches);
waitKey(0);

代碼分析?

將代碼分段分析

Mat img1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
Mat img2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);
if(img1.empty() || img2.empty())
{
    printf("Can't read one of the images\n");
    return -1;
}

讀入兩張圖像,并檢查讀入是否正確。

// detecting keypoints
FastFeatureDetector detector(15);
vector<KeyPoint> keypoints1, keypoints2;
detector.detect(img1, keypoints1);
detector.detect(img2, keypoints2);

首先,創建關鍵點檢測器的實例。所有的檢測器都繼承自抽象類 FeatureDetector ,但是構造函數是與算法相關的。每個檢測器的第一個參數一般用于控制關鍵點的數量和它們的穩定性。對不同的檢測器,這個參數的取值范圍是不同的(例如 FAST 的閾值為像素的亮度值之差,取值范圍一般位于 [0,40] 之間。 SURF 的閾值應用到圖像的Hessian,取值通常大于 100 )。所以在不確定的情況下,請使用默認值。

// computing descriptors
SurfDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(img1, keypoints1, descriptors1);
extractor.compute(img2, keypoints2, descriptors2);

這兒創建了一個描述子提取器的實例。大部分OpenCV描述子繼承自抽象類 DescriptorExtractor 。然后給每個關鍵點計算描述子。函數 DescriptorExtractor::compute 的輸出 Mat 包含描述子,第 i 行是 第 i 個關鍵點的描述特征。注意,這個函數會修改關鍵點向量,一些無描述子定義的關鍵點(一般為在圖像邊界上的關鍵點)將被移除。這個函數會使輸出的關鍵點和描述子保持一致(也就是關鍵點的數目等于描述子的數目)。

// matching descriptors
BruteForceMatcher<L2<float> > matcher;
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

現在我們獲取了兩副圖像的關鍵點的描述子,所以可以匹配它們了。首先創建一個匹配器,它可以從圖像1中采用窮舉法搜索圖像2中最相似的關鍵點,采用的相似度量為歐氏度量。馬氏距離和哈明(Hamming)距離也已被實現,可用于Brief描述子匹配。輸出向量 matches 包含匹配好的點的索引對。

// drawing the results
namedWindow("matches", 1);
Mat img_matches;
drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
imshow("matches", img_matches);
waitKey(0);

例子的最后一部分是將匹配結果可視化。

翻譯?

于仕琪 //www.ainysi.com.cn

Table Of Contents

Previous topic

操作圖像

Next topic

HighGUI

This Page