14
Version PDF de ce document : activite-qt-opencv.pdf OpenCV (Open Computer Vision) est une bibliothèque libre d’analyse d’images et de vision par ordinateur en langage C/C++, initialement développée par Intel, spécialisée dans le traitement d’images en temps réel. Cette bibliothèque libre est distribuée sous licence BSD. La bibliothèque OpenCV met à disposition de nombreuses fonctionnalités très diversifiées permettant de créer des programmes partant des données brutes pour aller jusqu’à la création d’interfaces graphiques basiques. Elle propose la plupart des opérations classiques en traitement bas niveau des images et des vidéos. Cette bibliothèque s’est imposée comme un standard dans le domaine de la recherche parce qu’elle propose un nombre important d’outils issus de l’état de l’art en vision des ordinateurs. La documentation d’OpenCV (cf. OpenCV API Reference ). Lien : OpenCV sous Ubuntu Pour installer les bibliothèques de développement d’OpenCV, il faudra faire : $ sudo apt-get install libopencv-dev C’est la version 3.2 qui sera installée sur une Ubuntu 18.04 : $ dpkg -l | grep opencv | tr -s '' ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3 d3.2 ii libopencv-calib3d3.2:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 computer vision Camera Calibration libr ary ii libopencv-contrib-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-contri b3.2 ii libopencv-contrib3.2:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 computer vision contrlib library ii libopencv-core-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-core3.2 ii libopencv-core3.2:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 computer vision core library ii libopencv-dev 3.2.0+dfsg-4ubuntu0.1 amd64 development files for opencv ... Capture vidéo avec OpenCV OpenCV Installation (Ubuntu)

Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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)

Page 2: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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

Page 3: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

$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)

Page 4: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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++

Page 5: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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

Page 6: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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;

Page 7: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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);

Page 8: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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() :

Page 9: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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

Page 10: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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

Page 11: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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

Page 12: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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");

Page 13: Capture vidéo avec OpenCVtvaira.free.fr/projets/activites/activite-qt-opencv.pdf · ii libopencv-calib3d-dev:amd64 3.2.0+dfsg-4ubuntu0.1 amd64 development files for libopencv-calib3

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