MV2

28 posts in this topic

Posted

Hi!

hat von Euch schon jemand etwas zur 2. "Matlabübung" (Object recognition) gemacht, ich steh da bisher noch völlig im Wald was hier überhaupt zu implementieren ist - geschweige denn wie...

LG

Share this post


Link to post
Share on other sites

Posted

schau dir mal das tutorium auf der seite wo du die library runtergeladen hast die sind ziemlich gut. mir ist nur nicht klar wie wir die erg. darstellen sollen

Share this post


Link to post
Share on other sites

Posted

schau dir mal das tutorium auf der seite wo du die library runtergeladen hast die sind ziemlich gut. mir ist nur nicht klar wie wir die erg. darstellen sollen

Vermute du meinst das Bild aus dem Tutorial, welches mit "Bottom: Matching of SIFT descriptors with vl_ubcmatch." beschriftet ist. Habe das selbe Problem. Bin gerade am überlegen ob und wie man das selbst schrittweise mit den vorhandenen Mitteln/Funktionen erzeugen kann. Hat vielleicht jemand eine Idee/Lösungsvorschläge dazu?

Share this post


Link to post
Share on other sites

Posted

Ich hänge mich an - Stehe genau vor dem selben problem....

Share this post


Link to post
Share on other sites

Posted

das gleiche problem....kann das eigentlich sein dass man ja nur mehr oder weniger den code im tutorial copy pasten kann?...letzlich ist das schon fast der ganze code....da müsste man "nur" noch dieses Problem lösen

Share this post


Link to post
Share on other sites

Posted

Ich gehe davon aus... für die Implementierung gibts ja schließlich auch nur 1 Punkt.

Share this post


Link to post
Share on other sites

Posted

Naja, nachdem in der Angabe auch "bwselect" angegeben ist, gehe ich davon aus, dass sie gerne hätten, dass man irgendwie die Gemeinsamkeiten (ähnlich dem Tutorial) markiert und abbildet, aber ich hab keine Ahnung wie das gehn soll bzw. was sie genau haben wollen.

Share this post


Link to post
Share on other sites

Posted

... Habe das selbe Problem. Bin gerade am überlegen ob und wie man das selbst schrittweise mit den vorhandenen Mitteln/Funktionen erzeugen kann. ...?

Habe das Problem gelöst. Der rote Faden dahinter ist folgender:

Mit imshow([i1,I2]); kann man beide Bilder nebeneinander anzeigen. Dann die Features in "matches" beider Bilder einzeichnen lassen. Das geht ähnlich wie im Tutorial wo 50 zufällige gezeichnet werden. Bei dem rechten Bild muss man noch die x-Koordiante um die Breite des ersten Bildes erhöhen. Linien kann man dann mit dem Befehl line(X,Y) einzeichnen. Das habe ich in einer Schleife gemacht die alle Linien der gematchten Features zeichnet.

Share this post


Link to post
Share on other sites

Posted

also das mit den Bilder nebeneinander anzeigen,habe ich anders gelöstund zwar

subplot(1,2,1);

imshow(J);

subplot(1,2,2);

imshow(I2);

(so wie du es angegeben hast,gibts bei mir ein error),was den rest angeht wärs super wenn du dies mal näher erklären könntest...

Share this post


Link to post
Share on other sites

Posted

So wie es Snow angibt sollte es funktionieren. Mit [i1,I2] hängt man die Matrix des zweiten Bildes an die des ersten an. Somit bekommt man 1 großes Bild wo die beiden direkt nebeneinander sind.

Wenn man das so wie im Tutorial mit [F,D] = vl_sift() macht, dann steht in der ersten Spalte der F Matrix die x-Koordinate und in der zweiten die y-Koordinate der IPs. Dann einfach dort einen Punkt ins Bild zeichnen mit Plot. Das selbe mit den IPs für das zweite Bild, mit dem von Snow erwähnten Offset der x-Achse.

[m, s] = vl_ubcmatch() liefert dann die gematchen Punkte. In der Matrix m steht in der ersten Ziele die Position des IP im F Vektor des ersten Bildes. Das selbe mit der zweiten Zeile und dem zweiten Bild. Somit kommst wieder auf die x und y Koordinaten welche man nur mehr per Linie verbinden muss.

Share this post


Link to post
Share on other sites

Posted

Danke mal für die Erklärungen. Aber ich weiß einfach nicht wie ich die Matches, etc IN den Originalbildern angezeigt bekomme.... hmm :(

Share this post


Link to post
Share on other sites

Posted

Habs zwar auch noch nicht hinbekommen,aber schau mal nach im folder toolbox,demo....da ist ein sample code unter anderem fürs sift matching gegeben

Share this post


Link to post
Share on other sites

Posted

ich machs einfach so,

imshow([i1,I2])

hold on

plot(F1(1,:),F1(2,:),'+','linewidth',2)

plot(F2(1,:)+len_x,F2(2,:),'g*','linewidth',2)

Das zeichnet mir die IPs ohne Orientierung ein, welche mich persönlich auch nicht interessieren. Und len_x ist die Breite von I1.

Für die Matches dann einfach nur noch die Punkte nehmen die in der Matchmatrix drin sind.

Share this post


Link to post
Share on other sites

Posted

imshow([i1,I2]); funktioniert nur dann, wenn beide Bilder (=beide Matrizen) gleich groß sind

Share this post


Link to post
Share on other sites

Posted

Oh, das war der richtige Hinweis :). Dankeschön!!!

