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

aviread - VideoReader

 

NumerusMaximus
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 29.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2016, 15:16     Titel: aviread - VideoReader
  Antworten mit Zitat      
Hallo Community,

zur Auswertung von Videodatein bezüglich auftretender Frequenzen habe ich ein Skript bekommen. Anscheinend waren bzw. sind einige Funktionen veraltet bzw. müssen durch andere ersetzt werden. Ich sehe allerdings, auf Grund meines semiguten Verständnisses für MATLAB, den Fehler nicht.

Die Funktion VideoReader ist eine öffentliche Funktion.

Code:

function [] = evalCAM()
filename='560_0.5_100.avi';
%% auszuwertender Bildteil im 102x500 Subbild("CUT_"):
%windo=[300,25;350,75];%Randbereich
%windo=[200,25;250,75];%Übergangsbereich
windo=[81,51;140,100]; %Reinigungsbereich, rechts unterhalb des Strahlaufpunkts

try
    load(['CUT_',filename])
catch
    mov = VideoReader('560_0.5_100.avi');
    cmap = mov(1).colormap;
    mov=rmfield(mov(:),'colormap');
    for ii=1:length(mov)
        mov(ii).cdata=mov(ii).cdata(1:102,500:1000);
    end
    save(['CUT_',filename],'mov','cmap')  
end

%% Frequenzauswertung:
signal=zeros(1-windo(1,2)+windo(2,2),1-windo(1,1)+windo(2,1),length(mov));
dt=1e-4;                %Zeit zw. 2 Bildern
df=1/(length(mov).*dt); %Frequenzauflösung
cut_freq = 100;         %ignoriere Frequenzen unter ... Hz

for ii=1:length(mov)
%figure(51);imagesc(mov(ii).cdata(windo(1,2):windo(2,2),windo(1,1):windo(2,1))),drawnow
%figure(52);imagesc(mov(ii).cdata),drawnow
signal(:,:,ii)=mov(ii).cdata(windo(1,2):windo(2,2),windo(1,1):windo(2,1));
end

f=fft(signal,[],3);
f=f(:,:,1:floor(length(mov)/2)); f(:,:,1:ceil(cut_freq/df))=0;

%% optional: ignoriert schwach oszillierende pixel
%[ampf,idxf]=max(abs(f),[],3);
%makeNAN=ones(size(f(:,:,1))); makeNAN(ampf<=3800)=nan; %empirisch
%%figure(99);imagesc(makeNAN)
%for ii=1:length(f(1,1,:))
%    f(:,:,ii)= makeNAN.*f(:,:,ii);
%end

%% Mittelung über Pixel:
PSD=abs(f).^2;
PSD_=nanmean(nanmean(PSD,1),2);
PSD_=reshape(PSD_,1,floor(length(mov)/2));
figure(1);plot([0:df:df*(length(PSD_)-1)] , PSD_);
xlabel('Frequenz / Hz'),ylabel('<PSD>_{pixel} / a.u.');

[peak,idx]=max(PSD_);
Peak_Frequenz_Hz = df*(idx-1)
end

 


Die Fehlermeldung sieht wie folgt aus:

>> evalCAM
No appropriate method, property, or field 'colormap' for class 'VideoReader'.

Error in evalCAM (line 12)
cmap = mov(1).colormap;

Vielen Dank für eure Hilfe und schönen kommenden 3. Advent !
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.12.2016, 17:04     Titel: Re: aviread - VideoReader
  Antworten mit Zitat      
Hallo NumerusMaximus,

Zitat:
Die Funktion VideoReader ist eine öffentliche Funktion.

Was ist eine "öffentliche Funktion"?
Die Funcktion VideoReader aus der Matlab-Toolbox erzeugt auf jeden Fall kein Objekt mit einem Feld "colormap". Siehe die Dokumentation dieses Befehls.
Deshalb ist der gepostete Code nicht lauffähig. Frage den Autor, wozu das dienen soll, denn erraten kann man das nicht.

Die Variable "cmap" wird im Code gar nicht benötigt. Wozu dient dann der Aufwand, sie zu erzeugen?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
NumerusMaximus
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 29.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 15:11     Titel:
  Antworten mit Zitat      
Hallo Community,

das war wahrscheinlich ein ungünstiger Einstieg. Hier noch einmal zur Erklärung der Problemstellung. Ich habe ein 256 x 128 .avi Datei gegeben. Dieses Video ist schwarz-weiß, beinhaltet also nur Grautöne.

Bedingt durch das Auftreffen eines Wasserstrahles entstehen Wellen mit unterschiedlicher Sättigung des Grautons. Die Funktion gray(t) soll mittels FFT ausgewertet werden. Vorher muss allerdings aus dem Video ein Bildabschnitt ausgeschnitten werden, der analysiert werden soll. Zudem möchte ich gerne, dass dieser Abschnitt und deren Umrandung, also Pixel weiß markiert werden soll. Im Anhang ist das qualitativ mal gezeichnet. Ich habe dort schonmal etwas probiert, aber das ist noch nicht das was ich haben will.

