2012-02-18 9 views
7

Quando si esegue MATLAB in una modalità batch senza un display (ad esempio con la variabile di ambiente $DISPLAY UNIX non impostata, o con il flag matlab -nodisplay all'avvio), normalmente non è possibile utilizzare il renderizzatore opengl . Invece devi accontentarti del renderizzatore painters. Per esempio:Tutto il testo viene perso quando si usa il renderer openGL in modalità batch

>> print -dpng -opengl fig.png 
Warning: OpenGL mode can not be used in terminal emulation mode; ignoring option. 

Purtroppo, painters dà spesso scarsi risultati quando si lavora con le scene 3D con patch, l'illuminazione, la trasparenza, ecc .. Ecco un semplice esempio (si utilizza un display per ora) in cui si perde l'alfa:

peaks 
alpha(0.5) 
print -dpng -opengl peaks_opengl.png 
print -dpng -painters peaks_painters.png 

enter image description here


causa di queste limitazioni, ero molto emozionato per trovare la maggior parte privi di documenti-01.230.funzione MATLAB incorporata, che fa in qualche modo consente di utilizzare il renderer opengl senza un display. Questa funzione è alla base della straordinaria funzione export_fig(). Ora sono in grado di salvare molto rapidamente figure 3D di alta qualità in modalità batch.

Tuttavia, c'è un problema: Tutto il testo viene perso quando la cifra viene passata attraverso la funzione hardcopy(). Per esempio:

plot(1,1) 
title('TEST') 
>> A = hardcopy(gcf, '-Dopengl', '-r300'); 
Warning: Failed to draw text string 
> In /Applications/MATLAB_R2010b.app/toolbox/matlab/graphics/hardcopy.p>hardcopy at 21 

La figura uscita manca completamente qualsiasi testo (nessun asse zecche etichette e nessun titolo):

export_fig axis.png -opengl 

enter image description here

Quindi quello che sto chiedendo is: Come è possibile ottenere il renderer opengl per lavorare con il testo in modalità batch? C'è un modo per far funzionare il testo con la funzione hardcopy()? Forse un modo per rasterizzare il testo in anticipo? O un modo per combinare una copia del testo painters e una copia cartacea del opengl? In alternativa, c'è un percorso completamente diverso per fare questo lavoro rispetto alla funzione hardcopy()? Inoltre, è improbabile che il problema si verifichi con l'installazione del mio sistema, poiché è riproducibile sia con Mac OS che con Ubuntu.

+0

Hai letto questo [post di Mathworks] (http://www.mathworks.com/matlabcentral/newsreader/view_thread/300393) su un font di testo mancante? –

+0

@JuanMellado Grazie per la ricerca. Mi sono imbattuto in quel thread prima, ma non credo che il font sia un problema qui. Posso usare uno qualsiasi dei miei font in 'listfonts' e si esportano bene con i pittori sia in modalità interattiva che batch e con opengl in modalità interattiva. Non posso esserne sicuro, ma quell'altro thread avrebbe potuto confondere 2 problemi separati. –

risposta

8

Se si utilizza Linux, è possibile utilizzare un software di rendering OpenGL (le versioni moderne di Matlab ne hanno una in bundle). Tale opzione non esiste per Mac OS, almeno non con le attuali versioni Matlab. Windows è facile: anche la modalità batch esegue un display, quindi puoi lavorare come al solito.

  1. Eseguire Xvfb :1 &, che crea un server X framebuffer (virtuale).
  2. Prepara il tuo codice in qualche file, dire bla.m:

    opengl software; 
    peaks 
    alpha(0.5); 
    print -dpng -opengl peaks_opengl.png 
    exit 
    

    Non è molto importante per dimenticare opengl software, come si immagina.

  3. Eseguire il seguente comando:

    cat bla.m | matlab -display :1 -logfile log.txt 
    

    che rende Matlab eseguire qualsiasi di in bla.m, sul display virtuale, e scrive qualunque Matlab uscite in log.txt. È possibile rilasciare il file di registro quando tutto sembra funzionare. Inoltre, tieni presente che lo :display :1 deve corrispondere al numero fornito nel numero di chiamata Xvfb.

  4. Profitto.

+0

Bello! 'Xvfb' si adatta perfettamente alle mie esigenze. Non posso credere di non averlo mai visto prima. Grazie. –

Problemi correlati