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

2x figure, einmal sichtbar, einmal nicht.

 

kerngehirn
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 15.01.2016, 14:59     Titel: 2x figure, einmal sichtbar, einmal nicht.
  Antworten mit Zitat      
Hallo zusammen,

ich benötige mal wieder Hilfe,

ich habe einen Code, in dem nacheinander erst ein plot erstellt wird, der angezeigt werden soll und anschließend ein Film erstellt wird, bei dem der plot nicht dargestellt werden soll, um die Geschwindigkeit der Schleife zu erhöhen und außerdem muss der plot nicht angezeigt werden, da die Schleife etwa 3000 Durchgänge hat und damit 3000 plots angezeigt werden würden.

Leider schaffe ich es nicht, dass der erste plot angezeigt wird und angezeigt bleibt und danach der Film erstellt wird. Folgend ist mein Ansatz:


Code:

figure(1);

plot(Linex, Liney, '--');

vidObj = VideoWriter('test.avi', 'Uncompressed AVI');
vidObj.FrameRate = 12;
open(vidObj);

set(figure(2),'Visible', 'off');
for i=1:Ende;
    figure(2);
    plot(Linex, Liney, '--')
    g = getframe(gcf);
    writeVideo(vidObj, g);
end
close(vidObj);
close(h);      
winopen('test.avi');
end
 


Ich würde mich über Hilfe freuen Smile
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 15.01.2016, 15:33     Titel:
  Antworten mit Zitat      
Hallo,

warum man etwas 3000x plotten lässt ohne es darzustellen erschließt sich mir zwar nicht, aber eine Möglichkeit wäre so:

Code:

figure(1);

plot(Linex, Liney, '--');

vidObj = VideoWriter('test.avi', 'Uncompressed AVI');
vidObj.FrameRate = 12;
open(vidObj);

hfig = figure(2);
set(hfig,'Visible', 'off')

for i=1:Ende;    
    plot(Linex, Liney, '--')
    g = getframe(gcf);
    writeVideo(vidObj, g);
end
close(vidObj);
close(h);      
winopen('test.avi');
 
 
Private Nachricht senden Benutzer-Profile anzeigen
 
kerngehirn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 15.01.2016, 17:04     Titel:
  Antworten mit Zitat      
Der plot ändert sich in jeder Instanz der for-Schleife und jeder plot wird als movie frame gespeichert. Daher der 3000-malige plot.

Zu deinem Lösungsversuch:

Das hatte ich auch schon versucht. Leider funktioniert das nicht. Es werden dabei zwar keine 3000 Fenster geöffnet, aber trotzdem 3000 plots dargestellt, nacheinander im gleichen Fenster.
Wenn ich innerhalb der for-Schleife ausblende wird immerhin nur die erste for-Instanz dargestellt. Das ist aber einerseits auch unerwünscht. Andererseits verstehe ich das aber auch Code-seitig nicht, dass diese erste Instanz geplottet wird.

Code:
figure(1);

plot(Linex, Liney, '--');

vidObj = VideoWriter('test.avi', 'Uncompressed AVI');
vidObj.FrameRate = 12;
open(vidObj);



for i=1:Ende;    
    hfig = figure(2);
    set(hfig,'Visible', 'off')
    plot(Linex, Liney, '--')
    g = getframe(gcf);
    writeVideo(vidObj, g);
end
close(vidObj);
close(h);      
winopen('test.avi');
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bitte Code-Beispiele wenn irgendwie möglich reproduzierbar halten, also entweder Beispieldaten zur Verfügung stellen oder durch Dummy-Daten ersetzen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 15.01.2016, 17:49     Titel:
  Antworten mit Zitat      
Code:
figure(1);
A = rand(30,1);
plot(A);

vidObj = VideoWriter('test.avi', 'Uncompressed AVI');
vidObj.FrameRate = 1;
open(vidObj);

B = rand(30,30);

hfig = figure(2);
set(hfig,'Visible', 'off')

for i=1:30;    
    hfig = figure(2);
    set(hfig,'Visible', 'off');
    plot(B(:,i));
    g = getframe(gcf);
    writeVideo(vidObj, g);
end
close(vidObj);      
winopen('test.avi');


Das wäre ein Minimalbeispiel.
So wie es jetzt da steht, wird figure 1 eingezeigt und figure 2 wird 30 mal kurz geöffnet und sofort wieder geschlossen.

