2016-06-02 2 views
2

Ссылаясь на this ответ на this question:Как получить ключевую точку «в пределах гомографии»?

Что происходит, что вы рассматриваете все ключевые точки , обнаруженные во втором изображении для расчета повторяемости и фактически только ключевых точек в пределах омографии следует использовать ,

Я не понимаю, как получить

жгутов на ключевые точки гомография

Кто-то может объяснить, как это сделать?

EDIT:

На самом деле, глядя на код evaluation.cpp Я думаю, что эта операция уже выполнена. Фактически, глядя на:

float overlapThreshold; 
bool ifEvaluateDetectors = thresholdedOverlapMask == 0; 
if(ifEvaluateDetectors) 
{ 
    overlapThreshold = 1.f - 0.4f; 

    // remove key points from outside of the common image part 
    Size sz1 = img1.size(), sz2 = img2.size(); 
    filterEllipticKeyPointsByImageSize(keypoints1, sz1); 
    filterEllipticKeyPointsByImageSize(keypoints1t, sz2); 
    filterEllipticKeyPointsByImageSize(keypoints2, sz2); 
    filterEllipticKeyPointsByImageSize(keypoints2t, sz1); 
} 
else 
{ 
    overlapThreshold = 1.f - 0.5f; 

    thresholdedOverlapMask->create((int)keypoints1.size(), (int)keypoints2t.size(), CV_8UC1); 
    thresholdedOverlapMask->setTo(Scalar::all(0)); 
} 

Учитывайте, что thresholdedOverlapMask=0 по умолчанию. Таким образом, часть внутри if отбрасывает точку вне гомографии. Это верно?

ответ

1

ключевые точки с гомографией Это те точки, которые считаются линеями для результата матрицы гомографа. Иными словами:

Предположим, вы используете технику оценки, такую ​​как RANSAC, чтобы получить свою матрицу гомографов, некоторые из ваших точек будут использованы для построения этого гомографа. Остальные - всего лишь шум (выбросы). Вам нужно знать, какие из ваших точек, которые не являются шумом, и которые были использованы для построения этого Гомографа.


Как это сделать в OpenCV?

cv::findHomography функция имеет следующую подпись:

Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray()); 

Параметр OutputArray mask является то, что вы ищете. Вы можете использовать его как это:

std::vector<uchar> homograph_mask; 
auto H= cv::findHomography(set_of_points, other_set_of_points, cv::RANSAC, RANSAC_THRESHOLSD, homograph_mask); 
std::vector<std::pair<cv::Point,cv::Point>> points_within_the_homograph; 
points_within_the_homograph.reserve(homograph_mask.size()); 
for(size_t i=0;homograph_mask.size();++i){ 
    if(homograph_mask[i]==static_cast<uchar>(1)){ 
     points_within_the_homograph.emplace_back(set_of_points[i],set_of_points[i]); 
    } 
} 
points_within_the_homograph.shrink_to_fit(); 

points_within_the_homograph будет содержать множество пар соответственных точек, которые находятся в омограф (inliers).

+0

Спасибо за ваш ответ. В любом случае, подпись функции, о которой идет речь, - это 'void cv :: evaluationFeatureDetector (const Mat & img1, const Mat & img2, const Mat & H1to2, std :: vector * _keypoints1, std :: vector * _keypoints2, float & repeatability, int & correspCount, const Ptr & _fdetector) ', который кажется отличным от' points_within_the_homograph', который вы определили в своем ответе. – justHelloWorld

+0

Из того, что я понял из связанного ответа, мне нужно, чтобы '_keypoints2' содержал только точки в гомографии. – justHelloWorld

+0

@justHelloWorld в orde, чтобы получить точки с гомографией, которую вы должны использовать cv :: findHomography этот еще один шаг, который следует принять –

Смежные вопросы