WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matlab function für Java umschreiben

 

Uchiha
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 20.08.14
Wohnort: warstein
Version: ---
     Beitrag Verfasst am: 29.11.2014, 01:44     Titel: Matlab function für Java umschreiben
  Antworten mit Zitat      
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), :);


figure;
showMatchedFeatures(bildgrau, szenegrau, matchedboxpoints,matchedszenepoints, 'montage');

 
[tform, inlierBoxPoints, inlierScenePoints] = ...
    estimateGeometricTransform(matchedboxpoints, matchedszenepoints, 'affine');
figure;
showMatchedFeatures(bildgrau, szenegrau, inlierBoxPoints, ...
    inlierScenePoints, 'montage');

 
 %Größe des ersten objekts ermitteln und auf das 2. bild übertragen und das
 %Objekt finden
boxPolygon = [1, 1;...                          
        size(bildgrau, 2), 1;...                
        size(bildgrau, 2), size(bildgrau, 1);...      
        1, size(bildgrau, 1);...                
        1, 1];
newBoxPolygon = transformPointsForward(tform, boxPolygon);
figure;
imshow(szenegrau);
hold on;
line(newBoxPolygon(:, 1), newBoxPolygon(:, 2), 'Color', 'y');
title('Detected Box');




[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 =)

nocheinmal liebe grüße

5.jpg
 Beschreibung:

Download
 Dateiname:  5.jpg
 Dateigröße:  47.58 KB
 Heruntergeladen:  616 mal
Private Nachricht senden Benutzer-Profile anzeigen


Uchiha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 20.08.14
Wohnort: warstein
Version: ---
     Beitrag Verfasst am: 30.11.2014, 17:08     Titel:
  Antworten mit Zitat      
