Newsgroup: it.comp.software.divx
Titolo: [HELP] AutoGK Assistant -> Autocrop

Con la v1.60 di AutoGK è stato affiancato l'Assistant, che è
un'evoluzione delle Hidden Options. Tra le opzioni c'è l'autocrop, ma
purtroppo non è allegata alcuna spiegazione.
C'è una barra scorrevole chiamata threshold che va da 0 a 256 e che di
default è settata a 34 e che non capisco a cosa si riferisca (righe?
ma allora dovrebbero essere 576..).
Ora, io ho un VCR Panasonic che converte le VHS in DVD-Ram/DVD-R.
Io preferisco usare i DVD-Ram perchè sono riscrivibili, e quel che
ottengo sono dei file .VRO che di fatto sono degli MPEG2+AC3, basta
rinominarli .MPG e AutoGK li comprime senza fare una piega.
Ho dato in pasto all'AutoGK un film in 16:9 non anamorfico preso da
Studio Univeral ed ho attivato l'autocrop senza alterare il valore di
threshold. Ho solo impostato il frame esatto da cui partiva il film,
perchè prima c'era qualche secondo di logo a 4:3.
Con mia (piacevole) sorpresa, il divx ottenuto è uscito perfettamente
croppato e con questi valori:
Filesize.....: 702 MB (or 719,214 KB or 736,475,136 bytes)
Runtime......: 01:24:00 (126,008 fr)
Video Codec..: DivX 5.0
Video Bitrate: 1042 kb/s
FPS..........: 25.000
Audio Codec..: 0x0055(MP3) ID'd as MPEG-1 Layer 3
Audio Bitrate: 119 kb/s (59/ch, stereo) VBR LAME3.90.
°
Frame Size...: 608x336 (1.81:1) [=38:21]
File Status..: File Length Correct (click for more info...)
Però a me piacerebbe sapere come gestire il valore di threshold e non
andare alla cieca, perchè mi capiterà mille volte di avere VHS con
formati intermedi che vorrò croppare bene.
Qualcuno mi sa aiutare?
-- 
Paradoxally,
Jan AxHell

 ma allora dovrebbero essere 576..).
be', non posso dirlo con certezza (non ho mai visto AutoGK), ma il
problema con cui si scontra chi scrive un algoritmo di "autocrop"
e' che in un filmato (specie se acquisito) il nero dei bordi non e'
mai esattamente nero (e' ingenuo pensare di trovarci dei pixel aventi
come valori RGB una tripla (0,0,0), che e' appunto il nero assoluto),
ma ci saranno tutta una serie di colori che l'occhio vede neri, e che
invece hanno valori "bassi"; il problema e' quindi:
qual e' la soglia per decidere se un colore va trattato come nero?
io l'ho definita empiricamente: ho fatto qualche acquisizione con la
mia scheda di film dalla tv che avevano le bande nere sopra e sotto,
poi ho "tarato" la soglia su tali acquisizioni...
secondo me la soglia di cui parli (threshold vuol dire soglia) ha
proprio il significato che ti ho detto
 


Hai ragione, non ci avevo pensato! E' sicuramente cosě (come ad
esempio nelle funzioni di maschera in Photoshop, che ti consentono una
soglia di colore entro cui stare e non un colore singolo e netto).
Allora non mi devo preoccupare, temevo che fosse un valore relativo
alle linee. In passato ho visto film che includevano anche parte delle
"originali" bande nere, ma evidentemente erano stati croppati male a
mano o usando qualche setting fisso basato sul numero di linee da
tagliare. Grazie!
-- 
Paradoxally,
Jan AxHell

 toh, che coincidenza! ieri ho implementato un algoritmo analogo
Opensource? Se si dove lo posso trovare?
Grazie, Giubbe
-- 
HomePage e FAQ: 
http://giubbe.altervista.org
Inutile scrivere in privato, non ricevo le email 

 Opensource? Se si dove lo posso trovare?
