我是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 []),我不知道如何解决?谢谢。
答案 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
。