Я создаю приложение, которое распознает здание или его части, чтобы наложить определенные блики.Сначала я думал об использовании Vuforia и Unity, как и все остальные, но я чувствую, что это не дает мне необходимую свободу, особенно с бесплатной версией.
Моя логика идет немного глубже, чем просто использованиецелевое изображение, поэтому моя идея заключалась в том, чтобы использовать Android Studio и OpenCV.
Я нахожусь в точке, где я могу показать соответствие функции с шагами, такими как
Calib3d.findHomography(pts1Mat, pts2Mat, Calib3d.RANSAC, 10, outPutMask, 2000, 0.995);
чтобы получить хорошие совпадения, а затем использовать
Features2d.drawMatches(imgFromFile, keyPoints1, imgFromFrame, keyPoints2, better_matches_mat, outputImg);
Но в данный момент у меня нет идей о том, как перевести, казалось бы, простой код Python, который вы часто находите, в android / java.
Что мне нужно сделать на этом этапе:
- Извлечение дескрипторов / ключевых точек из известных изображений здания, чтобы приложению не нужно было вычислять их каждый раз / кадр (я будувзять много фотографий)
- Выделить область совпадения (выделение рамки или цвета на контуре)
- Избавиться от ложных срабатываний (поиск совпадений даже при наличии камеры на каком-то случайном объекте
- Частота кадров довольно низкая с помощью drawMatches, так как мне действительно не нужно, я надеюсь, что частота кадров будет лучше, когда «просто» вычисляются совпадения. Я пытаюсь использовать frameResolution / 2 или frameResolution / 4, прежде чем работать с ними, но совпадения ухудшаются
Часть моего кода
public Mat matching (Mat matFrame, int viewMode, int resizeMode) {
if (viewMode == VIEW_MODE_FEATURES) {
initMatching();
if (!imageIsAnalyzed) {
detectImageFromFile();
}
detectFrame(matFrame, resizeMode);
featureMatching();
outPutMat = drawingOutputMat();
}
return outPutMat;
private void initMatching () {
detector = ORB.create();
descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
}
private void featureMatching () {
matcher.knnMatch(descriptor1, descriptor2, matches, 2);
//ratio test to get good matches
if (matOfDMatch.toArray()[0].distance / matOfDMatch.toArray()[1].distance < 0.9) {
good_matches.add(matOfDMatch.toArray()[0]);
}
//....
for(int i = 0; i<good_matches.size(); i++) {
pts1.add(keyPoints1.toList().get(good_matches.get(i).queryIdx).pt);
pts2.add(keyPoints2.toList().get(good_matches.get(i).trainIdx).pt);
}
//....
Calib3d.findHomography(pts1Mat, pts2Mat, Calib3d.RANSAC, 10, outPutMask, 2000, 0.995);
//outPutMask contains zeros and ones indicating which matches are filtered
better_matches = new LinkedList<DMatch>();
for (int i = 0; i < good_matches.size(); i++) {
if (outPutMask.get(i , 0)[0] != 0.0) {
better_matches.add(good_matches.get(i));
}
}
private void detectFrame (Mat matFrame, int resizeMode) {
imgFromFrame = matFrame;
Imgproc.resize(imgFromFrame, imgFromFrame, new Size(matFrame.width()/resizeMode, matFrame.height()/resizeMode));
descriptor2 = new Mat();
keyPoints2 = new MatOfKeyPoint();
detector.detect(imgFromFrame, keyPoints2);
descriptor.compute(imgFromFrame, keyPoints2, descriptor2);
}
private Mat drawingOutputMat () {
//Drawing Output
outputImg = new Mat();
better_matches_mat = new MatOfDMatch();
better_matches_mat.fromList(better_matches);
//this will draw all matches
Features2d.drawMatches(imgFromFile, keyPoints1, imgFromFrame, keyPoints2, better_matches_mat, outputImg);
//Instead of the drawing matches I will need some classification and some overlay on the output
return outputImg;
}
Я надеюсь, что некоторые из вас могут помочь мне выяснить мои дальнейшие шаги и как я должен продолжать.Заранее спасибо.