Il modo migliore per memorizzare le modifiche al movimento per ridurre la memoria

3

Sto confrontando jpeg con jpeg in un costante "flusso video". Sto usando EMGU / OpenCV per confrontare ogni pixel a livello di byte. Ci sono 3 canali per ogni immagine (RGB). Ho sentito che è pratica comune memorizzare solo i pixel che sono cambiati tra i frame come un modo di conservare lo spazio della memoria. Ma, se per esempio, dico che OGNI pixel è cambiato (per favore nota che sto usando un esempio esagerato per fare il mio punto e normalmente scarterei le modifiche così grandi). Quindi i byte risultanti salvati sono 3 volte più grandi del jpeg originale.

Come posso memorizzare tali cambiamenti di movimento in modo efficiente?

    
posta Andrew Simpson 20.10.2013 - 09:51
fonte

2 risposte

2

Un po 'che indica se stai memorizzando le modifiche dall'ultimo frame o da un nuovo frame e memorizza qualsiasi opzione consuma meno memoria.

Puoi memorizzare un jpeg (o qualsiasi altro formato in realtà, se possibile per il tuo scopo dato che jpeg è troppo ottimistico per quello) dell'immagine che rappresenta le modifiche o un semplice jpeg del fotogramma successivo, e indicare usando un aggiunto bit quale formato hai usato.

Ovviamente, potresti (e secondo i tuoi commenti sembrano) avere dei vincoli che ti impediscono di usare questo approccio. In ogni caso, questo è più o meno l'approccio utilizzato nei formati video MPEG.

Cerca i frame I ("Frame / slice" codificati) e i frame P ("Frame / slice previsti") in questo articolo di Wikipedia - Tipi di immagini di compressione video

    
risposta data 20.10.2013 - 10:10
fonte
1

Da quello che ricordo, i codec di famiglia JPEG e MPEG / H264 rappresentano internamente le immagini nello spazio colore YCbCr (non RGB), dove Y è la luminanza e Cb con Cr sono i componenti della crominanza. Mentre viene utilizzato ogni pixel del componente Y, la crominanza viene ridotta in base a uno dei pochi schemi possibili. Il guadagno di compressione principale in JPEG (e nei fotogrammi chiave dei codec di movimento) viene ottenuto mediante la quantizzazione dei risultati DCT, il che significa eliminare le componenti ad alta frequenza di ciascun blocco di immagine. Per comprimere le differenze tra i fotogrammi causati dal movimento, la previsione del movimento viene utilizzata nel componente di luminanza (prima del DCT). Molto brevemente, ogni fotogramma è diviso in blocchi regolari di pixel e ogni blocco del fotogramma corrente viene confrontato con i pixel del fotogramma precedente per trovare la corrispondenza più simile. Questo produce il vettore di spostamento (vettore di movimento). Poiché la corrispondenza non è ideale, le differenze di valori dei pixel in ciascuna delle componenti Y, Cb e Cr vengono passate attraverso la normale compressione JPEG (DCT, quantizzazione, codifica Huffman) e inviate lungo il vettore di movimento per formare un Delta Frame.

Qui troverai alcuni suggerimenti per ulteriori ricerche. Spero che non dovrai reinventare la ruota. Esistono alcuni strumenti di elaborazione delle immagini Linux / Unix che potresti sfruttare per il tuo compito.

    
risposta data 22.10.2013 - 03:43
fonte

Leggi altre domande sui tag