[EDITED, Jan, Bitte kein Top-Quoting - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.01.2016, 20:00     Titel:
  Antworten mit Zitat      
Hallo,

wenn man Google bemüht, stößt man hierauf:
http://stackoverflow.com/questions/.....playing-using-videowriter

Angewendet auf dein Beispiel:
Code:
figure(1);
A = rand(30,1);
plot(A);

vidObj = VideoWriter('test.avi', 'Uncompressed AVI');
vidObj.FrameRate = 1;
open(vidObj);

B = rand(30,30);
hfig = figure(2);
set(hfig,'Visible', 'off')

for i=1:30;    
    plot(B(:,i));
      orig_mode = get(hfig, 'PaperPositionMode');
      set(hfig, 'PaperPositionMode', 'auto');
      cdata = hardcopy(hfig, '-Dzbuffer', '-r0');
      set(hfig, 'PaperPositionMode', orig_mode);
      currFrame = im2frame(cdata);
    writeVideo(vidObj, currFrame);
end
close(vidObj);      

winopen('test.avi');


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 16.01.2016, 14:15     Titel:
  Antworten mit Zitat      
Hi,

danke für die Hilfe. Google habe ich zur Genüge bemüht. Leider ohne Erfolg. Auch dein Tipp bringt nicht das, was ich möchte. Mit deinem Code, wird figure 1 kurz dargestellt und danach von figure 2 überschireben, die dann 30 mal nacheinander dargestellt wird. figure 1 soll aber angezeigt bleiben während figure 2 garnicht angezeigt wird, sondern im Hintergrund für das abgreifen des Movie frames laufen soll.

[EDITED, Jan, Bitte kein Top-Quoting - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2016, 14:45     Titel:
  Antworten mit Zitat      
Hallo,

das kann auch vom Release abhängen. Ich hatte gerade R2013b zur Hand, und da funktioniert es wie gewünscht. Ich kann nur empfehlen, das verwendete Release im Profil einzutragen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 16.01.2016, 14:49     Titel:
  Antworten mit Zitat      
Bei mir funktioniert es mit R2014b auch nicht wie gewünscht. Ich erhalte zusätzlich noch folgende Warnings:

Zitat:

Warning: The undocumented 'hardcopy' function will be removed in a future release of MATLAB; use the documented 'print' command instead.
> In C:\Program Files\MATLAB\R2014b\toolbox\matlab\graphics\hardcopy.p>hardcopy at 39
In untitled2 at 17
Warning: Zbuffer is not supported for printing, using OpenGL instead.
> In graphics\private\inputcheck at 237
In print at 156
In C:\Program Files\MATLAB\R2014b\toolbox\matlab\graphics\hardcopy.p>hardcopy at 62
In untitled2 at 17
Private Nachricht senden Benutzer-Profile anzeigen
 
kerngehirn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 16.01.2016, 15:08     Titel:
  Antworten mit Zitat      
Ich nutze R2015a und habe es auch mit R2016a ausprobiert. Bei beiden VErsionen passiert das gleiche. Zum einen bekomme ich die Warnung

Zitat:
Warning: Zbuffer is not supported for printing, using OpenGL instead.
> In inputcheck (line 259)
In print (line 41)
In hardcopy
In Untitled2 (line 17)
.

Zum anderen erhalte ich wie gesagt 30x die figure 2 auf dem Bildschirm und figure 1 wird überschrieben. Es muss doch eine Möglichkeit geben, in einer for Schleife die Ausgabe der figure zu unterdrücken ohne gleichzeitig eine andere figure ausserhalb der for Schleife zu beeinflussen. Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 16.01.2016, 15:52     Titel:
  Antworten mit Zitat      
Ich denke, ich habe eine Lösung gefunden. Zumindest funktioniert sie bei mir:

Code:

 figure(1);
A = rand(30,1);
plot(A);

vidObj = VideoWriter('test.avi', 'Uncompressed AVI');
vidObj.FrameRate = 1;
open(vidObj);

B = rand(30,30);
hfig = figure(2);
hline = plot(B(:,1));
set(hfig,'Visible', 'off','nextplot','replace') % sollte eigentlich auch ohne nextplot arg gehen

g = getframe(hfig);
writeVideo(vidObj, g);
   
for i=2:30;    
    set(hline,'YData',B(:,i)) % update plot (chart line) data
    drawnow
    g = getframe(hfig);
    writeVideo(vidObj, g);    
end
close(vidObj);      

winopen('test.avi');

 
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: 16.01.2016, 16:01     Titel:
  Antworten mit Zitat      
Hallo kerngehirn,

Man kann ein scihtbares Fenster verwenden, das man nicht sieht :-)
Code:
figure(1);
A = rand(30,1);
plot(A);

vidObj = VideoWriter('test.avi', 'Uncompressed AVI');
vidObj.FrameRate = 1;
open(vidObj);

B = rand(30,30);

hfig2 = figure('Units', 'pixels', 'Position', [5000, 10, 640, 480]);

for i=1:30;
   plot(B(:,i));
   g = getframe(hfig2);
   writeVideo(vidObj, g);
end
close(vidObj);
winopen('test.avi');

Unter Win7/64, Matlab R2015b läuft das gut.
Mit get(groot, 'MonitorPositions') kann man herausfinden, ob der User vielleicht 3 Monitore verwendet, so dass bei X=5000 doch noch ein sichtbarer Bereich ist.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 16.01.2016, 18:01     Titel:
  Antworten mit Zitat      
Das dürfe dann aber am Rechenbedarf für den Prozessor/Grafikprozessor nix ändern oder? Die Ausgabe wird ja trotzdem erstellt, nur halt irgendwo im Nirwana. Stimmt das?

[EDITED, Jan, Bitte kein Top-Quoting - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
kerngehirn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 16.01.2016, 18:07     Titel:
  Antworten mit Zitat      
Mir ist gerade ein Geistesblitz gekommen.

Ich setze die for-Schleife mit Videoerstellung einfach vor den plot, der sichtbar sein soll. Anstatt danach. Also einfach umdrehen.
Dann klappt alles so wie ich will.

Code:
vidObj = VideoWriter('test.avi', 'Uncompressed AVI');
vidObj.FrameRate = 1;
open(vidObj);

B = rand(30,30);

set(figure,'Visible', 'off')

for i=1:30;    
    plot(B(:,i));
    g = getframe(gcf);
    writeVideo(vidObj, g);
end
close(vidObj);      
winopen('test.avi');

figure
A = rand(30,1);
plot(A);


Sorry, dass ich euch damit belästigt habe. So einfach, dass ich mir an den Kopf fasse, dass ich da nicht bisher schon drauf kam. >.<

Danke & Grüße
kerngehirn
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 16.01.2016, 18:11     Titel:
  Antworten mit Zitat      
Das ist natürlich das Einfachste Wink. Tja...ist halt manchmal so, das einem das Offensichtliche nicht ins Auge fällt. Geht mir auch ab und zu so.

Ansonsten hatte ich dir noch eine Lösung gepostet, die keine Figure im Nirvana darstellt und trotzdem funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.