Ich schreibe Code, um ähnliche Objekte aus Drawable in Kamerapreview zu finden. Ich benutze das neueste Opencv 2.4.4.Matcher Assertions fehlgeschlagen Fehler opencv Android
Unten sind meine Funktionen und eine Ausgabe von logcat. Was mache ich falsch, dass ich eine solche Ausgabe bekomme?
public void detect_image (Mat mRgba) {
object_desc = new Mat();
scene_desc = new Mat();
object_keys = new MatOfKeyPoint();
scene_keys = new MatOfKeyPoint();
matches = new MatOfDMatch();
good_matches = new MatOfDMatch();
Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.sto);
Utils.bitmapToMat(image,object);
surf = FeatureDetector.create(FeatureDetector.FAST);
surf.detect(object, object_keys);
surf.detect(mRgba, scene_keys);
surfEX = DescriptorExtractor.create(DescriptorExtractor.BRIEF);
surfEX.compute(object, object_keys, object_desc);
surfEX.compute(mRgba, scene_keys, scene_desc);
dm = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2);
dm.match(object_desc, scene_desc, matches);
double max_dist = 0;
double min_dist = 100;
for(int i = 0; i < object_desc.rows(); i++)
{ double dist = matches.toArray()[i].distance;
if(dist < min_dist) min_dist = dist;
if(dist > max_dist) max_dist = dist;
}
for(int i = 0; i < object_desc.rows(); i++)
{ MatOfDMatch temp = new MatOfDMatch();
if(matches.toArray()[i].distance < 3*min_dist)
{ temp.fromArray(matches.toArray()[i]);
good_matches.push_back(temp);
}
}
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
detect_image(mRgba);
return inputFrame.rgba();
}
Logcat:
03-27 01:55:31.258: E/cv::error()(564): OpenCV Error: Assertion failed
(type == src2.type() && src1.cols == src2.cols &&
(type == CV_32F || type == CV_8U)) in void cv::batchDistance(cv::InputArray,
cv::InputArray, cv::OutputArray, int, cv::OutputArray, int, int, cv::InputArray,
int, bool), file /home/reports/ci/slave/50-SDK/opencv/modules/core/src/stat.cpp,
line 1803
Welche genau Linie auf dieser Behauptung versagt? Sind Sie sicher, dass 'surf.detect()' eine Bitmap als Eingabe akzeptieren kann? Sollte es nicht eine Matte sein? – JonesV
surf.detect() nimmt Mats und Objekt und mRgba sind Mats. Die folgende Zeile verursacht die Probleme: dm.match (object_desc, scene_desc, Übereinstimmungen); – Martus0
Mein Fehler, ich hatte 'Utils.bitmapToMat()' nicht gesehen. Haben Sie manuell überprüft, ob "object_desc.type == scene_desc.type" und "object_desc.cols == object_scene.cols"? Es gibt anscheinend eine Art Inkompatibilität zwischen deinem 'object_desc' und' scene_desc' ... – JonesV