Я пытаюсь создать приложение для простого распознавания листьев с Android и OpenCV; моя база данных состоит всего из 3 записей (3 изображения из 3 типов листьев), и я хотел бы узнать, есть ли одна из картин в базе данных внутри другого изображения, захваченного смартфоном. Я использую метод SURF для извлечения ключевых точек из изображений базы данных, а затем сравнивает их с извлеченными ключевыми точками захваченного изображения, ища совпадения. Моя проблема заключается в том, что результат отображается как «согласование цвета», больше, чем «соответствие функций»: когда я сравниваю изображение с базой данных и захваченным, количество совпадений равно всем 3 элементам, и, таким образом, я получаю неправильное совпадение.Распознавание изображений с использованием SURF с OpenCV в Android
Это один из картины из базы данных (обратите внимание, что без Backgroud)
И это результат, который я получаю:
Изображение на вершине тот, который снят с смартфона, и изображение ниже - результат с выделенными совпадениями.
Вот код, который я реализовал:
Mat orig = Highgui.imread(photoPathwithoutFile);
Mat origBW = new Mat();
Imgproc.cvtColor(orig, origBW, Imgproc.COLOR_RGB2GRAY);
MatOfKeyPoint kpOrigin = createSURFdetector(origBW);
Mat descOrig = extractDescription(kpOrigin, origBW);
Leaf result = findMatches(descOrig);
Mat imageOut = orig.clone();
Features2d.drawMatches(orig, kpOrigin, maple, keypointsMaple, resultMaple, imageOut);
public MatOfKeyPoint createSURFdetector (Mat origBW) {
FeatureDetector surf = FeatureDetector.create(FeatureDetector.FAST);
MatOfKeyPoint keypointsOrig = new MatOfKeyPoint();
surf.detect(origBW, keypointsOrig);
return keypointsOrig;
}
public Mat extractDescription (MatOfKeyPoint kpOrig, Mat origBW) {
DescriptorExtractor surfExtractor = DescriptorExtractor.create(FeatureDetector.SURF);
Mat origDesc = new Mat();
surfExtractor.compute(origBW, kpOrig, origDesc);
return origDesc;
}
public Leaf findMatches (Mat descriptors) {
DescriptorMatcher m = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
MatOfDMatch max = new MatOfDMatch();
resultMaple = new MatOfDMatch();
resultChestnut = new MatOfDMatch();
resultSwedish = new MatOfDMatch();
Leaf match = null;
m.match(descriptors, mapleDescriptors, resultMaple);
Log.d("Origin", resultMaple.toList().size()+" matches with Maples");
if (resultMaple.toList().size() > max.toList().size()) { max = resultMaple; match = Leaf.MAPLE; }
m.match(descriptors, chestnutDescriptors, resultChestnut);
Log.d("Origin", resultChestnut.toList().size()+" matches with Chestnut");
if (resultChestnut.toList().size() > max.toList().size()) { max = resultChestnut; match = Leaf.CHESTNUT; }
m.match(descriptors, swedishDescriptors, resultSwedish);
Log.d("Origin", resultSwedish.toList().size()+" matches with Swedish");
if (resultSwedish.toList().size() > max.toList().size()) { max = resultSwedish; match = Leaf.SWEDISH; }
//return the match object with more matches
return match;
}
Как я могу получить более точное соответствие не основанные на цветах, а на реальных особенностях картины?
Интересно! Не могли бы вы приложить фрагмент кода для этого? Потому что я не понял, что вы имеете в виду: я пытался выполнить 'findHomography' после сопоставления, но я думаю, что я делаю что-то неправильно. Спасибо –
Отредактированный ответ, чтобы включить фрагмент кода. Я использовал ваши листовые изображения в качестве входных данных, размером до 512 пикселей. – alexisrozhkov