Я использую FAST и FREAK, чтобы получить дескрипторы пары изображений, а затем я применяю knnMatch с BruteForceMatcher matcher и затем я использую цикл для разделения хороших совпадений:
float nndrRatio = 0.7f;
std::vector<KeyPoint> keypointsA, keypointsB;
Mat descriptorsA, descriptorsB;
std::vector< vector< DMatch > > matches;
int threshold=9;
// detect keypoints:
FAST(objectMat,keypointsA,threshold,true);
FAST(sceneMat,keypointsB,threshold,true);
FREAK extractor;
// extract descriptors:
extractor.compute( objectMat, keypointsA, descriptorsA );
extractor.compute( sceneMat, keypointsB, descriptorsB );
BruteForceMatcher<Hamming> matcher;
// match
matcher.knnMatch(descriptorsA, descriptorsB, matches, 2);// good matches search:
vector< DMatch > good_matches;
for (size_t i = 0; i < matches.size(); ++i)
{
if (matches[i].size() < 2)
continue;
const DMatch &m1 = matches[i][0];
const DMatch &m2 = matches[i][1];
if(m1.distance <= nndrRatio * m2.distance)
good_matches.push_back(m1);
}
//If there are at least 7 good matches, then object has been found
if ( (good_matches.size() >=7))
{
cout << "OBJECT FOUND!" << endl;
}
Я думаю, что проблема может заключаться в методе поиска подходящих совпадений, потому что использование его с FlannBasedMatcher работает нормально, но с BruteForceMatcher очень странно. Я подозреваю, что я, возможно, занимаюсь ерундой с этим методом, потому что расстояние Хемминга использует двоичные дескрипторы, но я не могу придумать, как его адаптировать!
Любые ссылки, фрагменты, идеи, … пожалуйста?
Ваш код неплох, но я не думаю, что это то, что вы хотите сделать. Почему вы выбрали этот метод?
Если вы хотите обнаружить объект на изображении с помощью OpenCV, вам следует попробовать Каскадная классификация. Эта ссылка объясню, как обучить классификатор.
РЕДАКТИРОВАТЬ: Если вы думаете, что это слишком сложно, и если объект, который вы хотите обнаружить, является плоским, вы можете попробовать этот урок (он в основном вычисляет значения, пытаясь найти гомографическое преобразование между объектом и изображением). Но каскадная классификация является более общей для обнаружения объектов.
Других решений пока нет …