我使用opencv2.3.1來檢測圖像中的關鍵點SIFT。但是我發現在檢測結果中有重複點。即有兩個具有相同座標(以像素爲單位)的關鍵點,但是它們的對應描述符是非常不同的。以下代碼顯示了SIFT提取過程。我認爲人們應該熟悉使用的「box.png」。所以任何有興趣的人都可以嘗試下面的代碼,看看你是否和我有同樣的問題。重複篩選關鍵點在單個圖像
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/features2d/features2d.hpp"
#include <iostream>
int main()
{
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("SIFT");
cv::Ptr<cv::DescriptorExtractor> extractor = cv::DescriptorExtractor::create("SIFT");
cv::Mat im = cv::imread("box.png", CV_LOAD_IMAGE_COLOR);
std::vector<cv::KeyPoint> keypoints;
cv::Mat descriptors;
detector->detect(im, keypoints);
extractor->compute(im,keypoints,descriptors);
int duplicateNum = 0;
for (int i=0;i<keypoints.size();i++)
{
for (int j=i+1;j<keypoints.size();j++)
{
float dist = abs((keypoints[i].pt.x-keypoints[j].pt.x))+abs((keypoints[i].pt.y-keypoints[j].pt.y));
if (dist == 0)
{
cv::Mat descriptorDiff = descriptors.row(i)-descriptors.row(j);
double diffNorm = cv::norm(descriptorDiff);
std::cout<<"keypoint "<<i<<" equal to keypoint "<<j<<" descriptor distance "<<diffNorm<<std::endl;
duplicateNum++;
}
}
}
std::cout<<"Total keypoint: "<<keypoints.size()<<", duplicateNum: "<<duplicateNum<<std::endl;
return 1;
}
是的,這是真實的;但沒有錯?或者讓我們說這是否會導致在順序圖像/幀中找到匹配的問題? –
@farzin這是對的。爲了提高SIFT點的穩健性,作者補充說。 – vancexu
當重複指向同一地點時,爲什麼它應該算作健壯性? –