Pagina 1 di 1
c++ & V4L
Inviato: mar 16 ott 2007, 12:20
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.
Inviato: mar 16 ott 2007, 12:59
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
Inviato: mar 16 ott 2007, 13:08
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
Inviato: mar 16 ott 2007, 16:37
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...

Inviato: mar 16 ott 2007, 19:50
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;
}
Inviato: mar 16 ott 2007, 20:33
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
Inviato: mar 16 ott 2007, 22:35
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

(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
Inviato: mer 17 ott 2007, 9:05
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

(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