Niemand ? =(
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 30.11.2014, 20:47     Titel:
  Antworten mit Zitat      
Da du nur Codeausschnitte gepostet hast, bei denen Funktionen verwendet werden, die nicht zu Matlab gehören, ist es schwer mit der Hilfe.

Meine Glaskugel zeigt leider auch kein klares Bild von diesen Funktionen Wink

Ich nehme mal an, das der untere Code zu dieser Funktion gehört, welche im oberen Code aufgerufen wird.

Code:
[tform, inlierBoxPoints, inlierScenePoints] = ...
    estimateGeometricTransform(matchedboxpoints, matchedszenepoints, 'affine');


Wenn ich das richtig verstehe ist der Rückgabewert tform wohl die tmatrix in der unteren Funktion.

Code:

% return identity matrix in case of failure
failedMatrix = eye([3,3], classToUse);
tmatrix = failedMatrix;


Ebenso könnten

Code:

inlier_points1 = matched_points1([]);
inlier_points2 = matched_points2([]);
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Uchiha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 20.08.14
Wohnort: warstein
Version: ---
     Beitrag Verfasst am: 30.11.2014, 22:30     Titel:
  Antworten mit Zitat      
Okay ich werde es löschen. ersteinmal vielen dank für die antwort !! Smile

kannst du mir sagen wie ich das mit dem debuggen mache ? mit dem breakpoint ist irgendwas mit " dbstop" oder so ?

wäre lieb wenn Sie mir dabei helfen könnten !!

liebe grüße

ps: wo kann ich meine nachrichen denn bearbeiten damit ich das eine weg löschen kann?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 30.11.2014, 22:38     Titel:
  Antworten mit Zitat      
Vermutlich ist der Zeitbereich in dem ein Post editiert werden kann abgelaufen. Da musst einen Moderator per PM informieren.

Google doch einfach mal nach "Matlab debugger"...da findet man sofort (Video-)Tutorials Wink.
Private Nachricht senden Benutzer-Profile anzeigen
 
Uchiha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 20.08.14
Wohnort: warstein
Version: ---
     Beitrag Verfasst am: 30.11.2014, 23:00     Titel:
  Antworten mit Zitat      
Ja ich hab nun mal einen breakpoint in Zeile 47 gesetzt. bis dahin kein fehler wenn ich dann einen step weiter drücke kommt wieder diese fehlermeldung

Code:
Error using coder.internal.errorIf (line 9)
MATCHED_POINTS1 and MATCHED_POINTS2 do not have enough points.

Error in estimateGeometricTransform>checkRuntimeStatus (line 180)
coder.internal.errorIf(status==statusCode.NotEnoughPts, ...

Error in estimateGeometricTransform (line 158)
    checkRuntimeStatus(statusCode, status);

Error in surfie (line 47)
[tform, inlierBoxPoints, inlierScenePoints] = ...


aber ich weiss nich wie ich die beheben kann deswegen frag ich ja hier =( =( 0der muss ich special breakpoints setzten?
Private Nachricht senden Benutzer-Profile anzeigen
 
Uchiha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 20.08.14
Wohnort: warstein
Version: ---
     Beitrag Verfasst am: 30.11.2014, 23:28     Titel:
  Antworten mit Zitat      
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 ? =(

fehl.png
 Beschreibung:

Download
 Dateiname:  fehl.png
 Dateigröße:  179.52 KB
 Heruntergeladen:  637 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Uchiha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 20.08.14
Wohnort: warstein
Version: ---
     Beitrag Verfasst am: 01.12.2014, 17:09     Titel:
  Antworten mit Zitat      
kanst du vll nochmal eben hier rein schauen ? Man kann in der Methode

Code:
[tform, inlierBoxPoints, inlierScenePoints, status] = ...
    estimateGeometricTransform(matchedboxpoints, matchedszenepoints, 'affine');


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

Code:
function surfie

%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), :);


figure;
showMatchedFeatures(bildgrau, szenegrau, matchedboxpoints,matchedszenepoints, 'montage');

 
[tform, inlierBoxPoints, inlierScenePoints, status] = ...
    estimateGeometricTransform(matchedboxpoints, matchedszenepoints, 'affine');


es wäre super wenn du mir helfen kannst!!!!
liebe grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 01.12.2014, 17:37     Titel:
  Antworten mit Zitat      
Da ich deine Bilder nicht habe, habe ich einfach das Bsp. aus der Dokumentation zur Funktion estimateGeometricTransform verwendet:

Code:

original  = imread('cameraman.tif'); imshow(original); title('Base image');
distorted = imresize(original, 0.7); distorted = imrotate(distorted, 31);
figure; imshow(distorted); title('Transformed image');

ptsOriginal  = detectSURFFeatures(original);
ptsDistorted = detectSURFFeatures(distorted);
[featuresOriginal,   validPtsOriginal] = extractFeatures(original,  ptsOriginal);
[featuresDistorted, validPtsDistorted] = extractFeatures(distorted, ptsDistorted);

index_pairs = matchFeatures(featuresOriginal, featuresDistorted);
matchedPtsOriginal  = validPtsOriginal(index_pairs(:,1));
matchedPtsDistorted = validPtsDistorted(index_pairs(:,2));
figure; showMatchedFeatures(original,distorted,matchedPtsOriginal,matchedPtsDistorted);
title('Matched SURF points, including outliers');

[tform,inlierPtsDistorted,inlierPtsOriginal,status] = estimateGeometricTransform(matchedPtsDistorted,matchedPtsOriginal,'similarity');
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Uchiha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 20.08.14
Wohnort: warstein
Version: ---
     Beitrag Verfasst am: 01.12.2014, 17:53     Titel:
  Antworten mit Zitat      
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 ?

liebe grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 01.12.2014, 17:57     Titel:
  Antworten mit Zitat      
Klar...

Code:

function [status] = myFunction()

...

[tform,inlierPtsDistorted,inlierPtsOriginal,status] = estimateGeometricTransform(matchedPtsDistorted,matchedPtsOriginal,'similarity');

end
 


myFunction gibt somit die Variable status von estimateGeometricTransform zurück.
Private Nachricht senden Benutzer-Profile anzeigen
 
Uchiha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 20.08.14
Wohnort: warstein
Version: ---
     Beitrag Verfasst am: 01.12.2014, 18:37     Titel:
  Antworten mit Zitat      
ach so schreib man das ? kein return am ende oder so ?? 0.0
Private Nachricht senden Benutzer-Profile anzeigen
 
Uchiha
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 20.08.14
Wohnort: warstein
Version: ---
     Beitrag Verfasst am: 01.12.2014, 19:20     Titel:
  Antworten mit Zitat      
ich sehe auch das die 0 dann links bei mir im workspace steht. aber kann ich die nicht ganz "0ffiziel"l returnen? als0 mit einen return statement?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 01.12.2014, 20:42     Titel:
  Antworten mit Zitat      
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.

Wo ist denn der Unterschied zwischen einem

Code:
return status; % z.B. C-code


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.