Найти сходство двух изображений со знаком рук OpenCv

Я работаю над приложением Sign Translator для удобных людей. В Моем приложении Пользователь даст одно изображение знака с камеры или галереи, данное изображение будет сравниваться с изображениями из базы данных и показывать результат с помощью алфавитного знака.

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

 Scalar lowerThreshold =  new Scalar(0, 48, 80); // Blue color – lower hsv values
    Scalar upperThreshold = new Scalar(20, 255, 255); // Blue color – higher hsv values

    FeatureDetector detector = FeatureDetector.create(FeatureDetector.PYRAMID_FAST);
    DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);

    //orb orb bruteforce with filter method
    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
    //crash on surf flanbased


    Mat img1 = new Mat();
    Mat img2 = new Mat();


    Utils.bitmapToMat(defaultImage,img1);
    Utils.bitmapToMat(databaseImage,img2);



    Mat descriptors1 = new Mat();
    MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
    detector.detect(img1, keypoints1);
    extractor.compute(img1, keypoints1, descriptors1);


    //second image

    Mat descriptors2 = new Mat();
    MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
    detector.detect(img2, keypoints2);
    extractor.compute(img2, keypoints2, descriptors2);


    //matcher image descriptors
    MatOfDMatch matches = new MatOfDMatch();
    matcher.match(descriptors1,descriptors2,matches);

    //Filter matches by distance
    MatOfDMatch filtered = filterMatchesByDistance(matches);

    int total = (int) matches.size().height;
    int Match= (int) filtered.size().height;
    Log.d("LOG", "total:" + total + " Match:"+Match);

    int percent = (int)((Match * 100.0f) / total);
    if(percent>max){
        max=percent;
        maximumPercentage.setMaximum(percent);
        maximumPercentage.setImageId(id);
        imageId=id;
        Log.d("Maximum Percentage: ",String.valueOf(max)+"%");
        Log.d("MaxId: ",String.valueOf(imageId));
    }
    id++;
    Log.d("matchingOImages: ",String.valueOf(percent)+"%");

метод сопоставления результатов фильтра

 List<DMatch> matches_original = matches.toList();
    List<DMatch> matches_filtered = new ArrayList<DMatch>();

    int DIST_LIMIT = 30;
    // Check all the matches distance and if it passes add to list of filtered matches
    Log.d("DISTFILTER", "ORG SIZE:" + matches_original.size() + "");
    for (int i = 0; i < matches_original.size(); i++) {
        DMatch d = matches_original.get(i);
        if (Math.abs(d.distance) <= DIST_LIMIT) {
            matches_filtered.add(d);
        }
    }
    Log.d("DISTFILTER", "FIL SIZE:" + matches_filtered.size() + "");

    MatOfDMatch mat = new MatOfDMatch();
    mat.fromList(matches_filtered);
    return mat;

1 ответ

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

Для скорейшего результата, я думаю, вы могли бы начать здесь: (Предполагая, что вы скорее не хотите погружаться так глубоко во внутреннюю работу нейронной сети, а скорее используете существующее программное обеспечение или службы) https://cloud.google.com/automl/

Другие вопросы по тегам