Verfasst am: 28.11.2014, 18:34
Titel: normxcorr2 macht probleme -.-!
Hallo liebes Forum,
ich habe ein kleies Problem mit meinem Program. Ich habe ein Template matching programm geschrieben, welches Zahlen in Bildern erkennen "sollte". Jedoch habe ich ein Problem mit der correlation. Ich wüsste gerne was ich falsch mache.
die Fehlermeldung ist doch eindeutig: I und I2 müssen uint8(m*n) sein. Kann deinen Code im Moment nicht prüfen, an welcher Stelle sich dein Datenformat ändert. Aber im workspace findest du die Fehlerstelle.
danke erstmal für die schnelle Antwort. Da ich aber nicht so die Granate bin, was Matlab angeht, wäre es echt ne coole sache, wenn du mir eine genaue beschreibung geben könntest falls du zeit hast, was ich machen kann. Weil mir das doch nicht so sehr einleuchtend ist.
lg alex
% die Schablone
I2 = imread('1.bmp');
...
c= normxcorr2(I2,I);
% SIEHE DOKU: C = normxcorr2(template, A) computes the normalized cross-correlation of the matrices template and A. The matrix A must be larger than the matrix template for the normalization to be meaningful. The values of template cannot all be the same. The resulting matrix C contains the correlation coefficients, which can range in value from -1.0 to 1.0.
leider kommt immernoch die selbe Fehlermeldung. Ich habe die Schablone in 42x24pixel und das Bild in normalgröße gehabt. Hab jetzt aus dem Bild mal den Bereich den ich haben will ausgeschnitten. Dachte vielleicht liegt das an der Größe die falsch ist. Das Funktioniert aber leider auch nicht.
Ich habe mir das jetzt noch einmal angesehen und verstehe den ganzen Code nicht. Normxcorr2 wird nur auf die Varibalen I und I2 angewendet. Der ganze Code hat auf normxcor2 doch keine Wirkung - oder habe ich was übersehen? Und am Anfang waren es m*n*3 Bilder und dann kommt diese Fehlermeldung.
Wenn die Templategröße nicht stimmt gibt Matlab eine entsprechende Fehlermeldung aus.
DSP: Also der Code so funktioniert. Danke jedoch liefer er mir nur einen Graphen mit erhöhten Variablen an den Stellen wo es traffic gibt. Jedoch wollte ich keinen Graphen sondern ein Bild mit einer BoundingBox um das Objekt was ich suche.
Hubertus: Das könnte evtl. das Problem sein, das es meinen code nicht bis zum Ende ausführt. Aber was währe den eine Alternative oder besser gesagt die Lösung für mein Problem?
DSP: Also der Code so funktioniert. Danke jedoch liefer er mir nur einen Graphen mit erhöhten Variablen an den Stellen wo es traffic gibt. Jedoch wollte ich keinen Graphen sondern ein Bild mit einer BoundingBox um das Objekt was ich suche.
Das liefert normxcorr2 aber schlicht weg nicht. Diese Funktion zeigt dir Übereinstimmungen von Bild und Template auf und erstellt eine 3D Karte. Du musst nun diese Werte nutzen und dem höchsten Peak in der 3D Karte die Position im Bild zuordnen.
Schau dir die Doku zu dem Befehl normxcorr2...dort ist doch dann erklärt wie das Ergebnis der Funktion zu nutzen ist.
Code:
c = normxcorr2(onion,peppers);
% Find peak in cross-correlation. [ypeak, xpeak] = find(c==max(c(:)));
% Account for the padding that normxcorr2 adds.
yoffSet = ypeak-size(onion,1);
xoffSet = xpeak-size(onion,2);
% Move data back to CPU for display.
yoffSet = gather(ypeak-size(onion,1));
xoffSet = gather(xpeak-size(onion,2));
Ich verstehe nicht, dass nicht einmal hinterfragt wird, was die ganzen Codezeilen bewirken solle. Du hast den Code auch nicht zu Ende geführt, wie du schreibst, sondern nicht einmal angefangen.
Man muss doch zunächst erst einmal nachfragen, was dieser ganze Code bewirken soll und nicht irgendwo in der Mitte hinein Lösungsansätze vorschlagen. Im Code wird außerdem der Datentyp logical erzielt, der später bei normxcorr2 Probleme macht. So ist kein zusammenhängender Faden ersichtlich!
Hey, ja das stimmt, die methode wie mit normxcorr2 so wie ich sie benutze, habe ich in einem tutorial gesehen auf mathworks. Ich habe gedacht das ich das so übernehmen kann, jedoch funktioniert das alles nicht so ganz wie ich mir das vorgestellt habe und da ich komplett neu im Themenbereich "Matlab" bin verstehe ich auch die zusammenhänge noch nicht so gut wie ich es mir wünsche.
Ich habe vor eine Zahl in einem Bild zu suchen und dann eine Bounding box um das best erzielte Ergebnis des matches zu legen. Mir wurde gesagt das es auf jedenfall mit einer correlation funktioniert. So jetzt gibt es aber einen haufen von dennen xD jetzt habe ich versucht random eine zu wählen was mir so auf den ersten Blick logisch vorkam aber das ist es warscheinlich noch nicht ganz, gibt es da einen besseren correlationstypen den ihr mir empfehlen könntet?
Oder ist das schon gut nur ich setze das Ergebnis falsch ein oder sogar noch garnicht? das währen jetzt mal meine Fragen
Danke für die aktive Hilfe von euch
Hey Leute, ich hab das jetzt mal soweit "verbessert" und er sollte eigentlich mal endlich eine boundingbox um das objekt was ich suche machen, tut er jedoch nicht. Die frage ist wieso bleibt er immerwieder in der Schleife hängen?
corrMat=[];
for i=1:(r1-r2+1) for j=1:(c1-c2+1)
Nimage=IGray(i:i+r2-1,j:j+c2-1);
Nimage=Nimage-mean(mean(Nimage)); % mean of image part under mask
corr=sum(sum(Nimage.*image22));
%corrMat(i,j)=corr;
corrMat(i,j)=times(corr);
end end
i=c(c3);
j=c3;
result=IGray;
for x=i:i+r2-1 for y=j
result(x,y)=255;
end end for x=i:i+r2-1 for y=j+c2-1
result(x,y)=255;
end end for x=i
for y=j:j+c2-1
result(x,y)=255;
end end for x=i+r2-1 for y=j:j+c2-1
result(x,y)=255;
end end % apply templete matching using power of the image
%result1=tmp(I,I2);
%result1=corr2(I,I2);
%figure,
%subplot(2,2,1),imshow(I);title('Template');
%subplot(2,2,2),imshow(I2);title('Target');
%subplot(2,2,3),imshow(result1);title('Matching Result using tmp');
% apply templete matching using DC components of the image
%result2=tmc(I,I2);
[Ilabel, num3] = bwlabel(c);
disp(num3);
Iprops3 = regionprops(Ilabel, 'BoundingBox','Image');
Ibox3 = [Iprops3.BoundingBox];
Ibox3 = reshape(Ibox3,[14]);
figure(8),
subplot(2,2,1),imshow(I);title('Template');
subplot(2,2,2),imshow(I2);title('Target');
subplot(2,2,3),imshow(result);title('Matching Result using tmc');
%result=plotbox(Target,Template,corrMat);
%imshow(I2, result);
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.