c++ & V4L

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

c++ & V4L

Messaggio da tgmx »

Ciao Ragazzi,

sto cercando di sviluppare una piccola applicazione (c++) che acquisisca una immagine da una webcam usb (già riconosciuta con driver spca).
In pratica non ho capito bene come si tira fuori un'immagine dal dispositivo /dev/video0 .

Qualcuno ha avuto esperienze al riguardo? Magari esistono delle librerie che fanno questo lavoro senza che mi metto a trattare a mano i byte che escono dalla webcam... :)


Grazie.

bit123
Linux 2.x
Linux 2.x
Messaggi: 350
Iscritto il: dom 27 nov 2005, 16:26
Località: Catania
Contatta:

Messaggio da bit123 »

Be, potresti dare una spulciata a questo sito, tanto per cominciare
http://www.smcc.demon.nl/camstream/
Se invece vuoi partire da zero credo tu debba dare un'occhiata al sito di V4L.

Qui ci sono le API:
http://www.linuxtv.org/v4lwiki/index.php/Main_Page

Avatar utente
Strarivari
Linux 0.x
Linux 0.x
Messaggi: 96
Iscritto il: lun 5 dic 2005, 14:50
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: KDE 3.5.10

Messaggio da Strarivari »

Ciao,

una libreria con la quale il tutto e piuttosto semplice sarebbe opencv (la trovi su slacky)

Dai un occhiata alla documentazione, in particolare alla libreria highgui, dove trovi anche esempi

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio da tgmx »

Strarivari ha scritto:Ciao,

una libreria con la quale il tutto e piuttosto semplice sarebbe opencv (la trovi su slacky)

Dai un occhiata alla documentazione, in particolare alla libreria highgui, dove trovi anche esempi
Sembra che faccia al caso mio se non altro per le potenzialità di elaborazione delle immagini. Per quanto riguarda l'acquisizione da webcam non ho ancora capito come si fa ma a giudicare dalla documentazione sembra possibile... :)

Avatar utente
Strarivari
Linux 0.x
Linux 0.x
Messaggi: 96
Iscritto il: lun 5 dic 2005, 14:50
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: KDE 3.5.10

Messaggio da Strarivari »

il tutto e trasparente rispetto al vero sistema che ce sotto (v4l su linux e directx su windows). Vantaggio e appunto l'indipendenza dal sistema operativo (si puo preservare anche usando qt o wxwidgets se la libreria highgui e troppo limitata per il prorpio scopo), svantaggio e che puoi fare poco se ci sono problemi.

comunque trovi molto a riguardo, ecco un piccolo esempio

Codice: Seleziona tutto

#include <cv.h>
#include <highgui.h>
#include <iostream>

int main(int argc, char* argv[])
{
//la finestra su cui visulizzare il tutto usando la libreria highgui, molto limitata
	char* window = "Camera";
cvNamedWindow(window, CV_WINDOW_AUTOSIZE);

//Qua entra in gioco la webcam, praticmante devi solo sceglierla 0 per la prima nel sistema 
CvCapture* capture;
capture = cvCaptureFromCAM(0);
//l'immagine dove salvare il buffer della webcam
IplImage* image;
while (cvWaitKey(1) != 'e') { 
image = cvQueryFrame(capture); // Kombination von cvGrabFrame und
cvShowImage(window, image); 
};
std::cout << image->width << "," << image-> height << std::endl;
cvWaitKey(0);
cvDestroyWindow(window);
return 0;
}

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio da tgmx »

Strarivari ha scritto:il tutto e trasparente rispetto al vero sistema che ce sotto (v4l su linux e directx su windows). Vantaggio e appunto l'indipendenza dal sistema operativo (si puo preservare anche usando qt o wxwidgets se la libreria highgui e troppo limitata per il prorpio scopo), svantaggio e che puoi fare poco se ci sono problemi.

comunque trovi molto a riguardo, ecco un piccolo esempio

Codice: Seleziona tutto

#include <cv.h>
#include <highgui.h>
#include <iostream>