si' e no, perche' l'ho scritto in un linguaggio sperimentale non ancora
pienamente sviluppato (nessuna parte del codice sorgente e' "chiusa",
tuttavia e' un sistema intricato: non lo si puo' compilare partendo da
zero, perche' il compilatore di tale linguaggio e' scritto nel
linguaggio stesso :-) questa cosa si chiama "bootstrap" e vale anche
per i compilatori C che perlopiu' sono scritti in C...)
comunque, se ti interessa l'algoritmo di autocrop, l'ho scritto per un
programma che uso per convertire in divx filmati acquisiti dalla tv (un
programma con semplice interfaccia grafica che usa mencoder come
back-end per codificare), e ne metto l'ultima versione precompilata per
windows su questa pagina:
http://fsinapsi.altervista.org/code/mjpeg2divx
il codice sorgente non e' aggiornato (lo faro' alla prossima
occasione), la documentazione e' tutta da riscrivere, l'eseguibile
precompilato per linux non l'ho ancora messo...
insomma, l'unica cosa aggiornata e' l'eseguibile precompilato per
windows (lo usano mio fratello e Lord Kap :-))
il nome del programma e' mjpeg2divx perche' quando l'ho scritto avevo
questa esigenza: codificare in divx (sotto linux) i filmati acquisiti
con la mia scheda, che sono appunto AVI/MJPEG; poi pero', visto che era
facile, ho aggiunto anche il supporto agli AVI/DV
(
http://libdv.sourceforge.net
), quindi il programma permette di
lavorare anche su filmati provenienti da videocamere... le cose che
permette di fare sono editazioni molto semplici, come eliminare o
spostare pezzi di filmato (e' utile soprattutto per togliere
pubblicita'), croppare, calcolare automaticamente le dimensioni
mantenendo il corretto rapporto, calcolare automaticamente il bitrate
potendo scegliere tra molti criteri (ad esempio, gli puoi dire: "voglio
che stia su un cd da 80 min") e cose del genere... non permette niente
di leggermente piu' sofisticato, come ad esempio montaggi con effetti
tipo dissolvenze... ho gia' scritto il supporto per consentire
titolazioni (da fonti truetype), ma non l'ho ancora attivato: devo
scrivere l'interfaccia grafica e mi fa fatica...
ah, visto che era semplicissimo, ho aggiunto il supporto a MPEG-2
(
http://libmpeg2.sourceforge.net
), il che adesso gli permette di
lavorare su AVI/MPEG2 che in teoria non esistono, ma in pratica e'
possibile costruirli (le librerie che gestiscono AVI lo consentono; ad
esempio, mencoder, quando rippa un DVD, crea un AVI contenente
esattamente il suo MPEG-2), quindi, anche se l'ho usato solo una volta
per provare, posso copiare su hard disk un dvd con mencoder, ottenendo
un AVI/MPEG-2, e poi portarlo in divx con il mio programma...
comunque, il supporto a MPEG-2 non e' ancora perfetto: la libreria (di
cui ho indicato il link) e' carina e veloce, ma non consente un accesso
preciso frame per frame (ogni volta che ci si sposta sul filmato, ha
bisogno di resincronizzarsi sul "prossimo GOP", e questo rende molto
difficile la gestione di questo tipo di filmati nelle editazioni: in
altre parole, si possono croppare e codificare senza problemi, ma
finche' non risolvo tale questione, e' meglio non tagliarli :-)
l'autocrop e' un'idea che mi e' venuta la scorsa settimana grazie a
Lord Kap, che mi ha fatto notare quanto sia scomodo il modo in cui e'
gestito il crop dal programma...
allora ho pensato di rendere il programma capace di individuare da
solo i bordi...
ecco, questa e' la parte di programma che ho scritto per fare cio';
credo che nessuno ci capira' molto, trattandosi di un linguaggio
ignoto (forse chi conosce il Lisp puo' capire la sintassi);
comunque e' un algoritmo moooooolto rudimentale: in pratica sono
quattro pezzi uguali (uno per ogni bordo); in ogni pezzo, vengono
controllate le strisce (righe o colonne) a partire dal bordo: se
tutti i pixel appartenenti alla striscia sono "scuri", si passa
alla successiva; ci si ferma su una striscia che abbia almeno un
pixel sufficientemente "chiaro"; in questo ambiente i livelli di
colore RGB variano da 0 a 65535, quindi la regola che ho usato
(tarandola su acquisizioni fatte con la mia scheda) e' questa:
"un pixel e' da considerarsi scuro se la somma dei livelli delle
componenti RGB non supera 30000".
tutto qua :-)
se qualcuno avesse delle idee, le dica pure
(defnet edit-autocrop ()
        (deflocal x y x1 y1 color r g b found)
        (set found false)
        (for x in 0 .. (- _wi 1) do
                (gc)
                (for y in 0 .. (- _hi 1) do
                        (set color (pix-get-color _pm x y))
                        (set r (color-red color))
                        (set g (color-green color))
                        (set b (color-blue color))
                        (if (> (+ r g b) 30000)
                        then    (set found true) )
                        until found )
                until found )
        (set x1 x)
        (gtk-spin-button-set-value _edit_spin_x x1)
        (set found false)
        (for x in x1 .. (- _wi 1) rev do
                (gc)
                (for y in 0 .. (- _hi 1) do
                        (set color (pix-get-color _pm x y))
                        (set r (color-red color))
                        (set g (color-green color))
                        (set b (color-blue color))
                        (if (> (+ r g b) 30000)
                        then    (set found true) )
                        until found )
                until found )
        (gtk-spin-button-set-value _edit_spin_width (+ 1 (- x x1)))
        (set found false)
        (for y in 0 .. (- _hi 1) do
                (gc)
                (for x in 0 .. (- _wi 1) do
                        (set color (pix-get-color _pm x y))
                        (set r (color-red color))
                        (set g (color-green color))
                        (set b (color-blue color))
                        (if (> (+ r g b) 30000)
                        then    (set found true) )
                        until found )
                until found )
        (set y1 y)
        (gtk-spin-button-set-value _edit_spin_y y1)
        (set found false)
        (for y in y1 .. (- _hi 1) rev do
                (gc)
                (for x in 0 .. (- _wi 1) do
                        (set color (pix-get-color _pm x y))
                        (set r (color-red color))
                        (set g (color-green color))
                        (set b (color-blue color))
                        (if (> (+ r g b) 30000)
                        then    (set found true) )
                        until found )
                until found )
        (gtk-spin-button-set-value _edit_spin_height (+ 1 (- y y1)))
        (gc) )

 componenti RGB non supera 30000".
ah, mi sono accorto di una cosa: Jan AxHell ha scritto che la soglia
di default di AutoGK e' 34...
riportando la soglia 30000 che ho trovato io in una scala 0-255,
viene circa 39, che e' un po' piu' alto, ma non di molto...
purtroppo, usando valori inferiori, su alcune acquisizioni non mi
riconosce i bordi come tali; pero' c'e' il rischio, che, applicando
l'algoritmo su frame scuri (che non hanno pixel chiari sui loro
effettivi bordi, in modo da far da contrasto ai bordi indesiderati),
l'algoritmo tagli fuori anche parte del quadro...
vorra' dire che mettero' la soglia come "parametro definibile
dall'utente", cosi' Lord Kap ci mettera' il valore che funziona
meglio con la sua scheda Pinnacle :-)

 
Ti ringrazio moltissimo, come sempre sei molto preciso nelle spiegazioni.
A me interessava solo il codice sorgente che non trovo difficile (dopo
aver studiato i linguaggi funzionali...)
Una curiosità, come si chiama il linguaggio?
A che serve il comando (gc)?
Mò scarico anch'io il programma e così saremo in tre ad utilizzarlo... ^_^


 Mò scarico anch'io il programma e così saremo in tre ad utilizzarlo... ^_^
