저는 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;
}
예, 그렇습니다. 그러나 그것은 틀린 Itnt인가? 아니면 순차적 인 이미지/프레임에서 일치를 찾는 데 문제가 발생하지는 않습니까? –
@farzin 맞습니다. SIFT 포인트의 견고성을 향상시키기 위해 작성자가이를 추가합니다. – vancexu
중복이 동일한 위치를 가리킬 때 견고성으로 간주되어야하는 이유는 무엇입니까? –