[AGGIORNATO CON RISPOSTA PARZIALE]
Ecco il mio codice:Ottieni frame dal video con libvlc smem e convertilo in opencv Mat. (C++)
void cbVideoPrerender(void *p_video_data, uint8_t **pp_pixel_buffer, int size) {
// Locking
imageMutex.lock();
videoBuffer = (uint8_t *)malloc(size);
*pp_pixel_buffer = videoBuffer;
}
void cbVideoPostrender(void *p_video_data, uint8_t *p_pixel_buffer
, int width, int height, int pixel_pitch, int size, int64_t pts) {
// Unlocking
imageMutex.unlock();
Mat img = Mat(Size(width,height), CV_8UC3, p_pixel_buffer);
//cvtColor(img,img,CV_RGB2BGR);
}
int main(int argc, char ** argv)
{
libvlc_instance_t * inst;
char smem_options[1000];
sprintf(smem_options
, "#transcode{vcodec=RV24}:smem{"
"video-prerender-callback=%lld,"
"video-postrender-callback=%lld,"
"video-data=%lld,"
"no-time-sync},"
, (long long int)(intptr_t)(void*)&cbVideoPrerender
, (long long int)(intptr_t)(void*)&cbVideoPostrender //This would normally be useful data, 100 is just test data
, (long long int)200 //Test data
);
const char * const vlc_args[] = {
"-I", "dummy", // Don't use any interface
"--ignore-config", // Don't use VLC's config
"--extraintf=logger", // Log anything
"--verbose=1", // Be verbose
"--sout", smem_options // Stream to memory
};
// We launch VLC
inst = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args);
...
return 0;
}
domanda aggiornato
ho controllato le mie due funzioni di callback sembrano eseguite correttamente.
_Che tipo di dati RV32 emette esattamente? Si colloca il CV_8U3C (8bits unsigned int 3 canali richiesto qui _DO ho bisogno di aggiungere un passaggio per la mia classe di Mat (passo -?? Numero di byte occupa ogni riga della matrice)
UPDATED2
ho cambiato RV32 a RV24 che ha più senso. Aggiungo cvtColor perché la matrice Mat sembra aver bisogno di BGR pixel e non RGB ma l'immagine non è visualizzata correttamente
_C'è un vcodec che mi darebbe un formato YUV come output in modo da poter testare il pixel dati prima di provare ad emettere un opencv :: Mat img?
[EDIT OUTPUT IMG] (Cambiando il tipo vlc in CV_8UC4 a quattro canali (non so perché) possiamo quasi vedere il fotogramma ma in veramente povero qua Perché è così?
[SOLUZIONE]
ho scoperto che le immagini all'inizio del mio video erano di scarsa qualità è per questo che il mio Mat imshow() mi ha mostrato una cosa brutta il codice di cui sopra dovrebbe funzionare ora (Apperently senza bisogno di cvtColor)
afaik, i pixel sono in p_pixel_buffer, non in p_video_data. inoltre, non dovrebbe lo sblocco() passare * dopo * l'impostazione dei pixel del Mat? – berak
Anch'io ho avuto questo pensiero, ma come posso assegnare il mio array di pixel al costruttore Mat? – grll
nello stesso modo, lo fai ora. basta cambiare i nomi dei corrieri – berak