如何在asynctasks中使用矩阵?

时间:2018-09-11 11:33:07

标签: java android opencv android-asynctask

我是Java的新手,我需要帮助才能将矩阵与异步Task配合使用。 我正在使用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中,它说:MainActivity中的recognize(org.opencv.core.Mat)无法应用 到(org.opencv.core.Mat []),我不知道如何解决?谢谢。

2 个答案:

答案 0 :(得分:0)

参数Mat...varargs参数,其作用类似于数组。 (即Mat[])。

要获取参数的第一个Mat,请使用mats[0]

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

答案 1 :(得分:0)

在Java中,Mat...表示Mat类类型的数组。如果您看到错误

  

MainActivity中的(org.opencv.core.Mat)识别不能应用于(org.opencv.core.Mat [])

您会注意到它说的是完全一样的东西,即您正在将Array传递给采用单个实例的方法。因此,您所需要做的就是:

return recognize(mats[0]);

在此数组的第一个索引处获取Mat