se preferisci, stasera mettero' l'eseguibile ELF per linux (cosi'
eviti di scaricare tutte quelle DLL, gtk per windows ecc; sotto
linux dovresti gia' avere tutte le librerie dinamiche che servono,
al limite ti manca sqlite3 che puoi scaricare da 
www.sqlite.org
)
inoltre la versione linux sara' almeno il 50% piu' veloce (il
pipe tra il programma e mencoder e' gestito meglio di parecchio)
ho messo qui una schermatina del programma:
http://fsinapsi.altervista.org/extra/lastexile.jpg
da cui si puo' osservare l'area incorniciata (a colori invertiti)
che e' stata individuata dall'algoritmo che ho riportato nel
precedente post...
ho fatto cosi': ho cliccato su Cropping->Crop_automatico e
immediatamente e' comparsa la cornice nella posizione giusta, e sono
comparsi i valori 5-699 e 52-449 negli "spin button" in basso a
sinistra; il logo di MTV ha avuto l'effetto di stoppare l'algoritmo
sul bordo orizzontale superiore... in effetti, ancora non so cosa sia
meglio fare in questi casi... di solito, io lascio il logo intero, ma
ho visto che altre persone lo segano a meta' (a me pare peggio...);
c'e' anche un opzione per "togliere" il logo, pero' "togliere" e'
una parola grossa! in realta' effettua un "rimescolamento" con i
colori adiacenti; in tal modo, in alcune scene sembra che il logo
sia sparito, ma non e' granche'...

                         (if (> (+ r g b) 30000)
questa mi sembra un pochino meglio:
(regola 2)
"un pixel e' da considerarsi scuro se ciascuno dei livelli delle
componenti RGB non supera 10000".
                        (if (or (> r 10000) (> g 10000) (> b 10000))
per esempio, il colore (0,0,30000) e' un blu che viene considerato
"scuro" dalla regola 1, ma non dalla regola 2; insomma, la seconda
regola e' piu' "mirata"...
(*)
(in termini geometrici, se immaginiamo lo spazio di colori RGB48
come un cubo, la regola 2 definisce i colori scuri come un cubo
piu' piccolo avente un vertice in comune con quello piu' grande
(il vertice che corrisponde al nero), mentre la regola 1
definisce un tetraedro piu' grande che contiene il cubo della
regola 2 (il centro della quarta faccia obliqua del tetraedro
coincide con il vertice del quadrato che corrisponde al colore
grigio (10000,10000,10000)))

 eviti di scaricare tutte quelle DLL, gtk per windows ecc; 
Perfetto, grazie


 Perfetto, grazie
l'ho messo ieri sera; queste sono le librerie dinamiche, dacci
un'occhiata: puo' darsi che ti manchi qualcosa (libsqlite3,
libdv, libmpeg2, libmpeg2convert), in tal caso fammi sapere
cosa ti manca e ti dico dove prenderle
        libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x40031000)
        libgtk-1.2.so.0 => /usr/lib/libgtk-1.2.so.0 (0x4007b000)
        libgdk-1.2.so.0 => /usr/lib/libgdk-1.2.so.0 (0x401d5000)
        libgmodule-1.2.so.0 => /usr/lib/libgmodule-1.2.so.0 (0x4020e000)
        libglib-1.2.so.0 => /usr/lib/libglib-1.2.so.0 (0x40211000)
        libdl.so.2 => /lib/libdl.so.2 (0x40237000)
        libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0x4023a000)
        libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40243000)
        libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40251000)
        libm.so.6 => /lib/i686/libm.so.6 (0x4032f000)
        libdv.so.4 => /usr/local/lib/libdv.so.4 (0x40351000)
        libpng12.so.0 => /usr/lib/libpng12.so.0 (0x40378000)
        libz.so.1 => /usr/lib/libz.so.1 (0x4039b000)
        libsqlite3.so.0 => /usr/local/lib/libsqlite3.so.0 (0x403aa000)
        libmpeg2.so.0 => /usr/local/lib/libmpeg2.so.0 (0x403ed000)
        libmpeg2convert.so.0 => /usr/local/lib/libmpeg2convert.so.0
