1
目標:通過使用Surf descriptors
和opencv 2.4.9
庫匹配斑點。衝浪特徵提取
算法:基於以下鏈接:Steps
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
using namespace cv;
void readme();
/** @function main */
int main(int argc, char** argv)
{
if(argc != 3)
{ readme(); return -1; }
Mat img_1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
Mat img_2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);
if(!img_1.data || !img_2.data)
{ std::cout<< " --(!) Error reading images " << std::endl; return -1; }
//-- Step 1: Detect the keypoints using SURF Detector
int minHessian = 400;
SurfFeatureDetector detector(minHessian);
std::vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect(img_1, keypoints_1);
detector.detect(img_2, keypoints_2);
//-- Draw keypoints
Mat img_keypoints_1; Mat img_keypoints_2;
drawKeypoints(img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
drawKeypoints(img_2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
//-- Show detected (drawn) keypoints
imshow("Keypoints 1", img_keypoints_1);
imshow("Keypoints 2", img_keypoints_2);
waitKey(0);
return 0;
}
/** @function readme */
void readme()
{ std::cout << " Usage: ./SURF_detector <img1> <img2>" << std::endl; }
結果關鍵點檢測:在下面的圖像的關鍵點的數目是非常高的,而不是許多是重要。如何選擇最能描述blob的關鍵點的最佳子集。除Surf之外還有更好的方法嗎?這些斑點是二進制
目前我不想加工這些圖像我想知道如何選擇最佳的keyPoints子集,你認爲可以得到相同結果的關鍵點越少TY – 2014-12-03 11:45:24
這取決於圖像,但較弱的關鍵點通常不太可靠,關鍵點較少會使模型選擇更加可靠/可靠。其他啓發式方法可能會將圖像分割爲平鋪並選擇每個平鋪N個關鍵點(以及可能來自整個圖像的剩餘K個最強關鍵點)。您也可以放棄接近相同的關鍵點,因爲它們通常表示有紋理的區域並且難以匹配。 – 2014-12-04 12:26:14