Verfasst am: 11.06.2013, 22:29
Titel: AVI einlesen, bearbeiten, speichern
Hallo Leute,
ich würde gerne ein Video bearbeiten und anschließend speichern. Am besten wäre es, wenn ich ein neues *.avi File bekommen würde.
Ich hab schon verschiedene Sachen ausprobiert, aber nichts hat funktioniert. Hat mir ein paar Codes aus der documentary "writeVideo" kopiert, aber es geht trotzdem nicht
Zum einen weiß ich nicht was in meinem Fall imageObj ist, bzw. ob ich die Sache überhaupt richtig angehe. Wenn ich für imageObj = 'img1' verwende, kommt die Fehlermeldung:
Undefined function 'writeVideo' for input arguments of type 'double'.
Error in Bildmittelung (line 31)
a = writeVideo(img1,res); % Neues Video
for i = 1 : nFrames
mov(i).cdata = read(obj,i); % Altes Video einlesen
img =double(mov(i).cdata);
res = img(:,:,1) - immean; % Altes Video minus Mittelwert
a = writeVideo(img1,res); % Neues Video end
for i = 1 : nFrames
mov(i).cdata = read(obj,i); % Altes Video einlesen
img =double(mov(i).cdata);
res = img(:,:,1) - immean; % Altes Video minus Mittelwert
writeVideo(writerObj,res); % Neues Video end
Neuer Fehler:
Warning: No video frames were written to this file. The file may be invalid.
> In VideoWriter.VideoWriter>VideoWriter.close at 271
In VideoWriter.VideoWriter>VideoWriter.delete at 220
In Bildmittelung at 1
Error using VideoWriter/writeVideo (line 336)
Frames of type double must be in the range 0 to 1.
Error in Bildmittelung (line 32)
writeVideo(writerObj,img); % Neues Video
Muss ich hier noch zu uint8 konvertieren?? Werde mal ein paar Sachen ausprobieren.
Verfasst am: 12.06.2013, 15:43
Titel: Re: AVI einlesen, bearbeiten, speichern
Hallo GtrAngus,
Matlab's Debugger könnte Dir helfen das Problem zu verstehen: Setze einfach einen Breakpoint in oder vor die entsprechende Zeile, dann könntest Du die Werte der fraglichen Variablen direkt untersuchen.
Ich schreibe das aber mit Bedacht im Konjunktiv. Denn "clear all" löscht vorhandene Breakpoints. Leider ist es trotz dieser eigentlich vernichtenden Eigenschaft so häufig im Code, der im Forum gepostet wird, zu finden, dass es mich gruselt. Wer empfiehlt Programmieranfängern Methoden, die das Debuggen systematisch verhindern??
Da hier das Video immer neu eingelesen wurde, was sehr viel Speicher und somit Zeit verbraucht hat. Die Bilder werden jetzt nur einmal eingelesen und dann im Workspace gespeichert
@ Jan S
Das clear all alle Breakpoints löscht, war mir bislang gar nicht klar. Liegt aber auch daran das ich das sehr selten verwende. Trotzdem Danke für den Hinweis! Ich benutze den Befehl um sicher zu gehen, dass keine Variablen im Speicher hängen wie z.B. alte Bilder als Matrix o.ä. Kann man bestimmt eleganter lösen, aber dafür fehlt mir bislang einfach noch die Erfahrung.
Jetzt hab ich allerdings eine neue Frage. Ist eigentlich simple, aber ich versteh es einfach nicht....
Hier ist ein Ausschnitt aus meinem Code:
Code:
if thresh == 1 % Originalbild image(I), title('Originalbild'), colormap('gray');
% Histogramm des Originalbildes [m,y] = hist(I,127);
a = mean(m,2);
figure, plot(y,a), title('Mean Histogramm Original');
% Mittelwert, Standardabweichung des Bildes berechnen
b = mean(I(:))
c = std(I(:))
% Oberer und unterer Datenbereich der bestehen soll
Io = I > b+c; % oberer Datenbereich
Iu = I < b-c; % unterer Datenbereich
logbin = Io + Iu; % Ist logical binary file
% Erzeugt neues Bild in Abhängigkeit ob logbin 1 oder 0 for i = 1 : vidHeight
for j = 1 : vidWidth
if logbin(i,j) == 1
imgst(i,j) = I(i,j);
else
imgcrap(i,j) = I(i,j);
end end end
% Bild nach Bearbeitung image(imgst), title('Bearbeitet'),colormap('gray');
% Histogramm des bearbeiteten Bildes imgst [n,x] = hist(imgst,127);
a = mean(n,2);
figure, plot(x,a), title('Mean Histogramm Bearbeitet');
% Histogramm des bearbeiteten Bildes crap [n,x] = hist(imgcrap,127);
a = mean(n,2);
figure, plot(x,a), title('Mean Histogramm Crap');
Hab einige Stellen kommentiert, aber hier nochmal was ich mache:
Video einlesen, das 1. Bild speichern (später werden alle Bilder bearbeitet) und ein Histogramm erstellen.
Dann wird das Bild bearbeitet und ausgegeben. Es wird ein neues Histogramm erstellt. Ganz am Ende erstelle ich noch einen Oberflächen-Plot, um zu schauen ob das Bild z.B. ungleichmäßig belichtet wurde.
crap ist das Negativ zu imgst.
Jetzt das Problem
Obwohl der Code für alle Histogramme gleich ist, wird mir kein Histogramm für das Original angezeigt. Bei den Oberflächen-Plots und den anderen beiden Histogrammen jedoch klappt es... Woran genau liegt das??? Hab das Problem schon öfters gehabt. Oftmals reicht es schon wenn ich ein anderes Bild einlesen lasse, dass doch etwas angezeigt wird.
% Video Frame für Frame in Variable I speichern for i=1:1
mov(i).cdata = read(obj,i);
res = double(mov(i).cdata);
I(:,:,i) = res(:,:,1);
end
if thresh == 1 % Originalbild image(I), title('Originalbild'), colormap('gray');
% Histogramm des Originalbildes [m,y] = hist(I,127);
a = mean(m,2);
figure, plot(y,a), title('Mean Histogramm Original');
% Mittelwert, Standardabweichung des Bildes berechnen
b = mean(I(:))
c = std(I(:))
% Oberer und unterer Datenbereich der bestehen soll
Io = I > b; % oberer Datenbereich
Iu = I < (b-c); % unterer Datenbereich
logbin = Io + Iu; % Ist logical binary file
% überschreibt Originalbild, falls for i = 1 : vidHeight
for j = 1 : vidWidth
if logbin(i,j) == 1
imgst(i,j) = I(i,j);
else
imgcrap(i,j) = I(i,j);
end end end
% Bild nach Bearbeitung image(imgst), title('Bearbeitet'),colormap('gray');
% Histogramm des bearbeiteten Bildes imgst [n,x] = hist(I,127);
a = mean(n,2);
figure, plot(x,a), title('Mean Histogramm Bearbeitet');
% Histogramm des bearbeiteten Bildes crap [n,x] = hist(imgcrap,127);
a = mean(n,2);
figure, plot(x,a), title('Mean Histogramm Crap');
Bitte den Code selber anpassen. Ist bestimmt nicht schwer, aber jeder hat da so seine eigenen Vorlieben. Ist jetzt jedoch ein JPG !!! Normaler Weise jedoch ein *.tif :
Die Frage ist, wie du das haben willst. Du könntest z.B. einen figure-Befehl davorsetzen, wie du es ja auch bei diversen anderen Grafik-Befehlen gemacht hast.
Mich verwundert allerdings, dass dieses Verhalten nur bei bestimmten Bildern auftritt.
@ Harald
Danke! Daran lag der Fehler! Hätte womöglich nie in dieser Zeile nach dem Verursacher gesucht!
@ Jan S
Und wieder was neues gelernt Werd ich gleich mal einbauen.
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.