Transcript
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


Top Related