Share this post


Link to post
Share on other sites

Posted

Hat von euch wer einen Weg gefunden, mit vl_plotsiftdescriptor in beide der mit imshow([i1,I2]) erzeugten Bilder die descriptoren einzutragen - damit man es vergleichen kann.

Was bei mir auch nicht funktioniert ist die Linien von match zu match einzutragen.

Um genau zu sein, schaffe ich es eigentlich generell nicht, Linien in ein Bild einzutragen, das ich mit imshow() ausgebe....

LG

Share this post


Link to post
Share on other sites

Posted

Um genau zu sein, schaffe ich es eigentlich generell nicht, Linien in ein Bild einzutragen, das ich mit imshow() ausgebe....

Linien kannst du einfach mit line(X,Y) zeichnen. Wenn du das Bild vorher mit imshow ausgibst brauchst du ein hold on

Share this post


Link to post
Share on other sites

Posted

Ich brauch kein hold on... wundert mich auch :D

Share this post


Link to post
Share on other sites

Posted

Ich brauch kein hold on... wundert mich auch :D

Ich schätze einfach mal, dass du nach imshow() zuerst die IPs einzeichnest und dabei ein hold on verwendest. Das bleibt solange gespeichert bis ein hold off kommt oder du über figure() eine neue Grafik öffnest.

Share this post


Link to post
Share on other sites

Posted

Nein, in meinem ganzen code kommt das Wort "hold" nicht vor ;-) . ist mir aber auch völlig egal, Hauptsache es geht.

Share this post


Link to post
Share on other sites

Posted

Was ist die korrekte Syntax für die vl_ubcmatch Funktion (für Aufgabe 2)?

Ich schreibe:

[matches, scores] = vl_ubcmatch(d1, d2, 'MatchThreshold', 1.5) ;

und bekomme Error auf dieser Linie jedes Mal...

Share this post


Link to post
Share on other sites

Posted

Das ,MatchThreshold' gehört weg.

1 person likes this

Share this post


Link to post
Share on other sites

Posted

Kann mir irgendjemand erklären wofür die einzelnen Threashold Werte gut sind und in welchem Bereich die liegen müssen?

Ich erseh es mir aus der Doku nicht heraus. Edge muss jedenfalls größer als 1 sein. Peak liegt irgendwo zwischen 0 und 1 oder?

Und was macht der Match Threashold? :D Fragen über fragen,....

Share this post


Link to post
Share on other sites

Posted

Ich habe Peak fix auf 0.01 und Edge zwischen 4 und 7, je nach Bild, gewählt. Somit reduzieren sich meine 5000 IPs auf ca 30-40, welche eigentlich auch noch zu viel sind. Irgendwann hat der Vincze in der VO gesagt, dass bereits 3 IP ausreichen um ein Objekt wieder erfolgreich zu finden.

MatchThres ist nur ein Multiplikator. Die Abweichung von einem IP1 im ersten zu einem IP2 im zweiten Bild wird mit einer Distanz gewichtet. Ist diese Distanz * MatchThreshold geringer als die gerinste Abweichung von diesem IP1 zu jeden anderen gefundenen IP des ersten Bildes, dann wird es als erfolreicher Match gespeichert. Sozusagen der gefundene IP2 im zweiten Bild ist der der am besten zu IP1 passt. --> Vergrößern von MatchThres erhöht diese Distanz, womit weniger IP Paare die Schwelle unterschreiten. Daraus resultieren dann weniger matches. Bei Verringerung natürlich genau umgekehrt.

Hoffe ich konnte das halbwegs verständlich erklären.

Share this post


Link to post
Share on other sites

Posted

Hi. Für diejenigen die Matlab genauso lieben wie ich :fool: hab ich mal ne Idee zum Code. An alle die sich auskennen bitte ich um hinweise, wenn etwas nicht passt oder ich es besser machen könnte.

LG

run('Pfad') %Please change VLFEATROOT to the directory you unpacked the downloaded archive to

im1 = imread('Bild1.jpg');

im2 = imread('Bild2.jpg');

im1 = im2single(im1);

im2 = im2single(im2);

im1g = rgb2gray(im1);

im2g = rgb2gray(im2);

peak_thresh=0.001;

edge_thresh=2;

[f1,d1] = vl_sift(im1g,'PeakThresh', peak_thresh, 'edgethresh', edge_thresh);

[f2,d2] = vl_sift(im2g,'PeakThresh', peak_thresh, 'edgethresh', edge_thresh);

[matches, scores] = vl_ubcmatch(d1, d2, 1.5) ; %The default value of THRESH is 1.5

imshow([im1,im2])

hold on

for i=1:2:(size(matches,1)*size(matches,2))

plot(f1(1,matches(i)),f1(2,matches(i)),'gX','linewidth',1.5)

plot(f2(1,matches(i+1))+size(im1,2),f2(2,matches(i+1)),'gX','linewidth',1.5)

line([f1(1,matches(i)),f2(1,matches(i+1))+size(im1,2)],[f1(2,matches(i)),f2(2,matches(i+1))],'LineWidth',1.5,'Color','r')

end

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now