Konvexe Hülle auf Java Android Opencv 2.3
Bitte helfen Sie mir,
Ich habe ein problem, für Convex Hull auf Android. Ich benutze Java und OpenCV 2.3.
Bevor ich es auf Java, habe ich es auf C++ mit Visual Studio 2008.
Dieser code erfolgreich ausgeführt auf C++.
Nun, ich will es konvertieren von C++ zu Java auf Android. Und ich fand Fehlermeldung wie "force close" wenn ich es laufen auf der Android SDK-simulator.
Dies ist mein code auf C++:
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
drawing = Mat::zeros( canny_output.size(), CV_64F );
///Find the convex hull object for each contour
vector<vector<Point> > hull ( contours.size() );
for( int i = 0; i < contours.size(); i++ )
{ convexHull( Mat(contours[i]), hull[i], false );
}
for(size_t i = 0; i < contours.size(); i++){
drawContours( drawing, hull, i, Scalar(255, 255, 255), CV_FILLED ); //FILL WHITE COLOR
}
Und das ist mein code auf Android:
Mat hierarchy = new Mat(img_canny.rows(),img_canny.cols(),CvType.CV_8UC1,new Scalar(0));
List<Mat> contours =new ArrayList<Mat>();
List<Mat> hull = new ArrayList<Mat>(contours.size());
drawing = Mat.zeros(img_canny.size(), im_gray);
Imgproc.findContours(img_dilasi, contours, hierarchy,Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0));
for(int i=0; i<contours.size(); i++){
Imgproc.convexHull(contours.get(i), hull.get(i), false);
}
for(int i=0; i<contours.size(); i++){
Imgproc.drawContours(drawing, hull, i, new Scalar(255.0, 255.0, 255.0), 5);
}
Für deine info, ich habe eine kleine änderung auf der Konvexen Hülle an meinem code. Fülle ich eine Farbe im inneren Kontur.
Jemand kann mir helfen, mein problem zu lösen?
Ich bin für Eure Hilfe sehr dankbar.
- Es ist schwer zu sagen, was die Ursache für dein problem. Was ist die spezifische Fehlermeldung, die Sie bekommen? Gibt es log-Ausgabe im Zusammenhang mit ihm?
- Wenn ich es laufen auf der Android SDK-Simulator, windows-Fehler erschien, "die Anwendung gestopt unerwartet" und mir wurde gesagt, zu stoppen, indem Sie auf "Force Close". Und wenn ich überprüft, Log-Cat Fehler Eclipse, ich fand, dass der Prozess halt auf dieser Linie "Imgproc.convexHull(Konturen.get(i), hull.get(i), false);" ich weiß nicht, warum der Vorgang gestopt, in der Zeile. Können Sie nicht helfen, mir erklären?
- Ich denke ich habe einen Fehler bei der Deklaration der "Rumpf" - variable. Aber, ich weiß nicht, wie man dieses problem lösen. Ich denke, ich habe erklärt, dass die variable in übereinstimmung mit den geltenden Bestimmungen. Was ist Ihre Meinung? Glauben Sie, dass die Deklaration einer variable "Rumpf" in meinem code nicht richtig?
- Hat einer von den Antworten, die Ihr problem lösen? Wenn ja, würden Sie akzeptieren einer von Ihnen? Wenn nicht, hinterlassen Sie bitte einen Kommentar unter Angabe, was wir verbessern können.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht die rep hinzufügen, Kommentar, wollte nur sagen, dass die beiden oben genannten Antworten halfen mir Imgproc.convexHull() funktioniert für meinen Gebrauch Fall mit etwas wie folgt aus (2.4.8):
Dieser code funktioniert in meiner Anwendung. In meinem Fall hatte ich mehrere Konturen, mit zu arbeiten, so werden Sie feststellen, eine Menge von Listen, aber wenn Sie nur eine Kontur, so passen Sie es zu arbeiten, ohne .get(i) Iterationen.
Diesem thread erklärt, der Prozess einfach.
android-java, opencv 2.4 convexhull convexdefect
Beispiel in Java (OpenCV 2.4.11)
hullMat
enthält die sub-mat vongray
, die durch dieconvexHull
Methode.Können Sie filtern möchten, die Konturen, die Sie wirklich brauchen, beispielsweise basierend auf Ihrer Region.
Suchen Sie in der Dokumentation des
findContours()
undconvexHull()
, es scheint, dass Sie deklariert die Variablencontours
undhull
falsch.Versuchen Sie, die Erklärungen zu:
Dann, nach rufen Sie
convexHull()
,hull
enthält die Indizes der Punkte incontours
die sich aus der konvexen Hülle. Damit zeichnen Sie die Punkte mitdrawContours()
wird, müssen Sie füllen eine neueMatOfPoint
enthält nur die Punkte auf der konvexen Hülle, und pass aufdrawContours()
. Ich überlasse dies als übung für Sie.Hinzufügen zu dem, was Aurelius sagte, in der C++ - Implementierung, die Sie verwendet einen Vektor von Punkten, also die Rumpf-matrix enthält die eigentliche konvexe Punkte:
Dies ist der Grund, warum Sie waren in der Lage zu nennen
In Ihrer android-version, die Rumpf-Ausgang ist einfach ein array von Indizes, die entsprechen der Punkte in den ursprünglichen Konturen.get(i) Matrix. Daher müssen Sie, um die konvexe Punkte in der ursprünglichen matrix. Hier ist eine sehr grobe Idee:
Verwenden Sie diese
fillconvexPoly