Zudem ist sowohl die Funktion "read" als auch "NumberofFrames" veraltet und nur bis 2013b zulässig. Für Version 2015b gibt es andere Funktionen, wobei die Handhabung von denen mir noch nicht klar ist.

Code:

clc
clear all
close all

Fs = 10e4;

filename='Test01_800_0,5_100';
mov_handle = VideoReader([filename,'.avi']);
mov = read(mov_handle);
numberOfFrames = mov_handle.NumberOfFrames;

%% auszuwertender Bildteil im 102x500 Subbild("CUT_"):
%windo=[300,25;350,75];%Randbereich
%windo=[200,25;250,75];%�bergangsbereich
windox = [580,600];
windoy = [50,70];
windo=[windox(1),windoy(1);windox(2),windoy(2)]; %Reinigungsbereich, rechts unterhalb des Strahlaufpunkts

ls = 8;     %Linienstärke

bereichsbild = read(mov_handle,1);
bereichsbild(windo(1,2):windo(2,2),windo(1,1)-ls:windo(1,1),:)=256;
bereichsbild(windo(1,2):windo(2,2),windo(2,1):windo(2,1)+ls,:)=256;
bereichsbild(windo(1,2)-ls:windo(1,2),windo(1,1):windo(2,1),:)=256;
bereichsbild(windo(2,2):windo(2,2)+ls,windo(1,1):windo(2,1),:)=256;

figure(1)
contourf(bereichsbild)
set(gcf, 'colormap', gray)

%% Frequenzauswertung:
signal=zeros(1-windo(1,2)+windo(2,2),1-windo(1,1)+windo(2,1),numberOfFrames);
dt=1/Fs;                %Zeit zw. 2 Bildern
df=1/(numberOfFrames.*dt); %Frequenzaufl�sung
cut_freq = 1;         %ignoriere Frequenzen unter ... Hz

for ii=1:numberOfFrames
%figure(51);imagesc(mov(ii).cdata(windo(1,2):windo(2,2),windo(1,1):windo(2,1))),drawnow
%figure(52);imagesc(mov(ii).cdata),drawnow
%signal(:,:,ii)=mov(ii).cdata(windo(1,2):windo(2,2),windo(1,1):windo(2,1));
signal(:,:,ii)=mov(windo(1,2):windo(2,2),windo(1,1):windo(2,1),:,ii);
end

f=fft(signal,[],3);
f=f(:,:,1:floor(numberOfFrames/2)); f(:,:,1:ceil(cut_freq/df))=0;

%% optional: ignoriert schwach oszillierende pixel
%[ampf,idxf]=max(abs(f),[],3);
%makeNAN=ones(size(f(:,:,1))); makeNAN(ampf<=3800)=nan; %empirisch
%%figure(99);imagesc(makeNAN)
%for ii=1:length(f(1,1,:))
%    f(:,:,ii)= makeNAN.*f(:,:,ii);
%end

%% Mittelung �ber Pixel:
PSD=abs(f).^2;
PSD_=nanmean(nanmean(PSD,1),2);
PSD_=reshape(PSD_,1,floor(numberOfFrames/2));
figure(2);plot([0:df:df*(length(PSD_)-1)] , PSD_);
xlabel('Frequenz / Hz'),ylabel('<PSD>_{pixel} / a.u.');

[peak,idx]=max(PSD_);
Peak_Frequenz_Hz = df*(idx-1)
 


vlcsnap-error164.png
 Beschreibung:

Download
 Dateiname:  vlcsnap-error164.png
 Dateigröße:  353.7 KB
 Heruntergeladen:  355 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
NumerusMaximus
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 29.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2016, 15:30     Titel:
  Antworten mit Zitat      
Hallo an alle,

schade das sich noch keiner gemeldet hat. Ich habe versucht die Funktionen von Version 2013b mit den Funktionen von 2015b zu ersetzen. Leider spuckt er folgende Fehlermeldung heraus.

Error using VideoReader/hasFrame
Method 'hasFrame' is not defined for class 'VideoReader' or is removed from MATLAB's search path.

Error in Videoauswertung (line 12)
while hasFrame(mov_handle)

Ich verstehe den Fehler so nicht, denn die Funktion hasFrame ist in der Toolbox VideoReader enthalten.

Mein angepassten, aber mit Fehlern besetzte Code sieht so zurzeit aus:

Code:


clc
clear all
close all

Fs = 10e5;

filename='560_0.5_100';
mov_handle = VideoReader([filename,'.avi']);
numFrames = 0;
while hasFrame(mov_handle)
    readFrame(mov_handle);
    numFrames = numFrames +1;
end
numberOfFrames = mov_handle.numFrames;

%% auszuwertender Bildteil im 102x500 Subbild("CUT_"):
%windo=[300,25;350,75];%Randbereich
%windo=[200,25;250,75];%�bergangsbereich
% Bildauflösung 256 x 128 (Breite x Höhe)
windox = [120,160];
windoy = [50,70];
windo=[windox(1),windoy(1);windox(2),windoy(2)]; %Reinigungsbereich, rechts unterhalb des Strahlaufpunkts

ls = 8;

