Verfasst am: 29.11.2014, 01:44
Titel: Matlab function für Java umschreiben
Hallo Liebe Forum Mitglieder.
Wie immer zu aller erst : ich bin extremer matlab newbie habt nachsicht mit mir. Dies wird ein längerer Post aber ich hoffe das sich jemand die Zeit nehmen kann mir zu helfen.
Ich habe hier einen Algorithmus mit denen ich eine HerzDame durch Template matching erkennen kann. Der Algorithmus funktioniert so tadellos! Dies sind im moment die folgenden Schritte
1. Webcam starten und snapshot machen.
2. SURF features beider Karten (Template und Snapshot) feststellen
3.Surf features BEIDER karten vergleichen und Treffer anzeigen
4. Am ende die gesuchte karte einrahmen und TADAA - gefunden!
Da dieser algorithmus aber Teil eines Javaspiels ist bringt mir das Ergebnis was mir jetzt am Ende geliefert wird relativ wenig.
Was ich brauche ist, dass WENN die karte gefunden wird mir z.B der wert 1 zurueck geliefert wird und wenn NICHT der wert 0 !
Ergebnisse bis jetzt wie gesagt
bei gefundener karte wird mir das Bild angezeigt mit der eingerahmten karte
wenn er nichts findet gibt er mir einen fehler. nun habe ich leider noch zu wenig plan von den matlab befehlen und allem drum und dran das ich das alleine ändern könnte. aber als ich eben auf einen der fehler geklick habe öffnete sich ein "fenster" wo code drin stand wo ich der meinung bin, das mir das helfen könnte aber an der umsetzung hapert es dann =(
zuerst zeige ich euch meinen code und dann die ausschnitte die ich gefunden habe ! ich hoffe inständig auf eure hilfe !!! liebe grüße
Code:
%bilder laden und in ein binarbild umwandeln
bild = imread('Herzdame.jpg');
bildgrau = rgb2gray(bild);
figure;
% Webcam starten und nach 5 Sekunden Bild aufnehmen
obj = videoinput('winvideo', 1);
pause(5);
frame = getsnapshot(obj);
szenegrau = rgb2gray( frame);
%Surffeatures in beiden Bildern herausfinden
bildf = detectSURFFeatures (bildgrau);
szenef = detectSURFFeatures ( szenegrau);
%Neue figure und darin surffeatures v0n bild1 anzeigen
figure;
imshow(bildgrau);
hold on;
plot(selectStrongest(bildf, 20));
%Neue figure und darin surffeatures v0n bild2 anzeigen
figure;
imshow(szenegrau);
hold on;
plot(selectStrongest(szenef, 20));
%features aus beiden Bildern extrahieren und PASSENDE Features anzeigen
%Die beiden bilder werden nebeneinander angezeigt
[bildfeatures,bildf] = extractFeatures (bildgrau, bildf);
[szenefeatures, szenef] = extractFeatures (szenegrau, szenef);
boxpairs = matchFeatures( bildfeatures, szenefeatures);
matchedboxpoints = bildf(boxpairs(:,1), :);
matchedszenepoints = szenef(boxpairs(:,2), :);
[EDITED, Jan: Code-Abschnitt entfernt, der eventuell Rechte anderer verletzen könnte]
ich weiss nich ob ich das vll auch voll falsch verstanden habe aber vll war da ja das richtige dabei! wie mein ergebnisbild im moment aussieht sehen sie ihm anhang an einem bsp was ich mal gemacht habe ( nur nich mit der herz dame )
ps. ich weiss leider ein sehr langer text aber n0chmal zur erinnerung ich brauche, dass WENN die karte gefunden wird mir z.B der wert 1 zurueck geliefert wird und wenn NICHT der wert 0 ! mit diesen werten kann ich dann in java weiter arbeiten =)
die Rückgabewerte inlierBoxPoints und inlierScenePoints bei einem Misserfolg/nicht gefunden (Failure) sein.
Ich empfehle dir mit dem Debugger zu arbeiten, setze einen Breakpoint nach der Funktion estimateGeometricTransform() und schau dir den Output an, wenn die Karte gefunden und nicht gefunden wird. Dann sollte wohl klar werden, wie du dann 1 und 0 zuordnen musst.
Sollte der untere Code tatsächlich aus der MATLAB Funktion estimateGeometricTransform() sein, würde ich ihn wohl besser löschen. Ich weiß ja nicht ob Mathworks so begeistert davon ist, wenn du deren Funktion öffentlich machst.
hier habe einen screenshot gemacht ! wenn ich ihn da hinmache n0ch kein fehler wenn ich ein step weiter mache k0mmt der fehler den ich grade dir da hin geschrieben habe =( was nun ? =(
wie du siehst einen parameter namens status deklarieren. status nimmt entweder den wert 0,1,2. Je nachdem ich die funktion meine Karte findet oder nicht.
Meine Frage ist, wie kriege ich es hin, das matlab mir DIESEN WERT in der Function zurück gibt am ende ? Ich hab jetzt schon mehrere Sachen ausprobiert
aber immer gib er mir fehler hier noch mal der Code
Dies liefert mir den status = 0, heißt keine Fehler.
Was ich nicht verstehe...erst schreibst du, der Algorithmus würde tadellos funktionieren. Aber wenn du einen Breakpoint setzt, gibt es eine Fehlermeldung bei genau besagter Funktion. Ergo ist der Input zu estimateGeometricTransform nicht korrekt, weshalb die Funktion eine Fehlermeldung liefert und das Programm abbricht.
ja da hab ich mich dann w0hl mies ausgedrückt sry !! ich meinte er erkennt tadellos wenn ich die richtige karte zeige. und wenn er nichs findet kam halt der fehler das stimmt.
ja 0 heisst ja das es keinen error gibt.
kann ich den status value denn auch am ende er function in ein return statement packen das er mi r 0 ,1 oder 2 returned ?
Ich verstehe nicht was du immer mit return hast. Return beendet in Matlab eine Funktion, hat aber nicht wie bei manch anderen Programmiersprachen einen Rückgabewert.
und dem return Wert einer Funktion, welcher in Matlab im Funktionskopf definiert ist?
Rufst du die Funktion "myFunction()", wie ich sie in meinem letzten Post definiert habe, im Command window auf, gibt sie dann auch 0,1 oder 2 zurück so fern estimateGeometricTransform() und der rest von myFunction fehlerfrei laufen.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.