Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
VersionPDFdecedocument:activite-qt-opencv.pdf
OpenCV(OpenComputerVision)estunebibliothèquelibred’analysed’imagesetdevisionparordinateurenlangageC/C++,initialementdéveloppéeparIntel,spécialiséedansletraitementd’imagesentempsréel.CettebibliothèquelibreestdistribuéesouslicenceBSD.
LabibliothèqueOpenCVmetàdispositiondenombreusesfonctionnalitéstrèsdiversifiéespermettantdecréerdesprogrammespartantdesdonnéesbrutespourallerjusqu’àlacréationd’interfacesgraphiquesbasiques.Elleproposelaplupartdesopérationsclassiquesentraitementbasniveaudesimagesetdesvidéos.Cettebibliothèques’estimposéecommeunstandarddansledomainedelarechercheparcequ’elleproposeunnombreimportantd’outilsissusdel’étatdel’artenvisiondesordinateurs.
Ladocumentationd’OpenCV(cf.OpenCVAPIReference).
Lien:OpenCVsousUbuntu
Pourinstallerlesbibliothèquesdedéveloppementd’OpenCV,ilfaudrafaire:
$sudoapt-getinstalllibopencv-dev
C’estlaversion3.2quiserainstalléesuruneUbuntu18.04:
$dpkg-l|grepopencv|tr-s''iilibopencv-calib3d-dev:amd643.2.0+dfsg-4ubuntu0.1amd64developmentfilesforlibopencv-calib3d3.2iilibopencv-calib3d3.2:amd643.2.0+dfsg-4ubuntu0.1amd64computervisionCameraCalibrationlibraryiilibopencv-contrib-dev:amd643.2.0+dfsg-4ubuntu0.1amd64developmentfilesforlibopencv-contrib3.2iilibopencv-contrib3.2:amd643.2.0+dfsg-4ubuntu0.1amd64computervisioncontrliblibraryiilibopencv-core-dev:amd643.2.0+dfsg-4ubuntu0.1amd64developmentfilesforlibopencv-core3.2iilibopencv-core3.2:amd643.2.0+dfsg-4ubuntu0.1amd64computervisioncorelibraryiilibopencv-dev3.2.0+dfsg-4ubuntu0.1amd64developmentfilesforopencv...
CapturevidéoavecOpenCV
OpenCV
Installation(Ubuntu)
Etlaversion2.4suruneUbuntu16.04:
$dpkg-l|grepopencv|tr-s''iilibopencv-calib3d-dev:amd642.4.9.1+dfsg-1.5ubuntu1.1amd64developmentfilesforlibopencv-calib3diilibopencv-calib3d2.4v5:amd642.4.9.1+dfsg-1.5ubuntu1.1amd64computervisionCameraCalibrationlibraryiilibopencv-contrib-dev:amd642.4.9.1+dfsg-1.5ubuntu1.1amd64developmentfilesforlibopencv-contribiilibopencv-contrib2.4v5:amd642.4.9.1+dfsg-1.5ubuntu1.1amd64computervisioncontriblibraryiilibopencv-core-dev:amd642.4.9.1+dfsg-1.5ubuntu1.1amd64developmentfilesforlibopencv-coreiilibopencv-core2.4v5:amd642.4.9.1+dfsg-1.5ubuntu1.1amd64computervisioncorelibraryiilibopencv-dev2.4.9.1+dfsg-1.5ubuntu1.1amd64developmentfilesforopencv
Lesoptionsdecompilationseront:
Ubuntu18.04:
$pkg-config--cflags--libsopencv-I/usr/include/opencv-lopencv_shape-lopencv_stitching-lopencv_superres-lopencv_videostab-lopencv_aruco-lopencv_bgsegm-lopencv_bioinspired-lopencv_ccalib-lopencv_datasets-lopencv_dpm-lopencv_face-lopencv_freetype-lopencv_fuzzy-lopencv_hdf-lopencv_line_descriptor-lopencv_optflow-lopencv_video-lopencv_plot-lopencv_reg-lopencv_saliency-lopencv_stereo-lopencv_structured_light-lopencv_phase_unwrapping-lopencv_rgbd-lopencv_viz-lopencv_surface_matching-lopencv_text-lopencv_ximgproc-lopencv_calib3d-lopencv_features2d-lopencv_flann-lopencv_xobjdetect-lopencv_objdetect-lopencv_ml-lopencv_xphoto-lopencv_highgui-lopencv_videoio-lopencv_imgcodecs-lopencv_photo-lopencv_imgproc-lopencv_core
Ubuntu16.04:
$pkg-config--cflags--libsopencv-I/usr/include/opencv-lopencv_calib3d-lopencv_contrib-lopencv_core-lopencv_features2d-lopencv_flann-lopencv_gpu-lopencv_highgui-lopencv_imgproc-lopencv_legacy-lopencv_ml-lopencv_objdetect-lopencv_ocl-lopencv_photo-lopencv_stitching-lopencv_superres-lopencv_ts-lopencv_video-lopencv_videostab
Lesfichiersd’en-têtessontinstalléesdanslesrépertoires /usr/include/opencv et/usr/include/opencv2 :
$ls-l/usr/include/opencvtotal44-rw-r--r--1rootroot2523mai122017cvaux.h-rw-r--r--1rootroot2374mai122017cvaux.hpp-rw-r--r--1rootroot3153mai122017cv.h-rw-r--r--1rootroot2649mai122017cv.hpp-rw-r--r--1rootroot2176mai122017cvwimage.h-rw-r--r--1rootroot2424mai122017cxcore.h-rw-r--r--1rootroot2443mai122017cxcore.hpp-rw-r--r--1rootroot2257mai122017cxeigen.hpp-rw-r--r--1rootroot129mai122017cxmisc.h-rw-r--r--1rootroot2226mai122017highgui.h-rw-r--r--1rootroot2145mai122017ml.h
$ls-l/usr/include/opencv2...
Onajouteral’installationdeVideo4Linuxpourlapriseenchargedespériphériquescaméras:
$sudoapt-getinstalllibv4l-devv4l-utils
L’utilitaire v4l2-ctl permetdecontrôlerlespériphériquesVideo4Linux:
$v4l2-ctl--list-deviceUSB2.0Camera:HDUSBCamera(usb-0000:00:14.0-2):/dev/video0
$v4l2-ctl--all...
$v4l2-ctl-d0--list-formats-extioctl:VIDIOC_ENUM_FMTIndex:0Type:VideoCapturePixelFormat:'MJPG'(compressed)Name:Motion-JPEGSize:Discrete1600x1200Interval:Discrete0.067s(15.000fps)Size:Discrete2592x1944Interval:Discrete0.067s(15.000fps)Size:Discrete2048x1536Interval:Discrete0.067s(15.000fps)Size:Discrete1920x1080Interval:Discrete0.033s(30.000fps)Size:Discrete1280x1024Interval:Discrete0.067s(15.000fps)Size:Discrete1280x720Interval:Discrete0.033s(30.000fps)Size:Discrete1024x768Interval:Discrete0.033s(30.000fps)Size:Discrete800x600Interval:Discrete0.033s(30.000fps)Size:Discrete640x480Interval:Discrete0.033s(30.000fps)Size:Discrete1600x1200Interval:Discrete0.067s(15.000fps)
Index:1Type:VideoCapturePixelFormat:'YUYV'Name:YUYV4:2:2Size:Discrete1600x1200Interval:Discrete0.200s(5.000fps)Size:Discrete2592x1944Interval:Discrete0.333s(3.000fps)Size:Discrete2048x1536Interval:Discrete0.250s(4.000fps)Size:Discrete1920x1080Interval:Discrete0.200s(5.000fps)Size:Discrete1280x1024Interval:Discrete0.111s(9.000fps)
Size:Discrete1280x720Interval:Discrete0.200s(5.000fps)Size:Discrete1024x768Interval:Discrete0.100s(10.000fps)Size:Discrete800x600Interval:Discrete0.050s(20.000fps)Size:Discrete640x480Interval:Discrete0.033s(30.000fps)Size:Discrete1600x1200Interval:Discrete0.200s(5.000fps)
$v4l2-ctl-d0--list-formats-ext|grep-E"Size"|tr-s''|cut-d''-f3|sort|uniq|sed's/^\s*//'1024x7681280x10241280x7201600x12001920x10802048x15362592x1944640x480800x600
OpenCVfournituneAPICpourl’acquisitionvidéoenprovenanced’unecaméraoud’unfichier.EnC,onutiliseradonclesappels cvCaptureFromCAM() ou cvCaptureFromFile() quiretournentunpointeursurunestructure CvCapture .Enfindeprogramme,ilnefaudrapasoublierdelelibérerenappelantcvReleaseCapture() .
Pourréaliserune‘capture’,l’APICmetànotredisposition3fonctions:
intcvGrabFrame(CvCapture*capture) quiréalisel’acquisitiondelaprochaineimage(frame)dufichiervidéooudelacaméraetrenvoievrai(nonnul)encasdesuccès.IplImage*cvRetrieveFrame(CvCapture*capture,intstreamIdx=0) quidécodeetrenvoiel’image(frame)précedemmentacquise(grab).Siiln’yaaucuneimage(caméradéconnectée,ouplusd’imagesdanslefichiervidéo),lafonctionretourneunpointeur NULL .IplImage*cvQueryFrame(CvCapture*capture) quiregroupeles2fonctionsprécédentes( cvGrabFrame() et cvRetrieveFrame() )enunseulappelcequilarendpluspratique.
Pourl’affichage,onutiliseral’appel cvNamedWindow() pourcréerunefenêtreet cvShowImage() pourvisualiserl’image(frame).OpencvfournitaussidesfonctionspoursauvegarderlesimagescommecvSaveImage() .
cf.ladocumentationdel’APIsurdocs.opencv.org.
QuelquesactivitéssurOpenCV:Miseenoeuvred’OpenCVouaussi
EnC++,OpenCVfournituneclasse VideoCapture pourl’acquisitionvidéoenprovenanced’unecaméraoud’unfichier.Onutiliseralaméthode open() pourouvrirlefluxvidéodelacaméra.
Pourréaliserune‘capture’,l’APIC++metànotredisposition3méthodes:
boolVideoCapture::grab() quiréalisel’acquisitiondelaprochaineimage(frame)dufichiervidéoou
APIC
APIC++
delacaméraetrenvoievrai( true )encasdesuccès.boolVideoCapture::retrieve(Mat&image,intchannel=0) quidécodeetrenvoiel’image(frame)précedemmentacquise(grab).Siiln’yaaucuneimage(caméradéconnectée,ouplusd’imagesdanslefichiervidéo),lafonctionretournefaux( false ).boolVideoCapture::read(Mat&image) quiregroupeles2fonctionsprécédentes( cvGrabFrame() et cvRetrieveFrame() )enunseulappelcequilarendpluspratique.L’opérateur>> peutaussiêtreutilisé.
Pourmanipulerdesimages,OpenCVutiliseuneclasse Mat (cf.cv::Mat).
Pourl’affichagedesimages,onutiliseralaméthode cv::imshow() .Opencvfournitaussidesméthodespourliredesimagescomme imread() etpourlessauvegarderavec imwrite() .
cf.ladocumentationdel’APIsurdocs.opencv.org.
QuelquesactivitéssurOpenCV:Miseenoeuvred’OpenCVouaussi
Ici,ilfautassurerl’acquisitionpériodiqued’imagesdansuneapplicationGUI.L’acquisitionnécessitedefaireunebouclepourcapturerlesimagescequibloqueraitlethreadprincipalGUI.
Uneapprochesimplisteseraitd’appeler processEvents() danslaboucled’acquisitionpourcontinueràtraiterlesévénementsauniveaudelaGUI.
Unemeilleuresolutionseraitderéaliserlapartieacquisitiond’imagesdansunthreadséparé.
Onvacréeruneclasse TAcquisitionVideo quihériteradelaclasse QThread :
classTAcquisitionVideo:publicQThread{Q_OBJECTpublic:TAcquisitionVideo();~TAcquisitionVideo();
voidrun();
voidgetProprietes(constVideoCapture&camera)const;voidsetProprietes(VideoCapture&camera);voidsetResolution(intresolution);voidsetBrightness(doublebrightness);voidsetContrast(doublecontrast);voidsetSaturation(doublesaturation);
private:intresolution;doublebrightness;doublecontrast;doublesaturation;boolchange;
signals:voidnouvelleFrame(Matframe);voidnouvelleImage(QImageimage);
OpenCVetQt5Acquisition
voidnouvelleImage(QPixmappixmap);voidnouveauMessage(QStringmessage);
publicslots:
};
Laclasse VideoCapture d’OpenCVfournitdesméthodes get() et set() permettantsuccessivementd’obtenirouderéglercertainsparamétresdelacaméra(résolution,luminosité,contraste,saturation,…).
Onajouteaussidessignauxquipermettrontdecommuniqueravecl’IHM.L‘“image”capturéeparOpenCVestfourniesouslaformed’untype Mat .Ilfaudrapourl’afficherlaconvertirentypeQt: QImage et QPixmap .Lechoixdépendradel’usagequiserafaitdel‘“image”capturée(affichage,traitement,…).
Pourutiliserletype Mat danslemécanismesignal/slotdeQt,ilfaudraledéclarercommeunnouveautypeMETAdelamanièresuivante:
//Danslefichierd'en-tête.hQ_DECLARE_METATYPE(Mat);
//Danslefichierdedéfinition.cppqRegisterMetaType<Mat>();
Lecodeduthreadsetrouveradanslaméthode run() :
#include"tacquisitionvideo.h"
TAcquisitionVideo::TAcquisitionVideo():resolution(RES_1024_768),brightness(0.5),contrast(0.5),saturation(0.5),change(false){qDebug()<<Q_FUNC_INFO;}
TAcquisitionVideo::~TAcquisitionVideo(){qDebug()<<Q_FUNC_INFO;}
//LecodeduthreadvoidTAcquisitionVideo::run(){qDebug()<<Q_FUNC_INFO<<"start";this->setPriority(QThread::NormalPriority);
try{VideoCapturecamera(0);//0->lapremièrecaméradétectéesoit/dev/video0Matframe;//uneimage
setProprietes(camera);//paramétragedespropriétésdelacaméra(résolution,...)
//boucled'acquisitiondesframeswhile(camera.isOpened()&&!isInterruptionRequested()){//captureuneimagecamera>>frame;
if(frame.empty())continue;//ou:/*boolbSuccess=camera.read(frame);if(!bSuccess)continue;*/
//icionl'envoiesousformed'unMat:emitnouvelleFrame(frame);
//ou://QImageimage(frame.data,frame.cols,frame.rows,frame.step,QImage::Format_RGB888);//emitnouvelleImage(image);//QPixmappixmap=QPixmap::fromImage(QImage(frame.data,frame.cols,frame.rows,frame.step,QImage::Format_RGB888).rgbSwapped());//emitnouvelleImage(pixmap);
//unepropriétédoitêtremodifiée?if(change)setProprietes(camera);}}catch(...){//fairequelquechoseaveclesexceptions}
qDebug()<<Q_FUNC_INFO<<"stop";}
//ExempledelecturedeparamétresdelacaméravoidTAcquisitionVideo::getProprietes(constVideoCapture&camera){QStringmessage="FRAME_WIDTH="+QString::number(camera.get(CV_CAP_PROP_FRAME_WIDTH))+"\n";message+="FRAME_WIDTH="+QString::number(camera.get(CV_CAP_PROP_FRAME_HEIGHT))+"\n";message+="FPS="+QString::number(camera.get(CV_CAP_PROP_FPS))+"\n";message+="BRIGHTNESS="+QString::number(camera.get(CV_CAP_PROP_BRIGHTNESS))+"\n";message+="CONTRAST="+QString::number(camera.get(CV_CAP_PROP_CONTRAST))+"\n";message+="SATURATION="+QString::number(camera.get(CV_CAP_PROP_SATURATION));nouveauMessage(message);}
//ExempledeparamétragedelacaméravoidTAcquisitionVideo::setProprietes(VideoCapture&camera){switch(resolution){//...caseRES_1024_768:camera.set(CV_CAP_PROP_FRAME_WIDTH,1024);camera.set(CV_CAP_PROP_FRAME_HEIGHT,768);break;caseRES_800_600:camera.set(CV_CAP_PROP_FRAME_WIDTH,800);camera.set(CV_CAP_PROP_FRAME_HEIGHT,600);break;caseRES_640_480:camera.set(CV_CAP_PROP_FRAME_WIDTH,640);
camera.set(CV_CAP_PROP_FRAME_HEIGHT,480);break;caseRES_320_240:camera.set(CV_CAP_PROP_FRAME_WIDTH,320);camera.set(CV_CAP_PROP_FRAME_HEIGHT,240);break;}
camera.set(CV_CAP_PROP_BRIGHTNESS,brightness);camera.set(CV_CAP_PROP_CONTRAST,contrast);camera.set(CV_CAP_PROP_SATURATION,saturation);change=false;getProprietes(camera);}
voidTAcquisitionVideo::setResolution(intresolution){this->resolution=resolution;change=true;}
voidTAcquisitionVideo::setBrightness(doublebrightness){this->brightness=brightness;change=true;}
voidTAcquisitionVideo::setContrast(doublecontrast){this->contrast=contrast;change=true;}
voidTAcquisitionVideo::setSaturation(doublesaturation){this->saturation=saturation;change=true;}
Pourcréeretdémarrerunthreadd’acquisition,ilsuffitdefaire:
TAcquisitionVideo*acquisition;
acquisition=newTAcquisitionVideo();connect(acquisition,SIGNAL(nouvelleFrame(Mat)),this,SLOT(afficherFrame(Mat)));//ou://connect(acquisition,SIGNAL(nouvelleImage(QImage)),this,SLOT(afficherImage(QImage)));//connect(acquisition,SIGNAL(nouvelleImage(QPixmap)),this,SLOT(afficherImage(QPixmap)));connect(acquisition,SIGNAL(nouveauMessage(QString)),this,SLOT(afficherMessage(QString)));acquisition->start();
Onappeleralaméthode start() pourdémarrerlethread.C’estlaméthode start() quisecharged’exécuterlaméthode run() delaclasse TAcquisitionVideo .
Pourarrêterlethreadd’acquisition,ilsuffitd’appelerlaméthode requestInterruption() puisd’attendrel’arrêteffectifavec wait() :
disconnect(acquisition,SIGNAL(nouvelleFrame(Mat)),this,SLOT(afficherFrame(Mat)));//ou://disconnect(acquisition,SIGNAL(nouvelleImage(QImage)),this,SLOT(afficherImage(QImage)));//disconnect(acquisition,SIGNAL(nouvelleImage(QPixmap)),this,SLOT(afficherImage(QPixmap)));acquisition->requestInterruption();acquisition->wait();disconnect(acquisition,SIGNAL(nouveauMessage(QString)),this,SLOT(afficherMessage(QString)));deleteacquisition;acquisition=NULL;//ounullptr
Lethreadréalisel’acquisitiond’imageetlestransmetparsignalQtàlaGUI.Ilfautdoncunslotdanscelle-cipour,parexemple,afficherlesimagescapturées.
SousQt,onutiliseraunobjet QLabel pourassurerl’affichagedesframesdansl’IHM.
Àpartird’uneframedetype Mat ou IplImage ,ilfautpouvoirlaconvertirdansuntypeQt(ici QImage ).
Pourcela,onpeut:
seservirdelaméthodeIpl2QImage()quipermetdeconvertiruneimageOpenCVdetype IplImage versuneimageQtdetype QImage .
Matframe;
//capturedelaframe(voirplushaut)...puis:IplImage*img=newIplImage(frame);
QImageimage=Ipl2QImage(img);imageLabel->setPixmap(QPixmap::fromImage(image));imageLabel->resize(imageLabel->pixmap()->size());
plussimplement:
QImageimage(frame.data,frame.cols,frame.rows,frame.step,QImage::Format_RGB888);imageLabel->setPixmap(QPixmap::fromImage(image.rgbSwapped()));imageLabel->resize(imageLabel->pixmap()->size());
L’espacecolorimétriqued’OpenCVpardéfautestBGR(Bleu-Vert-Rouge),ilfaudraalorspermuterlescanauxrougeetbleupourobteniruneimageRGBstandard.Onutiliseraaudépartle Format_RGB888 puisonpermuteralescanauxbleuetrougedansle QImage avec rgbSwapped() .
Lecodeci-dessusseraàplacerdansunslotdelaGUI.
L’enregistrementd’uneimagedansunfichierseraréaliséaveclafonction imwrite() fournieparOpenCV:
if(capturePhoto){QStringnom="photo-"+QString::number(numeroPhoto)+".jpg";imwrite(nom.toStdString().c_str(),frame);numeroPhoto++;capturePhoto=false;}
Affichage
OpenCVfournitunefonction putText() quipermetd’inséreruntextedansuneimage Mat :
//Insertiond'untexteenblancQStringtexte="Untexte!";putText(frame,texte->text().toStdString().c_str(),Point(0,60),FONT_HERSHEY_PLAIN,5,Scalar(255,255,255),3,LINE_AA);
OpenCVfournitunensembledefonctionspourdessinerdansuneimage.
Parexemplepourdessineruneciblerougeaucentredel’image:
line(frame,Point(frame.cols/2,(frame.rows/2)-40),Point(frame.cols/2,(frame.rows/2)+40),Scalar(0,0,255),2);line(frame,Point((frame.cols/2)-40),frame.rows/2),Point((frame.cols/2)+40),frame.rows/2),Scalar(0,0,255),2);circle(frame,Point(frame.cols/2,frame.rows/2),30,Scalar(0,0,255),2);
OpenCVestunebibliothèquedédiéeautraitementd’imagequicomprendplusieurscentainesd’algorithmes.
OpenCVaunestructuremodulaire,dontlesmodulessuivants:
imgproc:unmoduledetraitementd’imagequicomprendlefiltraged’imageslinéaireetnonlinéaire,lestransformationsd’imagesgéométriques(redimensionnement,déformationaffineetperspective,…),conversiond’espacecolorimétrique,leshistogrammes,etc.vidéo:unmoduled’analysevidéoquicomprenddesalgorithmesd’estimationdemouvement,desoustractiond’arrière-planetdesuivid’objets.objdetect:détectiond’objetsetd’instancesdesclassesprédéfinies(parexemple,visages,yeux,tasses,personnes,voitures,etc.).
Exemple:détectiondecontours
LefiltredeCanny(oudétecteurdeCanny)estutiliséentraitementd’imagespourladétectiondescontours.L’algorithmeaétéconçuparJohnCannyen1986.
Ilfauttoutd’abordconvertirl’imageenniveaudegris.
Matgray,edge;
cvtColor(frame,gray,CV_BGR2GRAY);
Ensuite,onréduitlebruitdel’imageoriginale:
blur(gray,edge,Size(3,3));
Onpeutaussiutiliserunfiltregaussien:
GaussianBlur(gray,edge,Size(5,5),1.5);
Incrustation
Unpeudetraitementd’image
Aprèslefiltrage,onappliqueungradientquiretournel’intensitédescontours.Ladifférenciationdescontourssurlacartegénéréesefaitparseuillageàhystérésis.Celanécessitedeuxseuils,unhautetunbas;quiserontcomparésàl’intensitédugradientdechaquepoint.
Canny(gray,edge,100,200,3);
Onpeutessayerdecalculerlesvaleursdesseuilsautomatiquement,parexemple:
doubleseuil=threshold(edge,img,0,255,CV_THRESH_BINARY|CV_THRESH_OTSU);doubleseuilHaut=seuil;doubleseuilBas=seuil*0.5;Canny(gray,edge,seuilBas,seuilHaut,3);
Pourfinir,ilfautconvertirl’image(attentionleformatachangépuisqu’onestpasséenniveaudegris):
edge.convertTo(frame,CV_8U);format=QImage::Format_Grayscale8;
QImageimage(frame.data,frame.cols,frame.rows,frame.step,format);imageLabel->setPixmap(QPixmap::fromImage(image.rgbSwapped()));
Caractéristiquesdelacaméra
OpenCVfournitlesméthodes get() et set() pourmanipulerlespropriétésdelacaméra:
qDebug()<<camera.get(CV_CAP_PROP_FRAME_WIDTH);qDebug()<<camera.get(CV_CAP_PROP_FRAME_HEIGHT);qDebug()<<camera.get(CV_CAP_PROP_FPS);//...
camera.set(CV_CAP_PROP_FRAME_WIDTH,1024);camera.set(CV_CAP_PROP_FRAME_HEIGHT,768);
MaisOpenCVnefournitaucunefonctionpourconnaitrelalistedesformats,résolutions,…supportésparlacaméra.
Pourcela,onpeututiliserlesupportmultimédiadansQt5.IlestfourniparlemoduleQtMultimedia.L’APImultimédiaQt(C++etQML)fournituncertainnombredeclassespourgérerdescamérasetainsiaccéderauximagesetauxvidéosdecespériphériques.
Lemodulemultimédiaregroupentquatrecomposantsprincipaux:l’audio,lavidéo,laradioetlacaméra.
PourutiliserlesclassesdeQtMultimedia,ilfautdoncajouteraufichierdeprojet .pro :
QT+=multimedia
D’autrepart,ilfaudraaussidisposerdumodule multimedia pourledéveloppement(etdespluginspourlescodecs):
$sudoapt-getinstallqtmultimedia5-devqtmultimedia5-examplesqtmultimedia5-docqml-module-qtmultimedia
LaclasseQCameraInfopermetdedéterminerlenombredecamérasdétectéesetaccèderàquelquesinformations:
intnbCameras=QCameraInfo::availableCameras().count();qDebug()<<"Caméra(s)disponible(s)"<<QCameraInfo::availableCameras().count();if(nbCameras>0){QList<QCameraInfo>cameras=QCameraInfo::availableCameras();foreach(constQCameraInfo&cameraInfo,cameras){listeCameras->addItem(cameraInfo.deviceName());qDebug()<<"Device"<<cameraInfo.deviceName();qDebug()<<"Description"<<cameraInfo.description();if(cameraInfo.position()==QCamera::FrontFace)qDebug()<<"Position:FrontFace";elseif(cameraInfo.position()==QCamera::BackFace)qDebug()<<"Position:BackFace";}}
L’utilisationd’unobjetQMediaRecorderassociéàunobjetdetypeQCamerapermetd’accèderauxcaractéristiquesd’unecaméra:
QCamera*camera=newQCamera("/dev/video0");
QCameraInfo*cameraInfo=newQCameraInfo(*camera);qDebug()<<cameraInfo->description()<<cameraInfo->deviceName();camera->load();QMediaRecorder*captureVideo=newQMediaRecorder(camera,this);qDebug()<<"CaptureVideoavailable"<<captureVideo->isAvailable();qDebug()<<"CaptureVideocodecs"<<captureVideo->supportedVideoCodecs();qDebug()<<"CaptureVideocontainers"<<captureVideo->supportedContainers();qDebug()<<"CaptureVideoresolution(s)"<<captureVideo->supportedResolutions();qDebug()<<"CaptureVideoframerate(s)"<<captureVideo->supportedFrameRates();deletecameraInfo;deletecamera;
Codesource:qt5-camera-usb.zip
Voiraussi:Miseenoeuvred’unecaméraUSBsousQt
qt-opencv-camera-usb.zip
Codesource
Miseenoeuvred’OpenCVavecunecaméraIPOpenCV/QtavecunecaméraIPMiseenoeuvred’unecaméraUSBsousQt
Retourausommaire
Voiraussi