int main(int argc, char* argv[])
{
//la finestra su cui visulizzare il tutto usando la libreria highgui, molto limitata
	char* window = "Camera";
cvNamedWindow(window, CV_WINDOW_AUTOSIZE);

//Qua entra in gioco la webcam, praticmante devi solo sceglierla 0 per la prima nel sistema 
CvCapture* capture;
capture = cvCaptureFromCAM(0);
//l'immagine dove salvare il buffer della webcam
IplImage* image;
while (cvWaitKey(1) != 'e') { 
image = cvQueryFrame(capture); // Kombination von cvGrabFrame und
cvShowImage(window, image); 
};
std::cout << image->width << "," << image-> height << std::endl;
cvWaitKey(0);
cvDestroyWindow(window);
return 0;
}
WOW! Veramente notevole.

Stasera mi sono guardato tutti gli esempi che si trovano nella documentazione e devo dire che non potevate cosigliarmi delle librerie migliori.

Ora devo capire come integrarle in applicazioni QT, o meglio, come visualizzare l'output del tuo esempio in una dialog QT.
Se hai delle dritte da darmi mi sarebbero molto utili comunque domani ci perdo un po' di tempo e vediamo cosa viene fuori... :)

Grazie

Avatar utente
Strarivari
Linux 0.x
Linux 0.x
Messaggi: 96
Iscritto il: lun 5 dic 2005, 14:50
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: KDE 3.5.10

Messaggio da Strarivari »

io a suo tempo dovevo scegliere tra wxwidgets e qt e visto che ai tempi il pacchetto di qt4 no c'era su slacky optai per wxwidgets :D (che ha anche una licenza piu favorevole per l'autore imho)

comunque credo che "l'idea" si possa usare anche con qt:
praticamente prendi il buffer dell'immagine in formato IplImage e crei un bitmap della tua toolkit e il gioco e fatto visto che poi per visualizzarlo pui procedere in maniera standard per il tuo toolkit. Questo e un esempio di wxwidgets per far vedere che il punto chiave e imageData

Codice: Seleziona tutto

wximage1.Create(image->width, image->height, (unsigned char*) image->imageData ,(unsigned char*) image->alphaChannel , true);


Non ho praticamente esperienza con qt e sono un paio d'anni che non lo uso quindi non posso essere piu concreto ma credo che cosi si possa risolvere senza problemi. Poi bisogna badare al fatto che il tutto usa i colori nello spazio bgr mentre probabilmente qt come wxwdgets usa rgb e la versione windows va "specchiata", comunque sono dettagli che si possono risolvere con le funzioni di opencv. Per quanto riguarda il framegrabbing e la visualizzazione si potrebbero usare threads, timer o un event che si ricrea a ogni chiamata

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio da tgmx »

Strarivari ha scritto:io a suo tempo dovevo scegliere tra wxwidgets e qt e visto che ai tempi il pacchetto di qt4 no c'era su slacky optai per wxwidgets :D (che ha anche una licenza piu favorevole per l'autore imho)

comunque credo che "l'idea" si possa usare anche con qt:
praticamente prendi il buffer dell'immagine in formato IplImage e crei un bitmap della tua toolkit e il gioco e fatto visto che poi per visualizzarlo pui procedere in maniera standard per il tuo toolkit. Questo e un esempio di wxwidgets per far vedere che il punto chiave e imageData

Codice: Seleziona tutto

wximage1.Create(image->width, image->height, (unsigned char*) image->imageData ,(unsigned char*) image->alphaChannel , true);


Non ho praticamente esperienza con qt e sono un paio d'anni che non lo uso quindi non posso essere piu concreto ma credo che cosi si possa risolvere senza problemi. Poi bisogna badare al fatto che il tutto usa i colori nello spazio bgr mentre probabilmente qt come wxwdgets usa rgb e la versione windows va "specchiata", comunque sono dettagli che si possono risolvere con le funzioni di opencv. Per quanto riguarda il framegrabbing e la visualizzazione si potrebbero usare threads, timer o un event che si ricrea a ogni chiamata
Io al contrario ho sempre usato QT quindi non so come funzionano le wxwidgets ma il concetto è chiaro.

Ti ringrazio molto. Sei stato molto utile.

Grazie

Rispondi