(0x4040b000)
        libgmp.so.3 => /usr/lib/libgmp.so.3 (0x40412000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        libpthread.so.0 => /lib/i686/libpthread.so.0 (0x4043e000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

 in articoli dello stesso Attardi...
magari dai un'occhiata a questo:
http://handsoff.infomedia.it/cgi-bin/lwgate/JIA/archives/jia.log.0109/Subject/
article-6.html
e' un messaggio di Attardi di 3 anni fa:
------------------------------------------------------
C++ non prevede affatto la garbage collection.
Nel 1994 ho sviluppato una tecnica di GC per il C++,
chiamato CMM (
www.di.unipi.it/~attardi/cmm.html
),
che presentai alla Usenix C++ Conference,
che ? piaciuto molto a Stroustrup, che si disse convinto che
a questo punto la tecnica era matura per essere utilizzata in C++.
Ma a chi piacque molto di pi? fu Bill Joy di Sun Microsystems,
che lo sugger? al gruppo in Sun Engineering che stava sviluppando
il linguaggio Oak.
Loro scaricarino il codice dal mio sito e lo utilizzarono nella
prima versione di Oak.
Poi come sapete Oak venne rinominato in Java e da l? in poi
il GC ha preso piede ovunque.
-- Beppe
------------------------------------------------------
non sapevo che avesse scritto il gc di java :-)
cmq le tecniche di gc descritte negli articoli non sono molto
adatte al mio linguaggio, per vari motivi

 meglio con la sua scheda Pinnacle :-)
