Android OpenCV - распознавание частей здания - PullRequest
0 голосов
/ 24 октября 2018

Я создаю приложение, которое распознает здание или его части, чтобы наложить определенные блики.Сначала я думал об использовании 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.

Что мне нужно сделать на этом этапе:

  1. Извлечение дескрипторов / ключевых точек из известных изображений здания, чтобы приложению не нужно было вычислять их каждый раз / кадр (я будувзять много фотографий)
  2. Выделить область совпадения (выделение рамки или цвета на контуре)
  3. Избавиться от ложных срабатываний (поиск совпадений даже при наличии камеры на каком-то случайном объекте
  4. Частота кадров довольно низкая с помощью 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;
}

Я надеюсь, что некоторые из вас могут помочь мне выяснить мои дальнейшие шаги и как я должен продолжать.Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...