2011-12-05 4 views
6

[Nota: Questa è una riscrittura di un earlier question che è stata considerata inappropriata e chiuso.]Raccomandazioni per analisi in tempo reale a livello di pixel della televisione (TV) il video

ho bisogno di fare un po 'di analisi a livello di pixel di televisione (TV) video. La natura esatta di questa analisi non è pertinente, ma fondamentalmente comporta la visualizzazione di ogni pixel di ogni fotogramma di video TV, a partire da un flusso di trasporto MPEG-2. La piattaforma host sarà macchine Linux a 64 bit multiprocessore a livello di server.

Ho bisogno di una libreria in grado di gestire la decodifica del flusso di trasporto e di presentarmi i dati dell'immagine in tempo reale. OpenCV e ffmpeg sono due librerie che sto prendendo in considerazione per questo lavoro. OpenCV è attraente perché ho sentito che ha API facili da utilizzare e un ricco supporto per l'analisi delle immagini, ma non ho esperienza nell'usarlo. Ho usato ffmpeg in passato per estrarre i dati dei frame video dai file per l'analisi, ma manca il supporto per l'analisi delle immagini (sebbene l'IPP di Intel possa essere integrato).

Oltre alle raccomandazioni di carattere generale per gli approcci a questo problema (esclusa l'analisi immagine reale), ho alcune domande più specifiche che mi avrebbe aiutato a iniziare:

  1. Sono ffmpeg o OpenCV comunemente usati nell'industria come una base per l'analisi video in tempo reale o c'è qualcos'altro che dovrei guardare?
  2. Can OpenCV può decodificare i fotogrammi video in tempo reale, lasciando comunque sufficiente CPU per eseguire analisi di immagini non banali, anche in tempo reale?
  3. È sufficiente utilizzare ffpmeg per la decodifica del flusso di trasporto MPEG-2 o è preferibile utilizzare semplicemente una libreria di decodifica MPEG-2 direttamente (e in tal caso, quale)?
  4. Ci sono particolari formati di pixel per i frame di output che ffmpeg o OpenCV è particolarmente efficiente nella produzione (come RGB, YUV o YUV422, ecc.)?
+0

Molte delle domande relative alle prestazioni che hai chiesto dipendono esclusivamente dall'hardware che stai utilizzando. – karlphillip

+0

@karlphillip Mi rendo conto che la scelta della piattaforma avrà un impatto sulle prestazioni, ma non influirebbe ugualmente su tutte le opzioni della libreria? Altrimenti, e puoi parlare di come una scelta di piattaforma potrebbe avvantaggiare una biblioteca più di un'altra, per favore condividi. L'hardware non è stato ancora acquistato, quindi questa informazione è preziosa. –

+0

Ho fatto analisi di fotogrammi webcam in tempo reale con opencv usando il wrapper C++. È passato attraverso ogni pixel e controllato il colore, è stato piuttosto veloce, perché sono stato in grado di eseguire altre applicazioni come Opera e un'applicazione di visualizzazione 3D. Lavorando su Linux. –

risposta

6

1.
Consiglio vivamente OpenCV per l'analisi delle immagini "in tempo reale". Presumo che in tempo reale ci si riferisca alla capacità di tenere il passo con i frame rate della TV (ad esempio, NTSC (29,97 fps) o PAL (25 fps)). Naturalmente, come menzionato nei commenti, dipende sicuramente dall'hardware disponibile e dalla dimensione dell'immagine SD (480p) rispetto a HD (720p o 1080p). FFmpeg ha certamente le sue peculiarità, ma difficilmente potresti trovare un'alternativa migliore. La sua potenza e flessibilità sono piuttosto impressionanti; Sono sicuro che questo è uno dei motivi per cui gli sviluppatori di OpenCV hanno deciso di usarlo come back-end per la decodifica/codifica video con OpenCV.

2.
non ho visto problemi con latenza elevata durante l'utilizzo OpenCV per la decodifica. Quanta latenza può avere il tuo sistema? Se è necessario aumentare le prestazioni, prendere in considerazione l'utilizzo di thread separati per l'acquisizione/decodifica e l'analisi delle immagini. Dato che hai menzionato il fatto di avere sistemi multiprocessore, questo dovrebbe sfruttare maggiormente le tue capacità di elaborazione. Raccomanderei senz'altro di utilizzare l'ultima architettura Intel Core-i7 (o forse l'equivalente Xeon) in quanto ciò offre le migliori prestazioni oggi disponibili.

Ho usato OpenCV su diversi sistemi embedded, quindi sono abbastanza familiare con il tuo desiderio di prestazioni di punta. Ho trovato molte volte che non era necessario elaborare un'immagine full frame (specialmente quando si cerca di determinare le maschere). Raccomando caldamente di campionare le immagini se stai elaborando in modo difficile i tuoi stream video acquisiti.Questo a volte può darti istantaneamente un aumento della velocità di 4-8X (a seconda del tuo fattore di campionamento). Anche sul fronte delle prestazioni, raccomanderei senz'altro l'uso di Intel IPP. Poiché OpenCV era originariamente un progetto Intel, IPP e OpenCV si fondono molto bene insieme.

Infine, poiché l'elaborazione delle immagini è uno di quei campi di problemi "imbarazzanti paralleli", non dimenticare la possibilità di utilizzare GPU come acceleratore hardware per i tuoi problemi, se necessario. OpenCV ha svolto molto lavoro in quest'area ultimamente, quindi dovresti avere quegli strumenti a tua disposizione se necessario.

3.
Penso FFmpeg sarebbe un buon punto di partenza; la maggior parte delle alternative che posso pensare (Handbrake, mencoder, ecc.) tendono ad usare ffmpeg come back-end, ma sembra che tu potresti probabilmente eseguire il tuo proprio con la libreria IPP Video Coding se lo desideri.

4.
rappresentazione interna di OpenCV di colori è BGR a meno che non si utilizza qualcosa come cvtColor per convertirlo. Se vuoi vedere un elenco dei formati pixel supportati da FFmpeg, è possibile eseguire

ffmpeg -pix_fmts 

per vedere che cosa può input e output.

+0

Approfondimenti davvero utili, @mevatron. Grazie mille. –

3

Solo per il 4 ° domanda:

flussi video sono codificati in un formato 422: YUV, YUV422, YCbCr, ecc convertendoli in BGR e ritorno (per la ri-codifica) divora un sacco di tempo. Quindi, se riesci a scrivere i tuoi algoritmi per l'esecuzione su YUV, otterrai un miglioramento istantaneo delle prestazioni.

Nota 1. Mentre OpenCV supporta in modo nativo le immagini BGR, è possibile renderlo elaborato YUV, con una certa cura e conoscenza dei suoi interni.

Ad esempio, se si desidera rilevare alcune persone nel video, basta prendere la metà superiore del buffer video decodificato (contiene la rappresentazione in scala di grigi dell'immagine) ed elaborarlo.

Nota 2. Se si desidera accedere all'immagine YUV in opencv, è necessario utilizzare l'API ffmpeg direttamente nella propria app. OpenCV impone la conversione da YUV a BGR nella sua API VideoCapture.

+0

Buone informazioni. Grazie. –