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

Timer - TimerFcn Variable übergeben

 

StudXYZ
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 25.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2017, 19:13     Titel: Timer - TimerFcn Variable übergeben
  Antworten mit Zitat      
Hi,
vielleicht war das schonmal hier, aber ich habe nach mehreren Stunden googlen nichts gefunden was hilft. Ich will einfach nur eine Variable in meiner TimerFcn verwenden.
Ich habe mal ein Beispiel dazu getippt:
Code:

text1 = 'Nachricht';
t = createtimer;
start(t);

function t = createtimer()
    t = timer;
    t.TimerFcn = @showstuff;
    t.Period = 2;
    t.StartDelay = 1;
    t.ExecutionMode = 'fixedRate';
end

function showstuff(obj,event)
    disp(text1);
end
 


Egal wie ich die Funktion deklariere, die Variable ändere, showstuff kann anscheinend nie darauf zugreifen. Was mache ich falsch?
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: 26.06.2017, 13:10     Titel: Re: Timer - TimerFcn Variable übergeben
  Antworten mit Zitat      
Hallo StudXYZ,

In Matlab hat jede Funktion ihren eigenen WorkSpace, also einen lokalen Satz von Variablen. Wenn Du eine Variable im CommandWindow (Base-Workspace) oder in einer Funktion definierst, ist sie deshalb noch lange nicht im Callback des Timers sichtbar.

Es gibt verschiedene Lösungen in Abhängigkeit davon, was das Ziel ist. Z.B. kannst Du eine "nested function" für den Callback verwenden:
Code:
function t = createtimer()
    t = timer;
    t.TimerFcn = @showstuff;
    t.Period = 2;
    t.StartDelay = 1;
    t.ExecutionMode = 'fixedRate';

   text1 = 'Nachricht';
   start(t);
   pause(10);
   stop(t);

   % Nested function:
   function showstuff(obj,event)
     disp(text1);
  end
end

Oder Du kannst die Variable lokal im Timer speichern:
Code:
text1 = 'Nachricht';
t = createtimer;
t.UserData = text1;
start(t);

function t = createtimer()
    t = timer;
    t.TimerFcn = @showstuff;
    t.Period = 2;
    t.StartDelay = 1;
    t.ExecutionMode = 'fixedRate';
end

function showstuff(obj,event)
  text1 = get(obj, 'UserData');
 disp(text1);
end

Globale Variablen wären eine schlecht Idee, denn sie erzeugen mehr Probleme, als sie lösen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 25.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2017, 17:12     Titel:
  Antworten mit Zitat      
Hi Jan, vielen Dank für die Hilfe. Im Beispiel hat es geklappt.
Allerdings funktioniert die Anwendung trotzdem nicht; ich bekomme den gleichen Fehler wie vorher. Liegt es vielleicht daran, dass ich ein Bild übergebe? Hier die Anwendung: Der Timer soll alle 2s den Inhalt der Bounding Box in einer Figure anzeigen.

Code:

% Create the face detector object.
faceDetector = vision.CascadeObjectDetector;

% Create the webcam object.
cam = webcam();

% Capture one frame to get its size.
videoFrame = snapshot(cam);
frameSize = size(videoFrame);

% Create the video player object.
videoPlayer = vision.VideoPlayer('Position', [100 100 [frameSize(2), frameSize(1)]+30]);

f1=figure;

% Init timer object
t = createtimer;
t.UserData = videoFrame;

runLoop = true;

% Start the timer
start(t);

try
    while runLoop  
        % Get the next frame
        videoFrame = snapshot(cam);
        videoFrameGray = rgb2gray(videoFrame);
       
        % Create BoundingBox around detected face
        BB = step(faceDetector, videoFrameGray);
       
        % Display BoundingBox
        videoFrame = insertShape(videoFrame, 'Rectangle', BB(1,:), 'LineWidth', 3);

        % Display the annotated video frame using the video player object
        step(videoPlayer, videoFrame);
       
        % Check whether the video player window has been closed
        runLoop = isOpen(videoPlayer);
    end
   
catch ME
    %Error Handling - Clean up, show error
    stop(t);
    clear t;
    close(f1);
    clear cam;
    clear videoPlayer;
    release(faceDetector);
    throw(ME);
end

% Clean up
stop(t);
clear t;
close(f1);
clear cam;
clear videoPlayer;
release(faceDetector);

%--------------------------------------------------------------------------
function t = createtimer()
    t = timer;
    t.TimerFcn = @(~,~)takeface;
    t.Period = 2;
    t.StartDelay = 5;
    t.ExecutionMode = 'fixedRate';
end

function takeface(obj,event)
    disp('Funktion erreicht');
    videoFrame = get(obj, 'UserData');
    face_BB_crop = imcrop(videoFrame, BB(1,:));
    close(f1);
   set(f1,'Position',[0 0 750 800]);
    imshow(face_BB_crop);
    disp('Funktion fertig');
end
 


Die nested function würde ich ungern verwenden, da noch mehr Code dazu kommt und ich befürchte dass es unübersichtlich wird. Die Bounding Box BB muss ich wohl auch zu UserData hinzufügen?!
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: 27.06.2017, 20:28     Titel:
  Antworten mit Zitat      
Hallo StudXYZ,

Zitat:
ich bekomme den gleichen Fehler wie vorher.

Hattest Du schon erwähnt, welchen fehler Du bekommst? Eine Kopie der vollständigen Meldung wäre hilfreich...

Zitat:
Die Bounding Box BB muss ich wohl auch zu UserData hinzufügen?!

Klingt logisch. Versuche es mal ;-)

Gruß, Jan
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.