как использовать матрицы с асинхронными задачами? - PullRequest
0 голосов
/ 11 сентября 2018

Я новичок в Java, и мне нужна помощь, чтобы использовать матрицу с асинхронной задачей.Я использую кадр ввода от onCameraFrame для анализа в фоновом режиме.Я предоставлю метод и асинхронную задачу.

 public int recognize(Mat inputFrame) {
    int detector=0;
    Mat gray= inputFrame;
    if (startedFrame){
        BRISK.detect(inputFrame,keypoints1);
        BRISK.compute(inputFrame,keypoints1,deskriptor1);
        startedFrame=false;
        return 0;
    }

    BRISK.detect(inputFrame,keypoints2);
    BRISK.compute(inputFrame,keypoints2,deskriptor2);

    List<MatOfDMatch> matches = new LinkedList<MatOfDMatch>();
    matcher.knnMatch(deskriptor1, deskriptor2, matches,2);
    //Calculating good match list...
    LinkedList<DMatch> goodMatchesList = new LinkedList<DMatch>();

    for (int i = 0; i < matches.size(); i++) {
        MatOfDMatch matofDMatch = matches.get(i);
        DMatch[] dmatcharray = matofDMatch.toArray();
        DMatch m1 = dmatcharray[0];
        DMatch m2 = dmatcharray[1];

        if (m1.distance <= m2.distance * nndrRatio) {
            goodMatchesList.addLast(m1);

        }
    }
    if (goodMatchesList.size() >= 7) {

        List<KeyPoint> controlKeypointlist = keypoints1.toList();
        List<KeyPoint> liveKeypointlist = keypoints2.toList();

        LinkedList<Point> objectPoints = new LinkedList<>();
        LinkedList<Point> scenePoints = new LinkedList<>();

        for (int i = 0; i < goodMatchesList.size(); i++) {
            objectPoints.addLast(controlKeypointlist.get(goodMatchesList.get(i).queryIdx).pt);
            scenePoints.addLast(liveKeypointlist.get(goodMatchesList.get(i).trainIdx).pt);
        }

        MatOfPoint2f objMatOfPoint2f = new MatOfPoint2f();
        objMatOfPoint2f.fromList(objectPoints);
        MatOfPoint2f scnMatOfPoint2f = new MatOfPoint2f();
        scnMatOfPoint2f.fromList(scenePoints);
        detector=1;
        keypoints2.release();
        deskriptor2.release();
        return 2;

    }
    return 1;
}
class MyTask extends AsyncTask<Mat, Void, Integer> {


    @Override
    protected Integer doInBackground(Mat... mats) {
        return recognize(mats);
    }
}

И проблема в return recognize(mats);, в параметре mats, где говорится: распознавать (org.opencv.core.Mat) в MainActivity нельзя применитьto (org.opencv.core.Mat []) и я не знаю, как ее решить? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

В Java Mat... представляет массив класса Mat. Если вы посмотрите на ошибку

признать (org.opencv.core.Mat) в MainActivity нельзя применить к (org.opencv.core.Mat [])

Вы заметите, что он говорит то же самое, то есть вы передаете массив в метод, который принимает один экземпляр. Так что все, что вам нужно сделать, это:

return recognize(mats[0]);

получить Mat в первом индексе этого массива.

0 голосов
/ 11 сентября 2018

Параметр Mat... является параметром varargs и действует как массив.(т.е. Mat[]).

Чтобы получить первый аргумент Mat, используйте mats[0]:

@Override
protected Integer doInBackground(Mat... mats) {
    return recognize(mats[0]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...