Lo sai che mi diverto a fare il beta tester, eh! ;)
-- 
Saluti, Kap - ICQ 19857429 - ¥'s Fan #01 - 
www.lordkap.it
 - VCC
Un'avventura è soltanto un fastidio considerato nel modo giusto. Un
fastidio è soltanto un'avventura considerata nel modo sbagliato.
Gilbert Keith Chesterton

 windows (lo usano mio fratello e Lord Kap :-))
Con molta soddisfazione, devo dire! ;)
-- 
Saluti, Kap - ICQ 19857429 - ¥'s Fan #01 - 
www.lordkap.it
 - VCC
I malvagi obbediscono per paura; i buoni, per amore. - Aristotele

 Lo sai che mi diverto a fare il beta tester, eh! ;)
alla fine ho fatto cosi' :-) ho messo un parametro "soglia autocrop"
cosi' ognuno ci mette il valore che preferisce:
0=riconosce solo i bordi assolutamente neri
255=riconosce tutto, e quindi croppa tutto (lascia solo un punto)
38=valore che forse va bene con la pinnacle (da provare)
48=valore che uso io con la marvel

48=valore che uso io con la marvel
Giusto per la cronaca, il 34 che ho usato con AutoGK ha croppato
anche il logo di StudioUniversal, che era molto più chiaro del resto,
ma ricadeva totalmente nella banda nera superiore senza sforare dentro
l'immagine. Secondo te AutoGK ha fatto una media tra colore-banda e
colore-logo o ha visto che la maggior parte di schermo fino a quella
riga era scuro e ha "ucciso" il logo, riconoscendolo appunto come tale
(cioè gruppo di punti chiari di numero trascurabile rispetto all'area
globale di punti scuri) ?
-- 
Paradoxally,
Jan AxHell

 globale di punti scuri) ?
non ne ho idea. forse non controlla punto per punto, ma solo la media
finale di tutta la riga, o forse usa altri criteri...
ad esempio, potrebbe sfruttare il fatto che i bordi dovrebbero essere
simmetrici, cioe' lo spessore del bordo superiore dovrebbe piu' o meno
coincidere con quello inferiore; in piu', il programmatore potrebbe avere
previsto l'eventualita' di un logo presente su uno dei bordi, cercando
di capire se il frame puo' essere suddiviso in due zone (suddivise da
righe scure), una delle quali piu' grande e centrale (che e' quella che
interessa)...
il semplice criterio di fare la media di tutta la riga e confrontarla
con la soglia, a me non piace, perche' se il frame a cui viene applicato
l'algoritmo ha una zona scura su un bordo, e in tale zona scura e'
presente anche un piccolissimo trattino piu' chiaro, vorrei che
l'algoritmo si arrestasse, cosa che non avverrebbe nel caso della media.
se hai voglia/tempo prova a vedere cosa fa quando il logo si trova un
po' fuori e un po' dentro al quadro.
in ogni caso grazie, al caso che hai riportato non ci avevo ancora
pensato :-)

pensato :-)
yeah :)
-- 
Paradoxally,
Jan AxHell