bereichsbild = readframe(mov_handle,1);
bereichsbild(windo(1,2):windo(2,2),windo(1,1)-ls:windo(1,1),:)=256;
bereichsbild(windo(1,2):windo(2,2),windo(2,1):windo(2,1)+ls,:)=256;
bereichsbild(windo(1,2)-ls:windo(1,2),windo(1,1):windo(2,1),:)=256;
bereichsbild(windo(2,2):windo(2,2)+ls,windo(1,1):windo(2,1),:)=256;

figure(1)
contourf(bereichsbild)
set(gcf, 'colormap', gray)

%% Frequenzauswertung:
signal=zeros(1-windo(1,2)+windo(2,2),1-windo(1,1)+windo(2,1),numberOfFrames);
dt=1/Fs;                %Zeit zw. 2 Bildern
df=1/(numberOfFrames.*dt); %Frequenzaufl�sung
cut_freq = 1;         %ignoriere Frequenzen unter ... Hz

for ii=1:numberOfFrames
%figure(51);imagesc(mov(ii).cdata(windo(1,2):windo(2,2),windo(1,1):windo(2,1))),drawnow
%figure(52);imagesc(mov(ii).cdata),drawnow
%signal(:,:,ii)=mov(ii).cdata(windo(1,2):windo(2,2),windo(1,1):windo(2,1));
signal(:,:,ii)=mov(windo(1,2):windo(2,2),windo(1,1):windo(2,1),:,ii);
end

f=fft(signal,[],3);
f=f(:,:,1:floor(numberOfFrames/2)); f(:,:,1:ceil(cut_freq/df))=0;

%% optional: ignoriert schwach oszillierende pixel
%[ampf,idxf]=max(abs(f),[],3);
%makeNAN=ones(size(f(:,:,1))); makeNAN(ampf<=3800)=nan; %empirisch
%%figure(99);imagesc(makeNAN)
%for ii=1:length(f(1,1,:))
%    f(:,:,ii)= makeNAN.*f(:,:,ii);
%end

%% Mittelung �ber Pixel:
PSD=abs(f).^2;
PSD_=nanmean(nanmean(PSD,1),2);
PSD_=reshape(PSD_,1,floor(numberOfFrames/2));
figure(2);plot([0:df:df*(length(PSD_)-1)] , PSD_);
xlabel('Frequenz / Hz'),ylabel('<PSD>_{pixel} / a.u.');

[peak,idx]=max(PSD_);
Peak_Frequenz_Hz = df*(idx-1)
   


 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.12.2016, 17:03     Titel:
  Antworten mit Zitat      
Hallo,

mangels Video kann ich das nicht ausprobieren. Hast du denn mal das Beispiel aus der Doku getestet?
Code:
v = VideoReader('xylophone.mp4');
%Read all video frames.

while hasFrame(v)
    video = readFrame(v);
end


Falls da das gleiche Problem auftritt, liegt das Problem in deiner Installation - z.B. dass wie in der Fehlermeldung angegeben Pfade aus irgendeinem Grund vom MATLAB Suchpfad verschwunden sind. Dazu:
pathtool
und dann "Restore default path"

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
NumerusMaximus
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 29.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2016, 10:22     Titel:
  Antworten mit Zitat      
Hallo,

danke vorerst für die Antwort. Ich habe das durchgeführt und den entsprechenden Ordner in der Toolbox mit Videoreader auf Default wieder zurückgesetzt.

Leider funktioniert es immer noch nicht. Ich habe das auch auf einer unabhängigen Lizenz 2016b und einem anderen Rechner probiert, doch dieser Fehler tritt immer wieder auf. Was mache ich falsch?

Im Anhang ist ein kurzes Ausschnitt aus dem Video im mp4 Format, d.h. .avi müsste im Skript noch kurz geändert werden . Es wäre gut, wenn jemand das mal testen könnte. Dann beschaffe ich mir anderweitig eine andere Lizenz. Vielleicht funktioniert es dort.

Gruß

560_0.5_100.zip
 Beschreibung:

Download
 Dateiname:  560_0.5_100.zip
 Dateigröße:  2.01 MB
 Heruntergeladen:  374 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.12.2016, 11:23     Titel:
  Antworten mit Zitat      
Hallo,

bei mir gibt es kein Problem mit hasframe, allerdings später
Zitat:
No appropriate method, property, or field 'numFrames' for class 'VideoReader'.


Bitte auf die Frage eingehen:
Zitat:
Hast du denn mal das Beispiel aus der Doku getestet?


So oder so bietet sich auch eine Anfrage beim Technischen Support von MathWorks an.

Grüße,
Harald

Zuletzt bearbeitet von Harald am 14.12.2016, 11:31, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
NumerusMaximus
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 29.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2016, 11:28     Titel:
  Antworten mit Zitat      
Das habe ich getestet und auch dabei tritt der Fehler auf. Das tritt aber nicht nur bei hasFrame sondern auch bei readFrame auf.

Dann werde ich dort wohl nicht drum herumkommen. Ich hoffe der Support hilft dort weiter.

Gruß
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 - 2025 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.