Сравнение двух изображений в Android OpenCV с использованием ORB - PullRequest
0 голосов
/ 04 ноября 2018

Я новичок в OpenCV и пытаюсь написать код Android с использованием OpenCV, чтобы сравнить два изображения на предмет сходства. В моем примере я загрузил два изображения из папки Drawable, как вы видите в коде, но я не могу выполнить код, чтобы получить процент соответствия между изображениями и установить порог или что-то? поэтому, пожалуйста, кто-нибудь может помочь мне решить мою проблему, спасибо заранее. ниже мой код:

public class MainActivity extends AppCompatActivity {

 //TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    System.loadLibrary("opencv_java3");

   // textView =(TextView)findViewById(R.id.textView);

    Mat m1 = Imgcodecs.imread(ResourcesCompat.getDrawable(getResources(), R.drawable.image1, null).toString());

    Mat m2 = Imgcodecs.imread(ResourcesCompat.getDrawable(getResources(), R.drawable.image2, null).toString());

    //Imgproc.cvtColor(m1, m1, Imgproc.COLOR_RGB2BGRA);
    //Imgproc.cvtColor(m2, m2, Imgproc.COLOR_RGB2BGRA);

    FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
    MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
    detector.detect(m1, keypoints1);

    FeatureDetector detector2 = FeatureDetector.create(FeatureDetector.ORB);
    MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
    detector2.detect(m2, keypoints2);

    DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
    Mat descriptors1 = new Mat();
    extractor.compute(m1, keypoints1, descriptors1);

    DescriptorExtractor extractor2 = DescriptorExtractor.create(DescriptorExtractor.ORB);
    Mat descriptors2 = new Mat();
    extractor2.compute(m2, keypoints2, descriptors2);

    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
    MatOfDMatch matches = new MatOfDMatch();

    matcher.match(descriptors1, descriptors2, matches);


    List<DMatch> matchesList = matches.toList();
    double maxDistance = 0;
    double minDistance = 1000;

    int rowCount = matchesList.size();
    for (int i = 0; i < rowCount; i++)
    {
        double dist = matchesList.get(i).distance;
        if (dist < minDistance) minDistance = dist;
        if (dist > maxDistance) maxDistance = dist;
    }

    List<DMatch> goodMatchesList = new ArrayList<DMatch>();
    double upperBound = 1.6 * minDistance;
    for (int i = 0; i < rowCount; i++)
    {
        if (matchesList.get(i).distance <= upperBound)
        {
            goodMatchesList.add(matchesList.get(i));
        }
    }
    MatOfDMatch goodMatches = new MatOfDMatch();
    goodMatches.fromList(goodMatchesList);

}

}

...