learning image processing with opencv - droppdftools to develop new projects creating an opencv c++...
TRANSCRIPT
![Page 1: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/1.jpg)
![Page 2: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/2.jpg)
![Page 3: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/3.jpg)
LearningImageProcessingwithOpenCV
![Page 4: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/4.jpg)
TableofContents
LearningImageProcessingwithOpenCV
Credits
AbouttheAuthors
AbouttheReviewers
www.PacktPub.com
Supportfiles,eBooks,discountoffers,andmore
Whysubscribe?
FreeaccessforPacktaccountholders
Preface
Whatthisbookcovers
Whatyouneedforthisbook
Whothisbookisfor
Conventions
Readerfeedback
Customersupport
Downloadingtheexamplecode
Downloadingthecolorimagesofthisbook
Errata
Piracy
Questions
1.HandlingImageandVideoFiles
AnintroductiontoOpenCV
DownloadingandinstallingOpenCV
GettingacompilerandsettingCMake
ConfiguringOpenCVwithCMake
Compilingandinstallingthelibrary
ThestructureofOpenCV
CreatinguserprojectswithOpenCV
Generalusageofthelibrary
![Page 5: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/5.jpg)
Toolstodevelopnewprojects
CreatinganOpenCVC++programwithQtCreator
Readingandwritingimagefiles
ThebasicAPIconcepts
Imagefile-supportedformats
Theexamplecode
Readingimagefiles
Eventhandlingintotheintrinsicloop
Writingimagefiles
Readingandwritingvideofiles
Theexamplecode
User-interactionstools
Trackbars
Mouseinteraction
Buttons
Drawinganddisplayingtext
Summary
2.EstablishingImageProcessingTools
Basicdatatypes
Pixel-levelaccess
Measuringthetime
Commonoperationswithimages
Arithmeticoperations
Datapersistence
Histograms
Theexamplecode
Theexamplecode
Summary
3.CorrectingandEnhancingImages
Imagefiltering
Smoothing
![Page 6: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/6.jpg)
Theexamplecode
Sharpening
Theexamplecode
Workingwithimagepyramids
Gaussianpyramids
Laplacianpyramids
Theexamplecode
Morphologicaloperations
Theexamplecode
LUTs
Theexamplecode
Geometricaltransformations
Affinetransformation
Scaling
Theexamplecode
Translation
Theexamplecode
Imagerotation
Theexamplecode
Skewing
Theexamplecode
Reflection
Theexamplecode
Perspectivetransformation
Theexamplecode
Inpainting
Theexamplecode
Denoising
Theexamplecode
Summary
4.ProcessingColor
![Page 7: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/7.jpg)
Colorspaces
Conversionbetweencolorspaces(cvtColor)
RGB
Theexamplecode
Grayscale
Examplecode
CIEXYZ
Theexamplecode
YCrCb
Theexamplecode
HSV
Theexamplecode
HLS
Theexamplecode
CIEL*a*b*
Theexamplecode
CIEL*u*v*
Theexamplecode
Bayer
Theexamplecode
Color-space-basedsegmentation
HSVsegmentation
YCrCbsegmentation
Colortransfer
Theexamplecode
Summary
5.ImageProcessingforVideo
Videostabilization
Superresolution
Stitching
Summary
![Page 8: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/8.jpg)
6.ComputationalPhotography
High-dynamic-rangeimages
CreatingHDRimages
Example
Tonemapping
Alignment
Exposurefusion
Seamlesscloning
Decolorization
Non-photorealisticrendering
Summary
7.AcceleratingImageProcessing
OpenCVwiththeOpenCLinstallation
AquickrecipetoinstallOpenCVwithOpenCL
ChecktheGPUusage
Acceleratingyourownfunctions
CheckingyourOpenCL
Thecodeexplanation
YourfirstGPU-basedprogram
Thecodeexplanation
Goingrealtime
Thecodeexplanation
Theperformance
Summary
Index
![Page 9: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/9.jpg)
![Page 10: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/10.jpg)
LearningImageProcessingwithOpenCV
![Page 11: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/11.jpg)
![Page 12: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/12.jpg)
LearningImageProcessingwithOpenCVCopyright©2015PacktPublishing
Allrightsreserved.Nopartofthisbookmaybereproduced,storedinaretrievalsystem,ortransmittedinanyformorbyanymeans,withoutthepriorwrittenpermissionofthepublisher,exceptinthecaseofbriefquotationsembeddedincriticalarticlesorreviews.
Everyefforthasbeenmadeinthepreparationofthisbooktoensuretheaccuracyoftheinformationpresented.However,theinformationcontainedinthisbookissoldwithoutwarranty,eitherexpressorimplied.Neithertheauthors,norPacktPublishing,anditsdealersanddistributorswillbeheldliableforanydamagescausedorallegedtobecauseddirectlyorindirectlybythisbook.
PacktPublishinghasendeavoredtoprovidetrademarkinformationaboutallofthecompaniesandproductsmentionedinthisbookbytheappropriateuseofcapitals.However,PacktPublishingcannotguaranteetheaccuracyofthisinformation.
Firstpublished:March2015
Productionreference:1230315
PublishedbyPacktPublishingLtd.
LiveryPlace
35LiveryStreet
BirminghamB32PB,UK.
ISBN978-1-78328-765-9
www.packtpub.com
![Page 13: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/13.jpg)
![Page 14: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/14.jpg)
CreditsAuthors
GloriaBuenoGarcía
OscarDenizSuarez
JoséLuisEspinosaAranda
JesusSalidoTercero
IsmaelSerranoGracia
NoeliaVállezEnano
Reviewers
WalterLucetti
AndrédeSouzaMoreira
MarvinSmith
CommissioningEditor
JulianUrsell
AcquisitionEditor
SamWood
ContentDevelopmentEditor
KirtiPatil
TechnicalEditor
FaisalSiddiqui
CopyEditor
StutiSrivastava
ProjectCoordinator
NidhiJoshi
Proofreaders
MartinDiver
MariaGould
SamanthaLyon
Indexer
TejalSoni
Graphics
![Page 15: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/15.jpg)
AbhinashSahu
ProductionCoordinator
ConidonMiranda
CoverWork
ConidonMiranda
![Page 16: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/16.jpg)
![Page 17: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/17.jpg)
AbouttheAuthorsGloriaBuenoGarcíaholdsaPhDinmachinevisionfromCoventryUniversity,UK.Shehasexperienceworkingastheprincipalresearcherinseveralresearchcenters,suchasUMR7005researchunitCNRS/LouisPasteurUniv.Strasbourg(France),GilbertGilkes&GordonTechnology(UK),andCEITSanSebastian(Spain).Sheistheauthoroftwopatents,oneregisteredtypeofsoftware,andmorethan100refereedpapers.Herinterestsarein2D/3Dmultimodalityimageprocessingandartificialintelligence.SheleadstheVISILABresearchgroupattheUniversityofCastilla-LaMancha.ShehascoauthoredabookonOpenCVprogrammingformobiledevices:OpenCVessentials,PacktPublishing.
Thisisdedicatedtooursonsforthetimewehavenotbeenabletoplaywiththemandourparentsfortheirunconditionalsupportduringourlifetime.ThanksfromGloriaandOscar.
OscarDenizSuarez‘sresearchinterestsaremainlyfocusedoncomputervisionandpatternrecognition.Heistheauthorofmorethan50refereedpapersinjournalsandconferences.Hereceivedtherunner-upawardforthebestPhDworkoncomputervisionandpatternrecognitionbyAERFAIandtheImageFileandReformattingSoftwareChallengeAwardbyInnocentiveInc.Hehasbeenanationalfinalistforthe2009CorBaayenaward.Hisworkisusedbycutting-edgecompanies,suchasExistor,Gliif,Tapmedia,E-Twenty,andothers,andhasalsobeenaddedtoOpenCV.Currently,heworksasanassociateprofessorattheUniversityofCastilla-LaManchaandcontributestoVISILAB.HeisaseniormemberofIEEEandisaffiliatedwithAAAI,SIANI,CEA-IFAC,AEPIA,andAERFAI-IAPR.HeservesasanacademiceditorofthePLoSONEjournal.HehasbeenavisitingresearcheratCarnegieMellonUniversity,ImperialCollegeLondon,andLeicaBiosystems.HehascoauthoredtwobooksonOpenCVpreviously.
JoséLuisEspinosaArandaholdsaPhDincomputersciencefromtheUniversityofCastilla-LaMancha.HehasbeenafinalistforCertamenUniversitarioArquímedesdeIntroducciónalaInvestigacióncientíficain2009forhisfinaldegreeprojectinSpain.Hisresearchinterestsinvolvecomputervision,heuristicalgorithms,andoperationalresearch.HeiscurrentlyworkingattheVISILABgroupasanassistantresearcheranddeveloperincomputervisiontopics.
Thisisdedicatedtomyparentsandmybrothers.
JesusSalidoTercerogainedhiselectricalengineeringdegreeandPhD(1996)fromUniversidadPolitécnicadeMadrid(Spain).Hethenspent2years(1997and1998)asavisitingscholarattheRoboticsInstitute(CarnegieMellonUniversity,Pittsburgh,USA),workingoncooperativemultirobotsystems.SincehisreturntotheSpanishUniversityofCastilla-LaMancha,hespendshistimeteachingcoursesonroboticsandindustrialinformatics,alongwithresearchonvisionandintelligentsystems.Overthelast3years,hiseffortshavebeendirectedtodevelopvisionapplicationsonmobiledevices.HehascoauthoredabookonOpenCVprogrammingformobiledevices.
ThisisdedicatedtothosetowhomIoweallIam:myparents,SagrarioandMaria.
IsmaelSerranoGraciareceivedhisdegreeincomputersciencein2012fromthe
![Page 18: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/18.jpg)
UniversityofCastilla-LaMancha.Hegotthehighestmarksforhisfinaldegreeprojectonpersondetection.ThisapplicationusesdepthcameraswithOpenCVlibraries.Currently,heisaPhDcandidateatthesameuniversity,holdingaresearchgrantfromtheSpanishMinistryofScienceandResearch.HeisalsoworkingattheVISILABgroupasanassistantresearcheranddeveloperondifferentcomputervisiontopics.
Thisisdedicatedtomyparents,whohavegivenmetheopportunityofeducationandhavesupportedmethroughoutmylife.Itisalsodedicatedtomysupervisor,Dr.OscarDeniz,whohasbeenafriend,guide,andhelper.Finally,itisdedicatedtomyfriendsandmygirlfriend,whohavealwayshelpedmeandbelievedthatIcoulddothis.
NoeliaVállezEnanohaslikedcomputerssinceherchildhood,thoughshedidn’thaveonebeforehermid-teens.In2009,shefinishedherstudiesincomputerscienceattheUniversityofCastilla-LaMancha,whereshegraduatedwithtophonors.ShestartedworkingattheVISILABgroupthroughaprojectonmammographyCADsystemsandelectronichealthrecords.Sincethen,shehasobtainedamaster’sdegreeinphysicsandmathematicsandhasenrolledforaPhDdegree.Herworkinvolvesusingimageprocessingandpatternrecognitionmethods.Shealsolikesteachingandworkinginotherareasofartificialintelligence.
![Page 19: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/19.jpg)
![Page 20: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/20.jpg)
AbouttheReviewersWalterLucetti,knownontheInternetasMyzhar,isanItaliancomputerengineerwithaspecializationinroboticsandroboticsperception.Hereceivedthelaureadegreein2005whilestudyingatResearchCenter“E.Piaggio”inPisa(Italy),wherehewroteathesisabout3Dmappingoftherealworldusinga2Dlasertiltedwithaservomotor,fusing3DwithRGBdata.Whilewritingthethesis,heencounteredOpenCVforthefirsttime—itwasearly2004andOpenCVwasatitslarvalstage.
Afterthelaurea,hestartedworkingassoftwaredeveloperforlow-levelembeddedsystemsandhigh-leveldesktopsystems.HegreatlyimprovedhisknowledgeofcomputervisionandmachinelearningasaresearcheratGustavoStefaniniAdvancedRoboticsCenterinLaSpezia(Italy),aspinoffofPERCROLaboratoryofScuolaSuperioreSant’AnnaofPisa(Italy).
Currently,heisworkinginthesoftwareindustry,writingfirmwareforembeddedARMsystems,softwarefordesktopsystemsbasedontheQtframework,andintelligentalgorithmsforvideosurveillancesystemsbasedonOpenCVandCUDA.
Heisalsoworkingonapersonalroboticproject:MyzharBot.MyzharBotisatrackedgroundmobilerobotthatusescomputervisiontodetectobstaclesandtoanalyzeandexploretheenvironment.TherobotisguidedbyalgorithmsbasedonROS,CUDA,andOpenCV.Youcanfollowtheprojectonthiswebsite:http://myzharbot.robot-home.it.
AndrédeSouzaMoreirahasamaster’sdegreeincomputerscience,withemphasisoncomputergraphicsfromthePontificalCatholicUniversityofRiodeJaneiro(Brazil).
HegraduatedwithabachelorofcomputersciencedegreefromUniversidadeFederaldoMaranhão(UFMA)inBrazil.Duringhisundergraduatedegree,hewasamemberofLabmint’sresearchteamandworkedwithmedicalimaging,specifically,breastcancerdetectionanddiagnosisusingimageprocessing.
Currently,heworksasaresearcherandsystemanalystatInstitutoTecgraf,oneofthemajorresearchanddevelopmentlabsincomputergraphicsinBrazil.HehasbeenworkingextensivelywithPHP,HTML,andCSSsince2007,andnowadays,hedevelopsprojectsinC++11/C++14,alongwithSQLite,Qt,Boost,andOpenGL.Moreinformationabouthimcanbeacquiredonhispersonalwebsiteatwww.andredsm.com.
MarvinSmithiscurrentlyasoftwareengineerinthedefenseindustry,specializinginphotogrammetryandremotesensing.HereceivedhisBSdegreeincomputersciencefromtheUniversityofNevadaReno.Histechnicalinterestsincludehighperformancecomputing,distributedimageprocessing,andmultispectralimageryexploitation.Priortoworkingindefense,MarvinheldinternshipswiththeIntelligentRoboticsGroupattheNASAAmesResearchCenterandtheNevadaAutomotiveTestCenter.
![Page 21: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/21.jpg)
![Page 22: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/22.jpg)
www.PacktPub.com
![Page 23: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/23.jpg)
Supportfiles,eBooks,discountoffers,andmoreForsupportfilesanddownloadsrelatedtoyourbook,pleasevisitwww.PacktPub.com.
DidyouknowthatPacktofferseBookversionsofeverybookpublished,withPDFandePubfilesavailable?YoucanupgradetotheeBookversionatwww.PacktPub.comandasaprintbookcustomer,youareentitledtoadiscountontheeBookcopy.Getintouchwithusat<[email protected]>formoredetails.
Atwww.PacktPub.com,youcanalsoreadacollectionoffreetechnicalarticles,signupforarangeoffreenewslettersandreceiveexclusivediscountsandoffersonPacktbooksandeBooks.
https://www2.packtpub.com/books/subscription/packtlib
DoyouneedinstantsolutionstoyourITquestions?PacktLibisPackt’sonlinedigitalbooklibrary.Here,youcansearch,access,andreadPackt’sentirelibraryofbooks.
![Page 24: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/24.jpg)
Whysubscribe?FullysearchableacrosseverybookpublishedbyPacktCopyandpaste,print,andbookmarkcontentOndemandandaccessibleviaawebbrowser
![Page 25: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/25.jpg)
FreeaccessforPacktaccountholdersIfyouhaveanaccountwithPacktatwww.PacktPub.com,youcanusethistoaccessPacktLibtodayandview9entirelyfreebooks.Simplyuseyourlogincredentialsforimmediateaccess.
![Page 26: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/26.jpg)
![Page 27: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/27.jpg)
PrefaceOpenCV,arguablythemostwidelyusedcomputervisionlibrary,includeshundredsofready-to-useimagingandvisionfunctionsandisusedinbothacademiaandindustry.Ascamerasgetcheaperandimagingfeaturesgrowindemand,therangeofapplicationsusingOpenCVincreasessignificantly,bothfordesktopandmobileplatforms.
Thisbookprovidesanexample-basedtourofOpenCV’smainimageprocessingalgorithms.WhileotherOpenCVbookstrytoexplaintheunderlyingtheoryorprovidelargeexamplesofnearlycompleteapplications,Thisbookisaimedatpeoplewhowanttohaveaneasy-to-understandworkingexampleassoonaspossible,andpossiblydevelopadditionalfeaturesontopofthat.
Thebookstartswithanintroductorychapterinwhichthelibraryinstallationisexplained,thestructureofthelibraryisdescribed,andbasicimageandvideoreadingandwritingexamplesaregiven.Fromthis,thefollowingfunctionalitiesarecovered:handlingofimagesandvideos,basicimageprocessingtools,correctingandenhancingimages,color,videoprocessing,andcomputationalphotography.Lastbutnotleast,advancedfeaturessuchasGPU-basedaccelerationsarealsoconsideredinthefinalchapter.Newfunctionsandtechniquesinthelatestmajorrelease,OpenCV3,areexplainedthroughout.
![Page 28: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/28.jpg)
WhatthisbookcoversChapter1,HandlingImageandVideoFiles,showsyouhowtoreadimageandvideofiles.Italsoshowsbasicuser-interactiontools,whichareveryusefulinimageprocessingtochangeaparametervalue,selectregionsofinterest,andsoon.
Chapter2,EstablishingImageProcessingTools,describesthemaindatastructuresandbasicproceduresneededinsubsequentchapters.
Chapter3,CorrectingandEnhancingImages,dealswithtransformationstypicallyusedtocorrectimagedefects.Thischaptercoversfiltering,pointtransformationsusingLookUpTables,geometricaltransformations,andalgorithmsforinpaintinganddenoisingimages.
Chapter4,ProcessingColor,dealswithcolortopicsinimageprocessing.Thischapterexplainshowtousedifferentcolorspacesandperformcolortransfersbetweentwoimages.
Chapter5,ImageProcessingforVideo,coverstechniquesthatuseavideoorasequenceofimages.Thischapterisfocusedonalgorithms’implementationforvideostabilization,superresolution,andstitching.
Chapter6,ComputationalPhotography,explainshowtoreadHDRimagesandperformtonemappingonthem.
Chapter7,AcceleratingImageProcessing,coversanimportanttopicinimageprocessing:speed.ModernGPUsarethebestavailabletechnologytoacceleratetime-consumingimageprocessingtasks.
![Page 29: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/29.jpg)
![Page 30: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/30.jpg)
WhatyouneedforthisbookThepurposeofthisbookistoteachyouOpenCVimageprocessingbytakingyouthroughanumberofpracticalimageprocessingprojects.Thelatestversion,Version3.0ofOpenCV,willbeused.
Eachchapterprovidesseveralready-to-useexamplestoillustratetheconceptscoveredinit.Thebookis,therefore,focusedonprovidingyouwithaworkingexampleassoonaspossiblesothattheycandevelopadditionalfeaturesontopofthat.
Tousethisbook,onlyfreesoftwareisneeded.AlltheexampleshavebeendevelopedandtestedwiththefreelyavailableQtCreatorIDEandGNU/GCCcompiler.TheCMaketoolisalsousedtoconfigurethebuildprocessoftheOpenCVlibraryonthetargetplatform.Moreover,thefreelyavailableOpenCLSDKisrequiredfortheGPUaccelerationexamplesshowninChapter7,AcceleratingImageProcessing.
![Page 31: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/31.jpg)
![Page 32: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/32.jpg)
WhothisbookisforThisbookisintendedforreaderswhoalreadyknowC++programmingandwanttolearnhowtodoimageprocessingusingOpenCV.Youareexpectedtohaveaminimalbackgroundinthetheoryofimageprocessing.Thebookdoesnotcovertopicsthataremorerelatedtocomputervision,suchasfeatureandobjectdetection,tracking,ormachinelearning.
![Page 33: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/33.jpg)
![Page 34: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/34.jpg)
ConventionsInthisbook,youwillfindanumberofstylesoftextthatdistinguishbetweendifferentkindsofinformation.Herearesomeexamplesofthesestyles,andanexplanationoftheirmeaning.
Codewordsintext,foldernames,filenames,fileextensions,pathnames,systemvariables,URLs,anduserinputareshownasfollows:“Eachmodulehasanassociatedheaderfile(forexamplecore.hpp).”
Ablockofcodeissetasfollows:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
usingnamespacestd;
usingnamespacecv;
intmain(intargc,char*argv[])
{
Matframe;//Containerforeachframe
Whenwewishtodrawyourattentiontoaparticularpartofacodeblock,therelevantlinesoritemsaresetinbold:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
usingnamespacestd;
usingnamespacecv;
intmain(intargc,char*argv[])
{
Anycommand-lineinputoroutputiswrittenasfollows:
C:\opencv-buildQt\install
Newtermsandimportantwordsareshowninbold.Wordsthatyouseeonthescreen,forexample,inmenusordialogboxes,appearinthetextlikethis:“ClickingtheNextbuttonmovesyoutothenextscreen.”
NoteWarningsorimportantnotesappearinaboxlikethis.
TipTipsandtricksappearlikethis.
![Page 35: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/35.jpg)
![Page 36: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/36.jpg)
ReaderfeedbackFeedbackfromourreadersisalwayswelcome.Letusknowwhatyouthinkaboutthisbook—whatyoulikedordisliked.Readerfeedbackisimportantforusasithelpsusdeveloptitlesthatyouwillreallygetthemostoutof.
Tosendusgeneralfeedback,simplye-mail<[email protected]>,andmentionthebook’stitleinthesubjectofyourmessage.
Ifthereisatopicthatyouhaveexpertiseinandyouareinterestedineitherwritingorcontributingtoabook,seeourauthorguideatwww.packtpub.com/authors.
![Page 37: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/37.jpg)
![Page 38: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/38.jpg)
CustomersupportNowthatyouaretheproudownerofaPacktbook,wehaveanumberofthingstohelpyoutogetthemostfromyourpurchase.
![Page 39: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/39.jpg)
DownloadingtheexamplecodeYoucandownloadtheexamplecodefilesfromyouraccountathttp://www.packtpub.comforallthePacktPublishingbooksyouhavepurchased.Ifyoupurchasedthisbookelsewhere,youcanvisithttp://www.packtpub.com/supportandregistertohavethefilese-maileddirectlytoyou.
![Page 40: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/40.jpg)
DownloadingthecolorimagesofthisbookWealsoprovideyouwithaPDFfilethathascolorimagesofthescreenshots/diagramsusedinthisbook.Thecolorimageswillhelpyoubetterunderstandthechangesintheoutput.Youcandownloadthisfilefrom:https://www.packtpub.com/sites/default/files/downloads/ImageProcessingwithOpenCV_Graphics.pdf
![Page 41: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/41.jpg)
ErrataAlthoughwehavetakeneverycaretoensuretheaccuracyofourcontent,mistakesdohappen.Ifyoufindamistakeinoneofourbooks—maybeamistakeinthetextorthecode—wewouldbegratefulifyoucouldreportthistous.Bydoingso,youcansaveotherreadersfromfrustrationandhelpusimprovesubsequentversionsofthisbook.Ifyoufindanyerrata,pleasereportthembyvisitinghttp://www.packtpub.com/submit-errata,selectingyourbook,clickingontheErrataSubmissionFormlink,andenteringthedetailsofyourerrata.Onceyourerrataareverified,yoursubmissionwillbeacceptedandtheerratawillbeuploadedtoourwebsiteoraddedtoanylistofexistingerrataundertheErratasectionofthattitle.
Toviewthepreviouslysubmittederrata,gotohttps://www.packtpub.com/books/content/supportandenterthenameofthebookinthesearchfield.TherequiredinformationwillappearundertheErratasection.
![Page 42: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/42.jpg)
PiracyPiracyofcopyrightedmaterialontheInternetisanongoingproblemacrossallmedia.AtPackt,wetaketheprotectionofourcopyrightandlicensesveryseriously.IfyoucomeacrossanyillegalcopiesofourworksinanyformontheInternet,pleaseprovideuswiththelocationaddressorwebsitenameimmediatelysothatwecanpursuearemedy.
Pleasecontactusat<[email protected]>withalinktothesuspectedpiratedmaterial.
Weappreciateyourhelpinprotectingourauthorsandourabilitytobringyouvaluablecontent.
![Page 43: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/43.jpg)
QuestionsIfyouhaveaproblemwithanyaspectofthisbook,youcancontactusat<[email protected]>,andwewilldoourbesttoaddresstheproblem.
![Page 44: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/44.jpg)
![Page 45: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/45.jpg)
Chapter1.HandlingImageandVideoFilesThischapterisintendedasafirstcontactwithOpenCV,itsinstallation,andfirstbasicprograms.Wewillcoverthefollowingtopics:
AbriefintroductiontoOpenCVforthenovice,followedbyaneasystep-by-stepguidetotheinstallationofthelibraryAquicktourofOpenCV’sstructureaftertheinstallationintheuser’slocaldiskQuickrecipestocreateprojectsusingthelibrarywithsomecommonprogrammingframeworksHowtousethefunctionstoreadandwriteimagesandvideosFinally,wedescribethelibraryfunctionstoaddrichuserinterfacestothesoftwareprojects,includingmouseinteraction,drawingprimitives,andQtsupport
![Page 46: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/46.jpg)
AnintroductiontoOpenCVInitiallydevelopedbyIntel,OpenCV(OpenSourceComputerVision)isafreecross-platformlibraryforreal-timeimageprocessingthathasbecomeadefactostandardtoolforallthingsrelatedtoComputerVision.Thefirstversionwasreleasedin2000underBSDlicenseandsincethen,itsfunctionalityhasbeenverymuchenrichedbythescientificcommunity.In2012,thenonprofitfoundationOpenCV.orgtookonthetaskofmaintainingasupportsitefordevelopersandusers.
NoteAtthetimeofwritingthisbook,anewmajorversionofOpenCV(Version3.0)isavailable,stillonbetastatus.Throughoutthebook,wewillpresentthemostrelevantchangesbroughtwiththisnewversion.
OpenCVisavailableforthemostpopularoperatingsystems,suchasGNU/Linux,OSX,Windows,Android,iOS,andsomemore.ThefirstimplementationwasintheCprogramminglanguage;however,itspopularitygrewwithitsC++implementationasofVersion2.0.NewfunctionsareprogrammedwithC++.However,nowadays,thelibraryhasafullinterfaceforotherprogramminglanguages,suchasJava,Python,andMATLAB/Octave.Also,wrappersforotherlanguages(suchasC#,Ruby,andPerl)havebeendevelopedtoencourageadoptionbyprogrammers.
Inanattempttomaximizetheperformanceofcomputingintensivevisiontasks,OpenCVincludessupportforthefollowing:
MultithreadingonmulticorecomputersusingThreadingBuildingBlocks(TBB)—atemplatelibrarydevelopedbyIntel.AsubsetofIntegratedPerformancePrimitives(IPP)onIntelprocessorstoboostperformance.ThankstoIntel,theseprimitivesarefreelyavailableasofVersion3.0beta.InterfacesforprocessingonGraphicProcessingUnit(GPU)usingComputeUnifiedDeviceArchitecture(CUDA)andOpenComputingLanguage(OpenCL).
TheapplicationsforOpenCVcoverareassuchassegmentationandrecognition,2Dand3Dfeaturetoolkits,objectidentification,facialrecognition,motiontracking,gesturerecognition,imagestitching,highdynamicrange(HDR)imaging,augmentedreality,andsoon.Moreover,tosupportsomeofthepreviousapplicationareas,amodulewithstatisticalmachinelearningfunctionsisincluded.
![Page 47: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/47.jpg)
![Page 48: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/48.jpg)
DownloadingandinstallingOpenCVOpenCVisfreelyavailablefordownloadathttp://opencv.org.Thissiteprovidesthelastversionfordistribution(currently,3.0beta)andolderversions.
NoteSpecialcareshouldbetakenwithpossibleerrorswhenthedownloadedversionisanonstablerelease,forexample,thecurrent3.0betaversion.
Onhttp://opencv.org/downloads.html,suitableversionsofOpenCVforeachplatformcanbefound.Thecodeandinformationofthelibrarycanbeobtainedfromdifferentrepositoriesdependingonthefinalpurpose:
Themainrepository(athttp://sourceforge.net/projects/opencvlibrary),devotedtofinalusers.Itcontainsbinaryversionsofthelibraryandready-to‑compilesourcesforthetargetplatform.Thetestdatarepository(athttps://github.com/itseez/opencv_extra)withsetsofdatatotestpurposesofsomelibrarymodules.Thecontributionsrepository(athttp://github.com/itseez/opencv_contrib)withthesourcecodecorrespondingtoextraandcutting-edgefeaturessuppliedbycontributors.Thiscodeismoreerror-proneandlesstestedthanthemaintrunk.
TipWiththelastversion,OpenCV3.0beta,theextracontributedmodulesarenotincludedinthemainpackage.Theyshouldbedownloadedseparatelyandexplicitlyincludedinthecompilationprocessthroughtheproperoptions.Becautiousifyouincludesomeofthosecontributedmodules,becausesomeofthemhavedependenciesonthird‑partysoftwarenotincludedwithOpenCV.Thedocumentationsite(athttp://docs.opencv.org/master/)foreachofthemodules,includingthecontributedones.Thedevelopmentrepository(athttps://github.com/Itseez/opencv)withthecurrentdevelopmentversionofthelibrary.Itisintendedfordevelopersofthemainfeaturesofthelibraryandthe“impatient”userwhowishestousethelastupdateevenbeforeitisreleased.
RatherthanGNU/LinuxandOSX,whereOpenCVisdistributedassourcecodeonly,intheWindowsdistribution,onecanfindprecompiled(withMicrosoftVisualC++v10,v11,andv12)versionsofthelibrary.EachprecompiledversionisreadytobeusedwithMicrosoftcompilers.However,iftheprimaryintentionistodevelopprojectswithadifferentcompilerframework,weneedtocompilethelibraryforthatspecificcompiler(forexample,GNUGCC).
TipThefastestroutetoworkingwithOpenCVistouseoneoftheprecompiledversionsincludedwiththedistribution.Then,abetterchoiceistobuildafine-tunedversionofthe
![Page 49: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/49.jpg)
librarywiththebestsettingsforthelocalplatformusedforsoftwaredevelopment.ThischapterprovidestheinformationtobuildandinstallOpenCVonWindows.FurtherinformationtosetthelibraryonLinuxcanbefoundathttp://docs.opencv.org/doc/tutorials/introduction/linux_installandhttps://help.ubuntu.com/community/OpenCV.
![Page 50: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/50.jpg)
GettingacompilerandsettingCMakeAgoodchoiceforcross‑platformdevelopmentwithOpenCVistousetheGNUtoolkit(includinggmake,g++,andgdb).TheGNUtoolkitcanbeeasilyobtainedforthemostpopularoperatingsystems.OurpreferredchoiceforadevelopmentenvironmentconsistsoftheGNUtoolkitandthecross‑platformQtframework,whichincludestheQtlibraryandtheQtCreatorIntegratedDevelopmentEnvironment(IDE).TheQtframeworkisfreelyavailableathttp://qt-project.org/.
NoteAfterinstallingthecompileronWindows,remembertoproperlysetthePathenvironmentvariable,addingthepathforthecompiler’sexecutable,forexample,C:\Qt\Qt5.2.1\5.2.1\mingw48_32\binfortheGNU/compilersincludedwiththeQtframework.OnWindows,thefreeRapidEnvironmentEditortool(availableathttp://www.rapidee.com)providesaconvenientwaytochangePathandotherenvironmentvariables.
TomanagethebuildprocessfortheOpenCVlibraryinacompiler-independentway,CMakeistherecommendedtool.CMakeisafreeandopensourcecross‑platformtoolavailableathttp://www.cmake.org/.
![Page 51: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/51.jpg)
ConfiguringOpenCVwithCMakeOncethesourcesofthelibraryhavebeendownloadedintothelocaldisk,itisrequiredthatyouconfigurethemakefilesforthecompilationprocessofthelibrary.CMakeisthekeytoolforaneasyconfigurationofOpenCV’sinstallationprocess.Itcanbeusedfromthecommandlineorinamoreuser‑friendlywaywithitsGraphicalUserInterface(GUI)version.
ThestepstoconfigureOpenCVwithCMakecanbesummarizedasfollows:
1. Choosethesource(let’scallitOPENCV_SRCinwhatfollows)andtarget(OPENCV_BUILD)directories.Thetargetdirectoryiswherethecompiledbinarieswillbelocated.
2. MarktheGroupedandAdvancedcheckboxesandclickontheConfigurebutton.3. Choosethedesiredcompiler(forexample,GNUdefaultcompilers,MSVC,andso
on).4. Setthepreferredoptionsandunsetthosenotdesired.5. ClickontheConfigurebuttonandrepeatsteps4and5untilnoerrorsareobtained.6. ClickontheGeneratebuttonandcloseCMake.
ThefollowingscreenshotshowsyouthemainwindowofCMakewiththesourceandtargetdirectoriesandthecheckboxestogroupalltheavailableoptions:
![Page 52: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/52.jpg)
ThemainwindowofCMakeafterthepreconfigurationstep
NoteForbrevity,weuseOPENCV_BUILDandOPENCV_SRCinthistexttodenotethetargetandsourcedirectoriesoftheOpenCVlocalsetup,respectively.Keepinmindthatalldirectoriesshouldmatchyourcurrentlocalconfiguration.
Duringthepreconfigurationprocess,CMakedetectsthecompilerspresentandmanyotherlocalpropertiestosetthebuildprocessofOpenCV.ThepreviousscreenshotdisplaysthemainCMakewindowafterthepreconfigurationprocess,showingthegroupedoptionsinred.
Itispossibletoleavethedefaultoptionsunchangedandcontinuetheconfigurationprocess.However,someconvenientoptionscanbeset:
BUILD_EXAMPLES:ThisissettobuildsomeexamplesusingOpenCV.BUILD_opencv_<module_name>:Thisissettoincludethemodule(module_name)in
![Page 53: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/53.jpg)
thebuildprocess.OPENCV_EXTRA_MODULES_PATH:Thisisusedwhenyouneedsomeextracontributedmodule;setthepathforthesourcecodeoftheextramoduleshere(forexample,C:/opencv_contrib-master/modules).WITH_QT:ThisisturnedontoincludetheQtfunctionalityintothelibrary.WITH_IPP:Thisoptionisturnedonbydefault.ThecurrentOpenCV3.0versionincludesasubsetoftheIntelIntegratedPerformancePrimitives(IPP)thatspeeduptheexecutiontimeofthelibrary.
TipIfyoucompilethenewOpenCV3.0(beta),becautiousbecausesomeunexpectederrorshavebeenreportedrelatedtotheIPPinclusion(thatis,withthedefaultvalueofthisoption).WerecommendthatyouunsettheWITH_IPPoption.
IftheconfigurationstepswithCMake(loopthroughsteps4and5)don’tproduceanyfurthererrors,itispossibletogeneratethefinalmakefilesforthebuildprocess.ThefollowingscreenshotshowsyouthemainwindowofCMakeafteragenerationstepwithouterrors:
![Page 54: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/54.jpg)
![Page 55: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/55.jpg)
CompilingandinstallingthelibraryThenextstepafterthegenerationprocessofmakefileswithCMakeisthecompilationwiththepropermaketool.Thistoolisusuallyexecutedonthecommandline(theconsole)fromthetargetdirectory(theonesetattheCMakeconfigurationstep).Forexample,inWindows,thecompilationshouldbelaunchedfromthecommandlineasfollows:
OPENCV_BUILD>mingw32-make
ThiscommandlaunchesabuildprocessusingthemakefilesgeneratedbyCMake.Thewholecompilationtypicallytakesseveralminutes.Ifthecompilationendswithouterrors,theinstallationcontinueswiththeexecutionofthefollowingcommand:
OPENCV_BUILD>mingw32-makeinstall
ThiscommandcopiestheOpenCVbinariestotheOPENCV_BUILD\installdirectory.
Ifsomethingwentwrongduringthecompilation,weshouldrunCMakeagaintochangetheoptionsselectedduringtheconfiguration.Then,weshouldregeneratethemakefiles.
Theinstallationendsbyaddingthelocationofthelibrarybinaries(forexample,inWindows,theresultingDLLfilesarelocatedatOPENCV_BUILD\install\x64\mingw\bin)tothePathenvironmentvariable.WithoutthisdirectoryinthePathfield,theexecutionofeveryOpenCVexecutablewillgiveanerrorasthelibrarybinarieswon’tbefound.
Tocheckthesuccessoftheinstallationprocess,itispossibletorunsomeoftheexamplescompiledalongwiththelibrary(iftheBUILD_EXAMPLESoptionwassetusingCMake).Thecodesamples(writteninC++)canbefoundatOPENCV_BUILD\install\x64\mingw\samples\cpp.
NoteTheshortinstructionsgiventoinstallOpenCVapplytoWindows.AdetaileddescriptionwiththeprerequisitesforLinuxcanbereadathttp://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html.AlthoughthetutorialappliestoOpenCV2.0,almostalltheinformationisstillvalidforVersion3.0.
![Page 56: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/56.jpg)
![Page 57: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/57.jpg)
ThestructureofOpenCVOnceOpenCVisinstalled,theOPENCV_BUILD\installdirectorywillbepopulatedwiththreetypesoffiles:
Headerfiles:ThesearelocatedintheOPENCV_BUILD\install\includesubdirectoryandareusedtodevelopnewprojectswithOpenCV.Librarybinaries:Thesearestaticordynamiclibraries(dependingontheoptionselectedwithCMake)withthefunctionalityofeachoftheOpenCVmodules.Theyarelocatedinthebinsubdirectory(forexample,x64\mingw\binwhentheGNUcompilerisused).Samplebinaries:Theseareexecutableswithexamplesthatusethelibraries.Thesourcesforthesesamplescanbefoundinthesourcepackage(forexample,OPENCV_SRC\sources\samples).
OpenCVhasamodularstructure,whichmeansthatthepackageincludesastaticordynamic(DLL)libraryforeachmodule.Theofficialdocumentationforeachmodulecanbefoundathttp://docs.opencv.org/master/.Themainmodulesincludedinthepackageare:
core:ThisdefinesthebasicfunctionsusedbyalltheothermodulesandthefundamentaldatastructuresincludingtheimportantmultidimensionalarrayMat.highgui:Thisprovidessimpleuserinterface(UI)capabilities.BuildingthelibrarywithQtsupport(theWITH_QTCMakeoption)allowsUIcompatibilitywithsuchaframework.imgproc:Theseareimageprocessingfunctionsthatincludefiltering(linearandnonlinear),geometrictransformations,colorspaceconversion,histograms,andsoon.imgcodecs:Thisisaneasy-to-useinterfacetoreadandwriteimages.
NotePayattentiontothechangesinmodulessinceOpenCV3.0assomefunctionalityhasbeenmovedtoanewmodule(forexample,readingandwritingimagesfunctionsweremovedfromhighguitoimgcodecs).
photo:ThisincludesComputationalPhotographyincludinginpainting,denoising,HighDynamicRange(HDR)imaging,andsomeothers.stitching:Thisisusedforimagestitching.videoio:Thisisaneasy-to-useinterfaceforvideocaptureandvideocodecs.video:Thissuppliesthefunctionalityofvideoanalysis(motionestimation,backgroundextraction,andobjecttracking).features2d:Thesearefunctionsforfeaturedetection(cornersandplanarobjects),featuredescription,featurematching,andsoon.objdetect:Thesearefunctionsforobjectdetectionandinstancesofpredefineddetectors(suchasfaces,eyes,smile,people,cars,andsoon).
Someothermodulesarecalib3d(cameracalibration),flann(clusteringandsearch),ml(machinelearning),shape(shapedistanceandmatching),superres(superresolution),video(videoanalysis),andvideostab(videostabilization).
![Page 58: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/58.jpg)
NoteAsofVersion3.0beta,thenewcontributedmodulesaredistributedinaseparatepackage(opencv_contrib-master.zip)thatcanbedownloadedfromhttps://github.com/itseez/opencv_contrib.Thesemodulesprovideextrafeaturesthatshouldbefullyunderstoodbeforeusingthem.ForaquickoverviewofthenewfunctionalityinthenewreleaseofOpenCV(Version3.0),refertothedocumentathttp://opencv.org/opencv-3-0-beta.html.
![Page 59: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/59.jpg)
![Page 60: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/60.jpg)
CreatinguserprojectswithOpenCVInthisbook,weassumethatC++isthemainlanguageforprogrammingimageprocessingapplications,althoughinterfacesandwrappersforotherprogramminglanguagesareactuallyprovided(forinstance,Python,Java,MATLAB/Octave,andsomemore).
Inthissection,weexplainhowtodevelopapplicationswithOpenCV’sC++APIusinganeasy-to-usecross-platformframework.
![Page 61: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/61.jpg)
GeneralusageofthelibraryTodevelopanOpenCVapplicationwithC++,werequireourcodeto:
IncludetheOpenCVheaderfileswithdefinitionsLinktheOpenCVlibraries(binaries)togetthefinalexecutable
TheOpenCVheaderfilesarelocatedintheOPENCV_BUILD\install\include\opencv2directorywherethereisafile(*.hpp)foreachofthemodules.Theinclusionoftheheaderfileisdonewiththe#includedirective,asshownhere:
#include<opencv2/<module_name>/<module_name>.hpp>
//Includingtheheaderfileforeachmoduleusedinthecode
Withthisdirective,itispossibletoincludeeveryheaderfileneededbytheuserprogram.Ontheotherhand,iftheopencv.hppheaderfileisincluded,alltheheaderfileswillbeautomaticallyincludedasfollows:
#include<opencv2/opencv.hpp>
//IncludingalltheOpenCV'sheaderfilesinthecode
NoteRememberthatallthemodulesinstalledlocallyaredefinedintheOPENCV_BUILD\install\include\opencv2\opencv_modules.hppheaderfile,whichisgeneratedautomaticallyduringthebuildingprocessofOpenCV.
Theuseofthe#includedirectiveisnotalwaysaguaranteeforthecorrectinclusionoftheheaderfiles,becauseitisnecessarytotellthecompilerwheretofindtheincludefiles.Thisisachievedbypassingaspecialargumentwiththelocationofthefiles(suchasI\<location>forGNUcompilers).
Thelinkingprocessrequiresyoutoprovidethelinkerwiththelibraries(dynamicorstatic)wheretherequiredOpenCVfunctionalitycanbefound.Thisisusuallydonewithtwotypesofargumentsforthelinker:thelocationofthelibrary(suchas‑L<location>forGNUcompilers)andthenameofthelibrary(suchas-l<module_name>).
NoteYoucanfindacompletelistofavailableonlinedocumentationforGNUGCCandMakeathttps://gcc.gnu.org/onlinedocs/andhttps://www.gnu.org/software/make/manual/.
![Page 62: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/62.jpg)
ToolstodevelopnewprojectsThemainprerequisitestodevelopourownOpenCVC++applicationsare:
OpenCVheaderfilesandlibrarybinaries:OfcourseweneedtocompileOpenCV,andtheauxiliarylibrariesareprerequisitesforsuchacompilation.Thepackageshouldbecompiledwiththesamecompilerusedtogeneratetheuserapplication.AC++compiler:Someassociatetoolsareconvenientasthecodeeditor,debugger,projectmanager,buildprocessmanager(forinstanceCMake),revisioncontrolsystem(suchasGit,Mercurial,SVN,andsoon),andclassinspector,amongothers.Usually,thesetoolsaredeployedtogetherinaso-calledIntegratedDevelopmentEnvironment(IDE).Anyotherauxiliarylibraries:Optionally,anyotherauxiliarylibrariesneededtoprogramthefinalapplication,suchasgraphical,statistical,andsoonwillberequired.
ThemostpopularavailablecompilerkitstoprogramOpenCVC++applicationsare:
MicrosoftVisualC(MSVC):ThisisonlysupportedonWindowsanditisverywellintegratedwiththeIDEVisualStudio,althoughitcanbealsointegratedwithothercross-platformIDEs,suchasQtCreatororEclipse.VersionsofMSVCthatcurrentlycompatiblewiththelatestOpenCVreleaseareVC10,VC11,andVC12(VisualStudio2010,2012,and2013).GNUCompilerCollectionGNUGCC:Thisisacross‑platformcompilersystemdevelopedbytheGNUproject.ForWindows,thiskitisknownasMinGW(MinimalGNUGCC).TheversioncompatiblewiththecurrentOpenCVreleaseisGNUGCC4.8.ThiskitmaybeusedwithseveralIDEs,suchasQtCreator,Code::Blocks,Eclipse,amongothers.
Fortheexamplespresentedinthisbook,weusedtheMinGW4.8compilerkitforWindowsplustheQt5.2.1libraryandtheQtCreatorIDE(3.0.1).Thecross-platformQtlibraryisrequiredtocompileOpenCVwiththenewUIcapabilitiesprovidedbysuchalibrary.
NoteForWindows,itispossibletodownloadaQtbundle(includingQtlibrary,QtCreator,andtheMinGWkit)fromhttp://qt-project.org/.Thebundleisapproximately700MB.
QtCreatorisacross-platformIDEforC++thatintegratesthetoolsweneedtocodeapplications.InWindows,itmaybeusedwithMinGWorMSVC.ThefollowingscreenshotshowsyoutheQtCreatormainwindowwiththedifferentpanelsandviewsforanOpenCVC++project:
![Page 63: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/63.jpg)
ThemainwindowofQtCreatorwithsomeviewsfromanOpenCVC++project
![Page 64: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/64.jpg)
CreatinganOpenCVC++programwithQtCreatorNext,weexplainhowtocreateacodeprojectwiththeQtCreatorIDE.Inparticular,weapplythisdescriptiontoanOpenCVexample.
WecancreateaprojectforanyOpenCVapplicationusingQtCreatorbynavigatingtoFile|NewFileorFile|Project…andthennavigatingtoNon-QtProject|PlainC++Project.Then,wehavetochooseaprojectnameandthelocationatwhichitwillbestored.Thenextstepistopickakit(thatis,thecompiler)fortheproject(inourcase,DesktopQt5.2.1MinGW32bit)andthelocationforthebinariesgenerated.Usually,twopossiblebuildconfigurations(profiles)areused:debugandrelease.Theseprofilessettheappropriateflagstobuildandrunthebinaries.
WhenaprojectiscreatedusingQtCreator,twospecialfiles(with.proand.pro.userextensions)aregeneratedtoconfigurethebuildandrunprocesses.Thebuildprocessisdeterminedbythekitchosenduringthecreationoftheproject.WiththeDesktopQt5.2.1MinGW32bitkit,thisprocessreliesontheqmakeandmingw32‑maketools.Usingthe*.profileastheinput,qmakegeneratesthemakefilethatdrivesthebuildprocessforeachprofile(thatis,releaseanddebug).TheqmaketoolisusedfromtheQtCreatorIDEasanalternativetoCMaketosimplifythebuildprocessofsoftwareprojects.Itautomatesthegenerationofmakefilesfromafewlinesofinformation.
Thefollowinglinesrepresentanexampleofa*.profile(forexample,showImage.pro):
TARGET:showImage
TEMPLATE=app
CONFIG+=console
CONFIG-=app_bundle
CONFIG-=qt
SOURCES+=\
showImage.cpp
INCLUDEPATH+=C:/opencv300-buildQt/install/include
LIBS+=-LC:/opencv300-buildQt/install/x64/mingw/lib\
-lopencv_core300.dll\
-lopencv_imgcodecs300.dll\
-lopencv_highgui300.dll\
-lopencv_imgproc300.dll
Theprecedingfileillustratestheoptionsthatqmakeneedstogeneratetheappropriatemakefilestobuildthebinariesforourproject.Eachlinestartswithatagindicatinganoption(TARGET,CONFIG,SOURCES,INCLUDEPATH,andLIBS)followedwithamarktoadd(+=)orremove(-=)thevalueoftheoption.Inthissampleproject,weusethenon-Qtconsoleapplication.TheexecutablefileisshowImage.exe(TARGET)andthesourcefileisshowImage.cpp(SOURCES).AsthisprojectisanOpenCV-basedapplication,thetwolasttagsindicatethelocationoftheheaderfiles(INCLUDEPATH)andtheOpenCVlibraries(LIBS)usedbythisparticularproject(core,imgcodecs,highgui,andimgproc).Notethatabackslashattheendofthelinedenotescontinuationinthenextline.
![Page 65: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/65.jpg)
NoteForadetaileddescriptionofthetools(includingQtCreatorandqmake)developedwithintheQtproject,visithttp://doc.qt.io/.
![Page 66: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/66.jpg)
![Page 67: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/67.jpg)
ReadingandwritingimagefilesImageprocessingreliesongettinganimage(forinstance,aphotographoravideofame)and“playing”withitbyapplyingsignalprocessingtechniquesonittogetthedesiredresults.Inthissection,weshowyouhowtoreadimagesfromfilesusingthefunctionssuppliedbyOpenCV.
![Page 68: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/68.jpg)
ThebasicAPIconceptsTheMatclassisthemaindatastructurethatstoresandmanipulatesimagesinOpenCV.Thisclassisdefinedinthecoremodule.OpenCVhasimplementedmechanismstoallocateandreleasememoryautomaticallyforthesedatastructures.However,theprogrammershouldstilltakespecialcarewhendatastructuressharethesamebuffermemory.Forinstance,theassignmentoperatordoesnotcopythememorycontentfromanobject(MatA)toanother(MatB);itonlycopiesthereference(thememoryaddressofthecontent).Then,achangeinoneobject(AorB)affectsbothobjects.ToduplicatethememorycontentofaMatobject,theMat::clone()memberfunctionshouldbeused.
NoteManyfunctionsinOpenCVprocessdensesingleormultichannelarrays,usuallyusingtheMatclass.However,insomecases,adifferentdatatypemaybeconvenient,suchasstd::vector<>,Matx<>,Vec<>,orScalar.Forthispurpose,OpenCVprovidestheproxyclassesInputArrayandOutputArray,whichallowanyoftheprevioustypestobeusedasparametersforfunctions.
TheMatclassisusedfordensen-dimensionalsingleormultichannelarrays.Itcanactuallystorerealorcomplex-valuedvectorsandmatrices,coloredorgrayscaleimages,histograms,pointclouds,andsoon.
TherearemanydifferentwaystocreateaMatobject,themostpopularbeingtheconstructorwherethesizeandtypeofthearrayarespecifiedasfollows:
Mat(nrows,ncols,type,fillValue)
TheinitialvalueforthearrayelementsmightbesetbytheScalarclassasatypicalfour-elementvector(foreachRGBandtransparencycomponentoftheimagestoredinthearray).Next,weshowyouausageexampleofMatasfollows:
Matimg_A(4,4,CV_8U,Scalar(255));
//Whiteimage:
//4x4single-channelarraywith8bitsofunsignedintegers
//(upto255values,validforagrayscaleimage,forexample,
//255=white)
TheDataTypeclassdefinestheprimitivedatatypesforOpenCV.Theprimitivedatatypescanbebool,unsignedchar,signedchar,unsignedshort,signedshort,int,float,double,oratupleofvaluesofoneoftheseprimitivetypes.Anyprimitivetypecanbedefinedbyanidentifierinthefollowingform:
CV_<bitdepth>{U|S|F}C(<numberofchannels>)
IntheprecedingcodeU,S,andFstandforunsigned,signed,andfloat,respectively.Forthesinglechannelarrays,thefollowingenumerationisapplied,describingthedatatypes:
enum{CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5,CV_64F=6};
Note
![Page 69: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/69.jpg)
Here,itshouldbenotedthatthesethreedeclarationsareequivalent:CV_8U,CV_8UC1,andCV_8UC(1).Thesingle-channeldeclarationfitswellforintegerarraysdevotedtograyscaleimages,whereasthethreechanneldeclarationofanarrayismoreappropriateforimageswiththreecomponents(forexample,RGB,BRG,HSV,andsoon).Forlinearalgebraoperations,thearraysoftypefloat(F)mightbeused.
Wecandefinealloftheprecedingdatatypesformultichannelarrays(upto512channels).Thefollowingscreenshotsillustrateanimage’sinternalrepresentationwithonesinglechannel(CV_8U,grayscale)andthesameimagerepresentedwiththreechannels(CV_8UC3,RGB).ThesescreenshotsaretakenbyzoominginonanimagedisplayedinthewindowofanOpenCVexecutable(theshowImageexample):
An8-bitrepresentationofanimageinRGBcolorandgrayscale
NoteItisimportanttonoticethattoproperlysaveaRGBimagewithOpenCVfunctions,theimagemustbestoredinmemorywithitschannelsorderedasBGR.Inthesameway,whenanRGBimageisreadfromafile,itisstoredinmemorywithitschannelsinaBGRorder.Moreover,itneedsasupplementaryfourthchannel(alpha)tomanipulateimageswiththreechannels,RGB,plusatransparency.ForRGBimages,alargerintegervaluemeansabrighterpixelormoretransparencyforthealphachannel.
AllOpenCVclassesandfunctionsareinthecvnamespace,andconsequently,wewillhavethefollowingtwooptionsinoursourcecode:
Addtheusingnamespacecvdeclarationafterincludingtheheaderfiles(thisistheoptionusedinallthecodeexamplesinthisbook).Appendthecv::prefixtoalltheOpenCVclasses,functions,anddatastructuresthat
![Page 70: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/70.jpg)
weuse.ThisoptionisrecommendediftheexternalnamesprovidedbyOpenCVconflictwiththeoften-usedstandardtemplatelibrary(STL)orotherlibraries.
![Page 71: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/71.jpg)
Imagefile-supportedformatsOpenCVsupportsthemostcommonimageformats.However,someofthemneed(freelyavailable)third-partylibraries.ThemainformatssupportedbyOpenCVare:
Windowsbitmaps(*.bmp,*dib)Portableimageformats(*.pbm,*.pgm,*.ppm)Sunrasters(*.sr,*.ras)
Theformatsthatneedauxiliarylibrariesare:
JPEG(*.jpeg,*.jpg,*.jpe)JPEG2000(*.jp2)PortableNetworkGraphics(*.png)TIFF(*.tiff,*.tif)WebP(*.webp).
Inadditiontotheprecedinglistedformats,withtheOpenCV3.0version,itincludesadriverfortheformats(NITF,DTED,SRTM,andothers)supportedbytheGeographicDataAbstractionLibrary(GDAL)setwiththeCMakeoption,WITH_GDAL.NoticethattheGDALsupporthasnotbeenextensivelytestedonWindowsOSesyet.InWindowsandOSX,codecsshippedwithOpenCVareusedbydefault(libjpeg,libjasper,libpng,andlibtiff).Then,intheseOSes,itispossibletoreadtheJPEG,PNG,andTIFFformats.Linux(andotherUnix-likeopensourceOSes)looksforcodecsinstalledinthesystem.ThecodecscanbeinstalledbeforeOpenCVorelsethelibrariescanbebuiltfromtheOpenCVpackagebysettingtheproperoptionsinCMake(forexample,BUILD_JASPER,BUILD_JPEG,BUILD_PNG,andBUILD_TIFF).
![Page 72: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/72.jpg)
TheexamplecodeToillustratehowtoreadandwriteimagefileswithOpenCV,wewillnowdescribetheshowImageexample.Theexampleisexecutedfromthecommandlinewiththecorrespondingoutputwindowsasfollows:
<bin_dir>\showImage.exefruits.jpgfruits_bw.jpg
TheoutputwindowfortheshowImageexample
Inthisexample,twofilenamesaregivenasarguments.Thefirstoneistheinputimagefiletoberead.Thesecondoneistheimagefiletobewrittenwithagrayscalecopyoftheinputimage.Next,weshowyouthesourcecodeanditsexplanation:
#include<opencv2/opencv.hpp>
#include<iostream>
usingnamespacestd;
usingnamespacecv;
intmain(int,char*argv[])
{
Matin_image,out_image;
//Usage:<cmd><file_in><file_out>
//Readoriginalimage
in_image=imread(argv[1],IMREAD_UNCHANGED);
if(in_image.empty()){
//Checkwhethertheimageisreadornot
cout<<"Error!Inputimagecannotberead…\n";
return-1;
![Page 73: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/73.jpg)
}
//Createstwowindowswiththenamesoftheimages
namedWindow(argv[1],WINDOW_AUTOSIZE);
namedWindow(argv[2],WINDOW_AUTOSIZE);
//Showstheimageintothepreviouslycreatedwindow
imshow(argv[1],in_image);
cvtColor(in_image,out_image,COLOR_BGR2GRAY);
imshow(argv[2],in_image);
cout<<"Pressanykeytoexit…\n";
waitKey();//Waitforkeypress
//Writingimage
imwrite(argv[2],in_image);
return0;
}
Here,weusethe#includedirectivewiththeopencv.hppheaderfilethat,infact,includesalltheOpenCVheaderfiles.Byincludingthissinglefile,nomorefilesneedtobeincluded.Afterdeclaringtheuseofcvnamespace,allthevariablesandfunctionsinsidethisnamespacedon’tneedthecv::prefix.Thefirstthingtodointhemainfunctionistocheckthenumberofargumentspassedinthecommandline.Then,ahelpmessageisdisplayedifanerroroccurs.
ReadingimagefilesIfthenumberofargumentsiscorrect,theimagefileisreadintotheMatin_imageobjectwiththeimread(argv[1],IMREAD_UNCHANGED)function,wherethefirstparameteristhefirstargument(argv[1])passedinthecommandlineandthesecondparameterisaflag(IMREAD_UNCHANGED),whichmeansthattheimagestoredintothememoryobjectshouldbeunchanged.Theimreadfunctiondeterminesthetypeofimage(codec)fromthefilecontentratherthanfromthefileextension.
Theprototypefortheimreadfunctionisasfollows:
Matimread(constString&filename,
intflags=IMREAD_COLOR)
Theflagspecifiesthecoloroftheimagereadandtheyaredefinedandexplainedbythefollowingenumerationintheimgcodecs.hppheaderfile:
enum{IMREAD_UNCHANGED=-1,//8bit,colorornot
IMREAD_GRAYSCALE=0,//8bit,gray
IMREAD_COLOR=1,//unchangeddepth,color
IMREAD_ANYDEPTH=2,//anydepth,unchangedcolor
IMREAD_ANYCOLOR=4,//unchangeddepth,anycolor
IMREAD_LOAD_GDAL=8//Usegdaldriver
};
NoteAsofVersion3.0ofOpenCV,theimreadfunctionisintheimgcodecsmoduleandnotinhighguilikeinOpenCV2.x.
Tip
![Page 74: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/74.jpg)
AsseveralfunctionsanddeclarationsaremovedintoOpenCV3.0,itispossibletogetsomecompilationerrorsasoneormoredeclarations(symbolsand/orfunctions)arenotfoundbythelinker.Tofigureoutwhere(*.hpp)asymbolisdefinedandwhichlibrarytolink,werecommendthefollowingtrickusingtheQtCreatorIDE:
Addthe#include<opencv2/opencv.hpp>declarationtothecode.PresstheF2functionkeywiththemousecursoroverthesymbolorfunction;thisopensthe*.hppfilewherethesymbolorfunctionisdeclared.
Aftertheinputimagefileisread,checktoseewhethertheoperationsucceeded.Thischeckisachievedwiththein_image.empty()memberfunction.Iftheimagefileisreadwithouterrors,twowindowsarecreatedtodisplaytheinputandoutputimages,respectively.Thecreationofwindowsiscarriedoutwiththefollowingfunction:
voidnamedWindow(constString&winname,intflags=WINDOW_AUTOSIZE)
OpenCVwindowsareidentifiedbyaunivocalnameintheprogram.Theflags’definitionandtheirexplanationaregivenbythefollowingenumerationinthehighgui.hppheaderfile:
enum{WINDOW_NORMAL=0x00000000,
//theusercanresizethewindow(noconstraint)
//alsousetoswitchafullscreenwindowtoanormalsize
WINDOW_AUTOSIZE=0x00000001,
//theusercannotresizethewindow,
//thesizeisconstrainedbytheimagedisplayed
WINDOW_OPENGL=0x00001000,//windowwithopenglsupport
WINDOW_FULLSCREEN=1,
WINDOW_FREERATIO=0x00000100,
//theimageexpendsasmuchasitcan(noratioconstraint)
WINDOW_KEEPRATIO=0x00000000
//theratiooftheimageisrespected
};
Thecreationofawindowdoesnotshowanythingonscreen.Thefunction(belongingtothehighguimodule)todisplayanimageinawindowis:
voidimshow(constString&winname,InputArraymat)
Theimage(mat)isshownwithitsoriginalsizeifthewindow(winname)wascreatedwiththeWINDOW_AUTOSIZEflag.
IntheshowImageexample,thesecondwindowshowsagrayscalecopyoftheinputimage.Toconvertacolorimagetograyscale,thecvtColorfunctionfromtheimgprocmoduleisused.Thisfunctioncanactuallybeusedtochangetheimagecolorspace.
Anywindowcreatedinaprogramcanberesizedandmovedfromitsdefaultsettings.Whenanywindowisnolongerrequired,itshouldbedestroyedinordertoreleaseitsresources.Thisresourceliberationisdoneimplicitlyattheendofaprogram,likeintheexample.
Eventhandlingintotheintrinsicloop
![Page 75: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/75.jpg)
Ifwedonothingmoreaftershowinganimageonawindow,surprisingly,theimagewillnotbeshownatall.Aftershowinganimageonawindow,weshouldstartalooptofetchandhandleeventsrelatedtouserinteractionwiththewindow.Suchataskiscarriedoutbythefollowingfunction(fromthehighguimodule):
intwaitKey(intdelay=0)
Thisfunctionwaitsforakeypressedduringanumberofmilliseconds(delay>0)returningthecodeofthekeyor-1ifthedelayendswithoutakeypressed.Ifdelayis0ornegative,thefunctionwaitsforeveruntilakeyispressed.
NoteRememberthatthewaitKeyfunctiononlyworksifthereisacreatedandactivewindowatleast.
WritingimagefilesAnotherimportantfunctionintheimgcodecsmoduleis:
boolimwrite(constString&filename,InputArrayimg,constvector<int>&
params=vector<int>())
Thisfunctionsavestheimage(img)intoafile(filename),beingthethirdoptionalargumentavectorofproperty-valuepairsspecifyingtheparametersofthecodec(leaveitemptytousethedefaultvalues).Thecodecisdeterminedbytheextensionofthefile.
NoteForadetailedlistofcodecproperties,takealookattheimgcodecs.hppheaderfileandtheOpenCVAPIreferenceathttp://docs.opencv.org/master/modules/refman.html.
![Page 76: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/76.jpg)
![Page 77: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/77.jpg)
ReadingandwritingvideofilesRatherthanstillimages,avideodealswithmovingimages.Thesourcesofvideocanbeadedicatedcamera,awebcam,avideofile,orasequenceofimagefiles.InOpenCV,theVideoCaptureandVideoWriterclassesprovideaneasy-to-useC++APIforthetaskofcapturingandrecordinginvolvedinvideoprocessing.
![Page 78: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/78.jpg)
TheexamplecodeTherecVideoexampleisashortsnippetofcodewhereyoucanseehowtouseadefaultcameraasacapturedevicetograbframes,processthemforedgedetection,andsavethisnewconvertedframetoafile.Also,twowindowsarecreatedtosimultaneouslyshowyoutheoriginalframeandtheprocessedone.Theexamplecodeis:
#include<opencv2/opencv.hpp>
#include<iostream>
usingnamespacestd;
usingnamespacecv;
intmain(int,char**)
{
Matin_frame,out_frame;
constcharwin1[]="Grabbing…",win2[]="Recording…";
doublefps=30;//Framespersecond
charfile_out[]="recorded.avi";
VideoCaptureinVid(0);//Opendefaultcamera
if(!inVid.isOpened()){//Checkerror
cout<<"Error!Cameranotready…\n";
return-1;
}
//Getsthewidthandheightoftheinputvideo
intwidth=(int)inVid.get(CAP_PROP_FRAME_WIDTH);
intheight=(int)inVid.get(CAP_PROP_FRAME_HEIGHT);
VideoWriterrecVid(file_out,
VideoWriter::fourcc('M','S','V','C'),
fps,Size(width,height));
if(!recVid.isOpened()){
cout<<"Error!Videofilenotopened…\n";
return-1;
}
//Createtwowindowsfororig.andfinalvideo
namedWindow(win1);
namedWindow(win2);
while(true){
//Readframefromcamera(grabbinganddecoding)
inVid>>in_frame;
//Converttheframetograyscale
cvtColor(in_frame,out_frame,COLOR_BGR2GRAY);
//Writeframetovideofile(encodingandsaving)
recVid<<out_frame;
imshow(win1,in_frame);//Showframeinwindow
imshow(win2,out_frame);//Showframeinwindow
if(waitKey(1000/fps)>=0)
break;
}
inVid.release();//Closecamera
return0;
}
Inthisexample,thefollowingfunctionsdeserveaquickreview:
![Page 79: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/79.jpg)
doubleVideoCapture::get(intpropId):ThisreturnsthevalueofthespecifiedpropertyforaVideoCaptureobject.AcompletelistofpropertiesbasedonDC1394(IEEE1394DigitalCameraSpecifications)isincludedwiththevideoio.hppheaderfile.staticintVideoWriter::fourcc(charc1,charc2,charc3,charc4):Thisconcatenatesfourcharacterstoafourcccode.Intheexample,MSVCstandsforMicrosoftVideo(onlyavailableforWindows).Thelistofvalidfourcccodesispublishedathttp://www.fourcc.org/codecs.php.boolVideoWriter::isOpened():Thisreturnstrueiftheobjectforwritingthevideowassuccessfullyinitialized.Forinstance,usinganimpropercodecproducesanerror.
TipBecautious;thevalidfourcccodesinasystemdependonthelocallyinstalledcodecs.Toknowtheinstalledfourcccodecsavailableinthelocalsystem,werecommendtheopensourcetoolMediaInfo,availableformanyplatformsathttp://mediaarea.net/en/MediaInfo.
VideoCapture&VideoCapture::operator>>(Mat&image):Thisgrabs,decodes,andreturnsthenextframe.ThismethodhastheequivalentboolVideoCapture::read(OutputArrayimage)function.ItcanbeusedratherthanusingtheVideoCapture::grab()function,followedbyVideoCapture::retrieve().VideoWriter&VideoWriter::operator<<(constMat&image):Thiswritesthenextframe.ThismethodhastheequivalentvoidVideoWriter::write(constMat&image)function.
Inthisexample,thereisareading/writingloopwherethewindoweventsarefetchedandhandledaswell.ThewaitKey(1000/fps)functioncallisinchargeofthat;however,inthiscase,1000/fpsindicatesthenumberofmillisecondstowaitbeforereturningtotheexternalloop.Althoughnotexact,anapproximatemeasureofframespersecondisobtainedfortherecordedvideo.
voidVideoCapture::release():Thisreleasesthevideofileorcapturingdevice.Althoughnotexplicitlynecessaryinthisexample,weincludeittoillustrateitsuse.
![Page 80: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/80.jpg)
![Page 81: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/81.jpg)
User-interactionstoolsIntheprevioussections,weexplainedhowtocreate(namedWindow)awindowtodisplay(imshow)animageandfetch/handleevents(waitKey).TheexamplesweprovideshowyouaveryeasymethodforuserinteractionwithOpenCVapplicationsthroughthekeyboard.ThewaitKeyfunctionreturnsthecodeofakeypressedbeforeatimeoutexpires.
Fortunately,OpenCVprovidesmoreflexiblewaysforuserinteraction,suchastrackbarsandmouseinteraction,whichcanbecombinedwithsomedrawingfunctionstoprovidearicheruserexperience.Moreover,ifOpenCVislocallycompiledwithQtsupport(theWITH_QToptionofCMake),asetofnewfunctionsareavailabletoprogramanevenbetterUI.
Inthissection,weprovideaquickreviewoftheavailablefunctionalitytoprogramuserinterfacesinanOpenCVprojectwithQtsupport.WeillustratethisreviewonOpenCVUIsupportwiththenextexamplenamedshowUI.
Theexampleshowsyouacolorimageinawindow,illustratinghowtousesomebasicelementstoenrichtheuserinteraction.ThefollowingscreenshotdisplaystheUIelementscreatedintheexample:
![Page 82: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/82.jpg)
TheoutputwindowfortheshowUIexample
ThesourcecodeoftheshowUIexample(withoutthecallbackfunctions)isasfollows:
#include<opencv2/opencv.hpp>
#include<iostream>
usingnamespacestd;
usingnamespacecv;
//Callbackfunctionsdeclarations
voidcbMouse(intevent,intx,inty,intflags,void*);
voidtb1_Callback(intvalue,void*);
voidtb2_Callback(intvalue,void*);
voidcheckboxCallBack(intstate,void*);
voidradioboxCallBack(intstate,void*id);
voidpushbuttonCallBack(int,void*font);
//Globaldefinitionsandvariables
Matorig_img,tmp_img;
constcharmain_win[]="main_win";
charmsg[50];
intmain(int,char*argv[]){
constchartrack1[]="TrackBar1";
constchartrack2[]="TrackBar2";
constcharcheckbox[]="CheckBox";
constcharradiobox1[]="RadioBox1";
constcharradiobox2[]="RadioBox2";
constcharpushbutton[]="PushButton";
inttb1_value=50;//Initialvalueoftrackbar1
inttb2_value=25;//Initialvalueoftrackbar1
orig_img=imread(argv[1]);//Openandreadtheimage
if(orig_img.empty()){
cout<<"Error!!!Imagecannotbeloaded…"<<endl;
return-1;
}
namedWindow(main_win);//Createsmainwindow
//Createsafontforaddingtexttotheimage
QtFontfont=fontQt("Arial",20,Scalar(255,0,0,0),
QT_FONT_BLACK,QT_STYLE_NORMAL);
//CreationofCallBackfunctions
setMouseCallback(main_win,cbMouse,NULL);
createTrackbar(track1,main_win,&tb1_value,
100,tb1_Callback);
createButton(checkbox,checkboxCallBack,0,
QT_CHECKBOX);
//Passingvalues(font)totheCallBack
createButton(pushbutton,pushbuttonCallBack,
(void*)&font,QT_PUSH_BUTTON);
createTrackbar(track2,NULL,&tb2_value,
50,tb2_Callback);
//PassingvaluestotheCallBack
![Page 83: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/83.jpg)
createButton(radiobox1,radioboxCallBack,
(void*)radiobox1,QT_RADIOBOX);
createButton(radiobox2,radioboxCallBack,
(void*)radiobox2,QT_RADIOBOX);
imshow(main_win,orig_img);//Showsoriginalimage
cout<<"Pressanykeytoexit…"<<endl;
waitKey();//Infiniteloopwithhandleforevents
return0;
}
WhenOpenCVisbuiltwithQtsupport,everycreatedwindow—throughthehighguimodule—showsadefaulttoolbar(seetheprecedingfigure)withoptions(fromlefttoright)forpanning,zooming,saving,andopeningthepropertieswindow.
Additionaltothementionedtoolbar(onlyavailablewithQt),inthenextsubsections,wecommentthedifferentUIelementscreatedintheexampleandthecodetoimplementthem.
![Page 84: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/84.jpg)
TrackbarsTrackbarsarecreatedwiththecreateTrackbar(constString&trackbarname,constString&winname,int*value,intcount,TrackbarCallbackonChange=0,void*
userdata=0)functioninthespecifiedwindow(winname),withalinkedintegervalue(value),amaximumvalue(count),anoptionalcallbackfunction(onChange)tobecalledonchangesoftheslider,andanargument(userdata)tothecallbackfunction.Thecallbackfunctionitselfgetstwoarguments:value(selectedbytheslider)andapointertouserdata(optional).WithQtsupport,ifnowindowisspecified,thetrackbariscreatedinthepropertieswindow.IntheshowUIexample,wecreatetwotrackbars:thefirstinthemainwindowandthesecondoneinthepropertieswindow.Thecodeforthetrackbarcallbacksis:
voidtb1_Callback(intvalue,void*){
sprintf(msg,"Trackbar1changed.Newvalue=%d",value);
displayOverlay(main_win,msg);
return;
}
voidtb2_Callback(intvalue,void*){
sprintf(msg,"Trackbar2changed.Newvalue=%d",value);
displayStatusBar(main_win,msg,1000);
return;
}
![Page 85: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/85.jpg)
MouseinteractionMouseeventsarealwaysgeneratedsothattheuserinteractswiththemouse(movingandclicking).Bysettingtheproperhandlerorcallbackfunctions,itispossibletoimplementactionssuchasselect,draganddrop,andsoon.Thecallbackfunction(onMouse)isenabledwiththesetMouseCallback(constString&winname,MouseCallbackonMouse,void*userdata=0)functioninthespecifiedwindow(winname)andoptionalargument(userdata).
Thesourcecodeforthecallbackfunctionthathandlesthemouseeventis:
voidcbMouse(intevent,intx,inty,intflags,void*){
//Staticvarsholdvaluesbetweencalls
staticPointp1,p2;
staticboolp2set=false;
//Leftmousebuttonpressed
if(event==EVENT_LBUTTONDOWN){
p1=Point(x,y);//Setorig.point
p2set=false;
}elseif(event==EVENT_MOUSEMOVE&&
flags==EVENT_FLAG_LBUTTON){
//Checkmovingmouseandleftbuttondown
//Checkoutbounds
if(x>orig_img.size().width)
x=orig_img.size().width;
elseif(x<0)
x=0;
//Checkoutbounds
if(y>orig_img.size().height)
y=orig_img.size().height;
elseif(y<0)
y=0;
p2=Point(x,y);//Setfinalpoint
p2set=true;
//Copyorig.totemp.image
orig_img.copyTo(tmp_img);
//Drawsrectangle
rectangle(tmp_img,p1,p2,Scalar(0,0,255));
//Drawtemporalimagewithrect.
imshow(main_win,tmp_img);
}elseif(event==EVENT_LBUTTONUP
&&p2set){
//Checkifleftbuttonisreleased
//andselectedanarea
//Setsubarrayonorig.image
//withselectedrectangle
Matsubmat=orig_img(Rect(p1,p2));
//Heresomeprocessingforthesubmatrix
//...
//Marktheboundariesofselectedrectangle
rectangle(orig_img,p1,p2,Scalar(0,0,255),2);
imshow("main_win",orig_img);
}
![Page 86: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/86.jpg)
return;
}
IntheshowUIexample,themouseeventsareusedtocontrolthroughacallbackfunction(cbMouse),theselectionofarectangularregionbydrawingarectanglearoundit.Intheexample,thisfunctionisdeclaredasvoidcbMouse(intevent,intx,inty,intflags,void*),theargumentsbeingthepositionofthepointer(x,y)wheretheeventoccurs,theconditionwhentheeventoccurs(flags),andoptionally,userdata.
NoteTheavailableevents,flags,andtheircorrespondingdefinitionsymbolscanbefoundinthehighgui.hppheaderfile.
![Page 87: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/87.jpg)
ButtonsOpenCV(onlywithQtsupport)allowsyoutocreatethreetypesofbuttons:checkbox(QT_CHECKBOX),radiobox(QT_RADIOBOX),andpushbutton(QT_PUSH_BUTTON).Thesetypesofbuttoncanbeusedrespectivelytosetoptions,setexclusiveoptions,andtakeactionsonpush.ThethreearecreatedwiththecreateButton(constString&button_name,ButtonCallbackon_change,void*userdata=0,int
type=QT_PUSH_BUTTON,boolinit_state=false)functioninthepropertieswindowarrangedinabuttonbarafterthelasttrackbarcreatedinthiswindow.Theargumentsforthebuttonareitsname(button_name),thecallbackfunctioncalledonthestatuschange(on_change),andoptionally,anargument(userdate)tothecallback,thetypeofbutton(type),andtheinitialstateofthebutton(init_state).
Next,weshowyouthesourcecodeforthecallbackfunctionscorrespondingtobuttonsintheexample:
voidcheckboxCallBack(intstate,void*){
sprintf(msg,"Checkboxchanged.Newstate=%d",state);
displayStatusBar(main_win,msg);
return;
}
voidradioboxCallBack(intstate,void*id){
//IdoftheradioboxpassedtothecallBack
sprintf(msg,"%schanged.Newstate=%d",
(char*)id,state);
displayStatusBar(main_win,msg);
return;
}
voidpushbuttonCallBack(int,void*font){
//Addtexttotheimage
addText(orig_img,"Pushbuttonclicked",
Point(50,50),*((QtFont*)font));
imshow(main_win,orig_img);//Showsoriginalimage
return;
}
Thecallbackfunctionforabuttongetstwoarguments:itsstatusand,optionally,apointertouserdata.IntheshowUIexample,weshowyouhowtopassaninteger(radioboxCallBack(intstate,void*id))toidentifythebuttonandamorecomplexobject(pushbuttonCallBack(int,void*font)).
![Page 88: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/88.jpg)
DrawinganddisplayingtextAveryefficientwaytocommunicatetheresultsofsomeimageprocessingtotheuserisbydrawingshapesor/anddisplayingtextoverthefigurebeingprocessed.Throughtheimgprocmodule,OpenCVprovidessomeconvenientfunctionstoachievesuchtasksasputtingtext,drawinglines,circles,ellipses,rectangles,polygons,andsoon.TheshowUIexampleillustrateshowtoselectarectangularregionoveranimageanddrawarectangletomarktheselectedarea.Thefollowingfunctiondraws(img)arectangledefinedbytwopoints(p1,p2)overanimagewiththespecifiedcolorandotheroptionalparametersasthickness(negativeforafillshape)andthetypeoflines:
voidrectangle(InputOutputArrayimg,Pointpt1,Pointpt2,constScalar&
color,intthickness=1,intlineType=LINE_8,intshift=0)
Additionaltoshapes’drawingsupport,theimgprocmoduleprovidesafunctiontoputtextoveranimagewiththefunction:
voidputText(InputOutputArrayimg,constString&text,Pointorg,int
fontFace,doublefontScale,Scalarcolor,intthickness=1,int
lineType=LINE_8,boolbottomLeftOrigin=false)
NoteTheavailablefontfacesforthetextcanbeinspectedinthecore.hppheaderfile.
Qtsupport,inthehighguimodule,addssomeadditionalwaystoshowtextonthemainwindowofanOpenCVapplication:
Textovertheimage:WegetthisresultusingtheaddText(constMat&img,constString&text,Pointorg,constQtFont&font)function.ThisfunctionallowsyoutoselecttheoriginpointforthedisplayedtextwithafontpreviouslycreatedwiththefontQt(constString&nameFont,intpointSize=-1,Scalarcolor=Scalar::all(0),intweight=QT_FONT_NORMAL,int
style=QT_STYLE_NORMAL,intspacing=0)function.IntheshowUIexample,thisfunctionisusedtoputtextovertheimagewhenthepushbuttonisclickedon,callingtheaddTextfunctioninsidethecallbackfunction.Textonthestatusbar:UsingthedisplayStatusBar(constString&winname,constString&text,intdelayms=0)function,wedisplaytextinthestatusbarforanumberofmillisecondsgivenbythelastargument(delayms).IntheshowUIexample,thisfunctionisused(inthecallbackfunctions)todisplayaninformativetextwhenthebuttonsandtrackbarofthepropertieswindowchangetheirstate.Textoverlaidontheimage:UsingthedisplayOverlay(constString&winname,constString&text,intdelayms=0)function,wedisplaytextoverlaidontheimageforanumberofmillisecondsgivenbythelastargument.IntheshowUIexample,thisfunctionisused(inthecallbackfunction)todisplayinformativetextwhenthemainwindowtrackbarchangesitsvalue.
![Page 89: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/89.jpg)
![Page 90: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/90.jpg)
SummaryInthischapter,yougotaquickreviewofthemainpurposeoftheOpenCVlibraryanditsmodules.Youlearnedthefoundationsofhowtocompile,install,andusethelibraryinyourlocalsystemtodevelopC++OpenCVapplicationswithQtsupport.Todevelopyourownsoftware,weexplainedhowtostartwiththefreeQtCreatorIDEandtheGNUcompilerkit.
Tostartwith,fullcodeexampleswereprovidedinthechapter.Theseexamplesshowedyouhowtoreadandwriteimagesandvideo.Finally,thechaptergaveyouanexampleofdisplayingsomeeasy-to-implementuserinterfacecapabilitiesinOpenCVprograms,suchastrackbars,buttons,puttingtextonimages,drawingshapes,andsoon.
Thenextchapterwillbedevotedtoestablishingthemainimageprocessingtoolsandtasksthatwillsetthebasisfortheremainingchapters.
![Page 91: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/91.jpg)
![Page 92: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/92.jpg)
Chapter2.EstablishingImageProcessingToolsThischapterdescribesthemaindatastructuresandbasicproceduresthatwillbeusedinsubsequentchapters:
ImagetypesPixelaccessBasicoperationswithimagesHistograms
Thesearesomeofthemostfrequentoperationsthatwewillhavetoperformonimages.Mostofthefunctionalitycoveredhereisinthecoremoduleofthelibrary.
![Page 93: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/93.jpg)
BasicdatatypesThefundamentaldatatypeinOpenCVisMat,asitisusedtostoreimages.Basically,animageisstoredasaheaderplusamemoryzonecontainingthepixeldata.Imageshaveanumberofchannels.Grayscaleimageshaveasinglechannel,whilecolorimagestypicallyhavethreeforthered,green,andbluecomponents(althoughOpenCVstorestheminareverseorder,thatisblue,green,andred).Afourthtransparency(alpha)channelcanalsobeused.Thenumberofchannelsforanimgimagecanberetrievedwithimg.channels().
Eachpixelinanimageisstoredusinganumberofbits.Thisiscalledtheimagedepth.Forgrayscaleimages,pixelsarecommonlystoredin8bits,thusallowing256graylevels(integervalues0to255).Forcolorimages,eachpixelisstoredinthreebytes,onepercolorchannel.Insomeoperations,itwillbenecessarytostorepixelsinafloating-pointformat.Theimagedepthcanbeobtainedwithimg.depth(),andthevaluesreturnedare:
CV_8U,8-bitunsignedintegers(0..255)CV_8S,8-bitsignedintegers(-128..127)CV_16U,16-bitunsignedintegers(0..65,535)CV_16S,16-bitsignedintegers(-32,768..32,767)CV_32S,32-bitsignedintegers(-2,147,483,648..2,147,483,647)CV_32F,32-bitfloating-pointnumbersCV_64F,64-bitfloating-pointnumbers
NotethatthemostcommonimagedepthwillbeCV_8Uforbothgrayscaleandcolorimages.ItispossibletoconvertfromonedepthtoanotherusingtheconvertTomethod:
Matimg=imread("lena.png",IMREAD_GRAYSCALE);
Matfp;
img.convertTo(fp,CV_32F);
Itiscommontoperformanoperationonfloating-pointimages(thatis,pixelvaluesaretheresultofamathematicaloperation).Ifweuseimshow()todisplaythisimage,wewillnotseeanythingmeaningful.Inthiscase,wehavetoconvertpixelstotheintegerrange0..255.TheconvertTofunctionimplementsalineartransformationandhastwoadditionalparameters,alphaandbeta,whichrepresentascalefactorandadeltavaluetoadd,respectively.Thismeansthateachpixelpisconvertedwith:
newp=alpha*p+beta
Thiscanbeusedtodisplayfloatingpointimagesproperly.AssumingthattheimgimagehasmandMminimumandmaximumvalues(refertothefollowingcodetoseehowtoobtainthesevalues),wewouldusethis:
Matm1=Mat(100,100,CV_32FC1);
randu(m1,0,1e6);//randomvaluesbetween0and1e6
imshow("original",m1);
doubleminRange,MaxRange;
PointmLoc,MLoc;
minMaxLoc(m1,&minRange,&MaxRange,&mLoc,&MLoc);
Matimg1;
![Page 94: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/94.jpg)
m1.convertTo(img1,CV_8U,255.0/(MaxRange-minRange),-255.0/minRange);
imshow("result",img1);
Thiscodemapstherangeoftheresultimagevaluestotherange0-255.Thefollowingimageshowsyoutheresultofrunningthecode:
TheresultofconvertTo(notethattheimageontheleft-handsideisdisplayedaswhite)
Theimagesizecanbeobtainedwiththerowsandcolsattributes.Thereisalsoasizeattributethatretrievesboth:
MatSizes=img.size;
intr=l[0];
intc=l[1];
Apartfromtheimageitself,otherdatatypesareverycommon;refertothefollowingtable:
Type Typekeyword Example
(Small)vector VecAB,whereAcanbe2,3,4,5or6,Bcanbeb,s,i,f,ord Vec3brgb;
rgb[0]=255;
(Upto4)scalars Scalar
Scalara;
a[0]=0;
a[1]=0;
Point PointAB,whereAcanbe2or3andBcanbei,f,ordPoint3dp;
p.x=0;
p.y=0;
p.z=0;
Size Size
Sizes;
s.width=30;
s.height=40;
Rectangle Rect
Rectr;
r.x=r.y=0;
r.width=r.height=100;
Someofthesetypeshaveadditionaloperations.Forexample,wecancheckwhetherapointliesinsidearectangle:
p.inside(r)
Thepandrargumentsare(two-dimensional)pointandrectangle,respectively.Notethatinanycase,theprecedingtableisnotexhaustive;OpenCVprovidesmanymoresupport
![Page 95: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/95.jpg)
structureswithassociatedmethods.
![Page 96: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/96.jpg)
![Page 97: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/97.jpg)
Pixel-levelaccessToprocessimages,wehavetoknowhowtoaccesseachpixelindependently.OpenCVprovidesanumberofwaystodothis.Inthissection,wecovertwomethods;thefirstoneiseasyfortheprogrammer,whilethesecondoneismoreefficient.
Thefirstmethodusestheat<>templatefunction.Inordertouseit,wehavetospecifythetypeofmatrixcells,suchasinthisshortexample:
Matsrc1=imread("lena.jpg",IMREAD_GRAYSCALE);
ucharpixel1=src1.at<uchar>(0,0);
cout<<"Valueofpixel(0,0):"<<(unsignedint)pixel1<<endl;
Matsrc2=imread("lena.jpg",IMREAD_COLOR);
Vec3bpixel2=src2.at<Vec3b>(0,0);
cout<<"Bcomponentofpixel(0,0):"<<(unsignedint)pixel2[0]<<endl;
Theexamplereadsanimageinbothgrayscaleandcolorandaccessesthefirstpixelat(0,0).Inthefirstcase,thepixeltypeisunsignedchar(thatis,uchar).Inthesecondcase,whentheimageisreadinfullcolor,wehavetousetheVec3btype,whichreferstoatripletofunsignedchars.Ofcourse,theat<>functioncanalsoappearontheleft-handsideofanassignment,thatis,tochangethevalueofapixel.
Thefollowingisanothershortexampleinwhichafloating-pointmatrixisinitializedtothePivalueusingthismethod:
MatM(200,200,CV_64F);
for(inti=0;i<M.rows;i++)
for(intj=0;j<M.cols;j++)
M.at<double>(i,j)=CV_PI;
Notethattheat<>methodisnotveryefficientasithastocalculatetheexactmemorypositionfromthepixelrowandcolumn.Thiscanbeverytimeconsumingwhenweprocessthewholeimagepixelbypixel.Thesecondmethodusestheptrfunction,whichreturnsapointertoaspecificimagerow.Thefollowingsnippetobtainsthepixelvalueofeachpixelinacolorimage:
ucharR,G,B;
for(inti=0;i<src2.rows;i++)
{
Vec3b*pixrow=src2.ptr<Vec3b>(i);
for(intj=0;j<src2.cols;j++)
{
B=pixrow[j][0];
G=pixrow[j][1];
R=pixrow[j][2];
}
}
Intheexampleabove,ptrisusedtogetapointertothefirstpixelineachrow.Usingthispointer,wecannowaccesseachcolumnintheinnermostloop.
![Page 98: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/98.jpg)
![Page 99: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/99.jpg)
MeasuringthetimeProcessingimagestakestime(comparablymuchmorethanthetimeittakestoprocess1Ddata).Often,processingtimeisthecrucialfactorthatdecideswhetherasolutionispracticalornot.OpenCVprovidestwofunctionstomeasuretheelapsedtime:getTickCount()andgetTickFrequency().You’llusethemlikethis:
doublet0=(double)getTickCount();
//yourstuffhere…
elapsed=((double)getTickCount()–t0)/getTickFrequency();
Here,elapsedisinseconds.
![Page 100: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/100.jpg)
![Page 101: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/101.jpg)
CommonoperationswithimagesThefollowingtablesummarizesthemosttypicaloperationswithimages:
Operation Codeexamples
Setmatrixvalues img.setTo(0);//for1-channelimg
img.setTo(Scalar(B,G,R);//3-channelimg
MATLAB-stylematrixinitializationMatm1=Mat::eye(100,100,CV_64F);
Matm3=Mat::zeros(100,100,CV_8UC1);
Matm2=Mat::ones(100,100,CV_8UC1)*255;
Randominitialization Matm1=Mat(100,100,CV_8UC1);
randu(m1,0,255);
Createacopyofthematrix Matimg1=img.clone();
Createacopyofthematrix(withthemask)
img.copy(img1,mask);
Referenceasubmatrix(thedataisnotcopied)
Matimg1=img(Range(r1,r2),Range(c1,c2));
Imagecrop Rectroi(r1,c2,width,height);
Matimg1=img(roi).clone();//datacopied
Resizeimage resize(img,imag1,Size(),0.5,0.5);//decimatebyafactor
of2
Flipimageflip(imgsrc,imgdst,code);
//code=0=>verticalflipping
//code>0=>horizontalflipping
//code<0=>vertical&horizontalflipping
SplitchannelsMatchannel[3];
split(img,channel);
imshow("B",channel[0]);//showblue
Mergechannels merge(channel,img);
Countnonzeropixels intnz=countNonZero(img);
Minimumandmaximum doublem,M;
PointmLoc,MLoc;minMaxLoc(img,&m,&M,&mLoc,&MLoc);
ThemeanpixelvalueScalarm,stdd;
meanStdDev(img,m,stdd);
uintmean_pxl=mean.val[0];
Checkwhethertheimagedataisnull If(img.empty())
cout<<"couldn'tloadimage";
![Page 102: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/102.jpg)
![Page 103: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/103.jpg)
ArithmeticoperationsArithmeticoperatorsareoverloaded.ThismeansthatwecanoperateonMatimageslikewecaninthisexample:
imgblend=0.2*img1+0.8*img2;
InOpenCV,theresultvalueofanoperationissubjecttotheso-calledsaturationarithmetic.Thismeansthatthefinalvalueisactuallythenearestintegerinthe0..255range.
Bitwiseoperationsbitwise_and(),bitwise_or(),bitwise_xor(),andbitwise_not()canbeveryusefulwhenworkingwithmasks.Masksarebinaryimagesthatindicatethepixelsinwhichanoperationistobeperformed(insteadofthewholeimage).Thefollowingbitwise_andexampleshowsyouhowtousetheANDoperationtocroppartofanimage:
#include<opencv2/opencv.hpp>
usingnamespacecv;
usingnamespacestd;
intmain()
{
Matimg1=imread("lena.png",IMREAD_GRAYSCALE);
if(img1.empty())
{
cout<<"Cannotloadimage!"<<endl;
return-1;
}
imshow("Original",img1);//Original
//Createmaskimage
Matmask(img1.rows,img1.cols,CV_8UC1,Scalar(0,0,0));
circle(mask,Point(img1.rows/2,img1.cols/2),150,255,-1);
imshow("Mask",mask);
//performAND
Matr;
bitwise_and(img1,mask,r);
//filloutsidewithwhite
constucharwhite=255;
for(inti=0;i<r.rows;i++)
for(intj=0;j<r.cols;j++)
if(!mask.at<uchar>(i,j))
r.at<uchar>(i,j)=white;
imshow("Result",r);
waitKey(0);
return0;
![Page 104: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/104.jpg)
}
Afterreadinganddisplayingtheinputimage,wecreateamaskbydrawingafilledwhitecircle.IntheANDoperation,thismaskisused.Thelogicaloperationisonlyappliedinthosepixelsinwhichthemaskvalueisnotzero;otherpixelsarenotaffected.Finally,inthisexample,wefilltheouterpartoftheresultimage(thatis,outsidethecircle)withwhite.Thisisdoneusingoneofthepixelaccessmethodsexplainedpreviously.Seetheresultingimagesinthefollowingscreenshot:
Theresultofthebitwise_andexample
Next,anothercoolexampleisshowninwhichweestimatethevalueofPi.Let’sconsiderasquareanditsenclosedcircle:
Theirareasaregivenby:
Fromthis,wehave:
![Page 105: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/105.jpg)
Let’sassumethatwehaveasquareimageofunknownsidelengthandanenclosedcircle.Wecanestimatetheareaoftheenclosedcirclebypaintingmanypixelsinrandompositionswithintheimageandcountingthosethatfallinsidetheenclosedcircle.Ontheotherhand,theareaofthesquareisestimatedasthetotalnumberofpixelspainted.ThiswouldallowyoutoestimatethevalueofPiusingthepreviousequation.
Thefollowingalgorithmsimulatesthis:
1. Onablacksquareimage,paintasolidwhiteenclosedcircle.2. Onanotherblacksquareimage(samedimensions),paintalargenumberofpixelsat
randompositions.3. PerformanANDoperationbetweenthetwoimagesandcountnonzeropixelsinthe
resultingimage.4. EstimatePiusingtheequation.
ThefollowingisthecodefortheestimatePiexample:
#include<opencv2/opencv.hpp>
usingnamespacecv;
usingnamespacestd;
intmain()
{
constintside=100;
constintnpixels=8000;
inti,j;
Mats1=Mat::zeros(side,side,CV_8UC1);
Mats2=s1.clone();
circle(s1,Point(side/2,side/2),side/2,255,-1);
imshow("s1",s1);
for(intk=0;k<npixels;k++)
{
i=rand()%side;
j=rand()%side;
s2.at<uchar>(i,j)=255;
}
Matr;
bitwise_and(s1,s2,r);
imshow("s2",s2);
imshow("r",r);
![Page 106: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/106.jpg)
intAcircle=countNonZero(r);
intAsquare=countNonZero(s2);
floatPi=4*(float)Acircle/Asquare;
cout<<"EstimatedvalueofPi:"<<Pi<<endl;
waitKey();
return0;
}
Theprogramfollowstheprecedingalgorithmexactly.NotethatweusethecountNonZerofunctiontocountnonzero(white,inthiscase)pixels.Fornpixels=8000,theestimatewas3.125.Thelargerthevalueofnpixels,thebettertheestimation.
TheoutputoftheestimatePiexample
![Page 107: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/107.jpg)
![Page 108: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/108.jpg)
DatapersistenceApartfromthespecificfunctionstoreadandwriteimagesandvideo,inOpenCV,thereisamoregenericwaytosave/loadthedata.Thisisreferredtoasdatapersistence:thevalueofobjectsandvariablesintheprogramcanberecorded(serialized)onthedisk.Thiscanbeveryusefultosaveresultsandloadtheconfigurationdata.ThemainclassistheaptlynamedFileStorage,whichrepresentsafileonadisk.DataisactuallystoredinXMLorYAMLformats.
Thesearethestepsinvolvedwhenwritingdata:
1. CalltheFileStorageconstructor,passingafilenameandaflagwiththeFileStorage::WRITEvalue.Thedataformatisdefinedbythefileextension(thatis,.xml,.yml,or.yaml).
2. Usethe<<operatortowritedatatothefile.Dataistypicallywrittenasstring-valuepairs.
3. Closethefileusingthereleasemethod.
Readingdatarequiresthatyoufollowthesesteps:
1. CalltheFileStorageconstructor,passingafilenameandaflagwiththeFileStorage::READvalue.
2. Usethe[]or>>operatortoreaddatafromthefile.3. Closethefileusingthereleasemethod.
Thefollowingexampleusesdatapersistencetosaveandloadtrackbarvalues.
#include<opencv2/opencv.hpp>
usingnamespacecv;
usingnamespacestd;
Matimg1;
voidtb1_Callback(intvalue,void*)
{
Mattemp=img1+value;
imshow("main_win",temp);
}
intmain()
{
img1=imread("lena.png",IMREAD_GRAYSCALE);
if(img1.empty())
{
cout<<"Cannotloadimage!"<<endl;
return-1;
}
inttb1_value=0;
![Page 109: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/109.jpg)
//loadtrackbarvalue
FileStoragefs1("config.xml",FileStorage::READ);
tb1_value=fs1["tb1_value"];//method1
fs1["tb1_value"]>>tb1_value;//method2
fs1.release();
//createtrackbar
namedWindow("main_win");
createTrackbar("brightness","main_win",&tb1_value,
255,tb1_Callback);
tb1_Callback(tb1_value,NULL);
waitKey();
//savetrackbarvalueuponexiting
FileStoragefs2("config.xml",FileStorage::WRITE);
fs2<<"tb1_value"<<tb1_value;
fs2.release();
return0;
}
TipWhenOpenCVhasbeencompiledwithQtsupport,windowpropertiescanbesaved,includingtrackbarvalues,withthesaveWindowParameters()function.
Oncethetrackbarisusedtocontrolanintegervalue,itissimplyaddedtotheoriginalimage,makingitbrighter.Thisvalueisreadwhentheprogramstarts(thevaluewillbe0thefirsttime)andsavedwhentheprogramexitsnormally.Notethattwoequivalentmethodsareshowntoreadthevalueofthetb1_valuevariable.Thecontentsoftheconfig.xmlfileare:
<?xmlversion="1.0"?>
<opencv_storage>
<tb1_value>112</tb1_value>
</opencv_storage>
![Page 110: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/110.jpg)
![Page 111: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/111.jpg)
HistogramsOncetheimagehasbeendefinedwithadatatypeandweareabletoaccessitsgraylevelvalues,thatis,thepixels,wemaywanttoobtainaprobabilitydensityfunctionofthedifferentgraylevels,whichiscalledthehistogram.Theimagehistogramrepresentsthefrequencyofoccurrenceofthevariousgraylevelsintheimage.Thehistogramcanbemodeledsothattheimagemaychangeitscontrastlevels.Thisisknownashistogramequalization.Histogrammodelingisapowerfultechniqueforimageenhancementbymeansofcontrastvariation.Theequalizationallowsforimageareasoflowercontrasttogainahighercontrast.Thefollowingimageshowsyouanexampleofanequalizedimageanditshistogram:
Anexampleofanequalizedimagehistogram
InOpenCV,theimagehistogramcanbecalculatedwiththevoidcalcHistfunctionandhistogramequalizationisperformedwiththevoidequalizeHistfunction.
Theimagehistogramcalculationisdefinedwithtenparameters:voidcalcHist(constMat*images,intnimages,constint*channels,InputArraymask,OutputArrayhist,intdims,constint*histSize,constfloat**ranges,booluniform=true,andboolaccumulate=false).
constMat*images:Thefirstparameteristheaddressofthefirstimagefromacollection.Thiscanbeusedtoprocessabatchofimages.intnimages:Thesecondparameteristhenumberofsourceimages.constint*channels:Thethirdinputparameteristhelistofthechannelsusedtocomputethehistogram.Thenumberofchannelsgoesfrom0to2.InputArraymask:Thisisanoptionalmasktoindicatetheimagepixelscountedinthehistogram.OutputArrayhist:Thefifthparameteristheoutputhistogram.intdims:Thisparameterallowsyoutoindicatethedimensionofthehistogram.constint*histSize:Thisparameteristhearrayofhistogramsizesineachdimension.constfloat**ranges:Thisparameteristhearrayofthedimsarraysofthehistogrambinboundariesineachdimension.booluniform=true:Bydefault,theBooleanvalueistrue.Itindicatesthatthehistogramisuniform.boolaccumulate=false:Bydefault,theBooleanvalueisfalse.Itindicatesthatthe
![Page 112: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/112.jpg)
histogramisnonaccumulative.
Thehistogramequalizationrequiresonlytwoparameters,voidequalizeHist(InputArraysrc,OutputArraydst).Thefirstparameteristheinputimageandthesecondoneistheoutputimagewiththehistogramequalized.
Itispossibletocalculatethehistogramofmorethanoneinputimage.Thisallowsyoutocompareimagehistogramsandcalculatethejointhistogramofseveralimages.Thecomparisonoftwoimagehistograms,histImage1andhistImage2,canbeperformedwiththevoidcompareHist(InputArrayhistImage1,InputArrayhistImage2,method)function.TheMethodmetricistheusedtocomputethematchingbetweenbothhistograms.TherearefourmetricsimplementedinOpenCV,thatis,correlation(CV_COMP_CORREL),chi-square(CV_COMP_CHISQR),intersectionorminimumdistance(CV_COMP_INTERSECT),andBhattacharyyadistance(CV_COMP_BHATTACHARYYA).
Itispossibletocalculatethehistogramofmorethanonechannelofthesamecolorimage.Thisispossiblethankstothethirdparameter.
Thefollowingsectionsshowyoutwoexamplecodesforcolorhistogramcalculation(ColourImageEqualizeHist)andcomparisonColourImageComparison.InColourImageEqualizeHist,itisalsoshownhowtocalculatethehistogramequalizationaswellasthe2Dhistogramfortwochannels,thatis,hue(H)andsaturation(S),intheColourImageComparisonexample.
![Page 113: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/113.jpg)
TheexamplecodeThefollowingColourImageEqualizeHistexampleshowsyouhowtoequalizeacolorimageanddisplaythehistogramofeachchannelatthesametime.ThehistogramcalculationofeachcolorchannelintheRGBimageisdonewiththehistogramcalculation(InputArrayImagesrc,OutputArrayhistoImage)function.Tothisend,thecolorimageissplitintothechannels:R,G,andB.Thehistogramequalizationisalsoappliedtoeachchannelthatisthenmergedtoformtheequalizedcolorimage:
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include<iostream>
#include<stdio.h>
usingnamespacecv;
usingnamespacestd;
voidhistogramcalculation(constMat&Image,Mat&histoImage)
{
inthistSize=255;
//Settheranges(forB,G,R))
floatrange[]={0,256};
constfloat*histRange={range};
booluniform=true;boolaccumulate=false;
Matb_hist,g_hist,r_hist;
vector<Mat>bgr_planes;
split(Image,bgr_planes);
//Computethehistograms:
calcHist(&bgr_planes[0],1,0,Mat(),b_hist,1,&histSize,&histRange,
uniform,accumulate);
calcHist(&bgr_planes[1],1,0,Mat(),g_hist,1,&histSize,&histRange,
uniform,accumulate);
calcHist(&bgr_planes[2],1,0,Mat(),r_hist,1,&histSize,&histRange,
uniform,accumulate);
//DrawthehistogramsforB,GandR
inthist_w=512;inthist_h=400;
intbin_w=cvRound((double)hist_w/histSize);
MathistImage(hist_h,hist_w,CV_8UC3,Scalar(0,0,0));
//Normalizetheresultto[0,histImage.rows]
normalize(b_hist,b_hist,0,histImage.rows,NORM_MINMAX,-1,Mat());
normalize(g_hist,g_hist,0,histImage.rows,NORM_MINMAX,-1,Mat());
normalize(r_hist,r_hist,0,histImage.rows,NORM_MINMAX,-1,Mat());
//Drawforeachchannel
for(inti=1;i<histSize;i++){
![Page 114: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/114.jpg)
line(histImage,Point(bin_w*(i-1),hist_h-cvRound(b_hist.at<float>(i-
1))),Point(bin_w*(i),hist_h-cvRound(b_hist.at<float>(i))),Scalar(
255,0,0),2,8,0);
line(histImage,Point(bin_w*(i-1),hist_h-cvRound(g_hist.at<float>(i-
1))),Point(bin_w*(i),hist_h-cvRound(g_hist.at<float>(i))),Scalar(
0,255,0),2,8,0);
line(histImage,Point(bin_w*(i-1),hist_h-cvRound(r_hist.at<float>(i-
1))),Point(bin_w*(i),hist_h-cvRound(r_hist.at<float>(i))),Scalar(
0,0,255),2,8,0);
}
histoImage=histImage;
}
intmain(int,char*argv[])
{
Matsrc,imageq;
MathistImage;
//Readoriginalimage
src=imread("fruits.jpg");
if(!src.data)
{printf("Errorimagen\n");exit(1);}
//Separatetheimagein3places(B,GandR)
vector<Mat>bgr_planes;
split(src,bgr_planes);
//Displayresults
imshow("Sourceimage",src);
//Calculatethehistogramtoeachchannelofthesourceimage
histogramcalculation(src,histImage);
//Displaythehistogramforeachcolourchannel
imshow("ColourImageHistogram",histImage);
//EqualizedImage
//ApplyHistogramEqualizationtoeachchannel
equalizeHist(bgr_planes[0],bgr_planes[0]);
equalizeHist(bgr_planes[1],bgr_planes[1]);
equalizeHist(bgr_planes[2],bgr_planes[2]);
//Mergetheequalizedimagechannelsintotheequalizedimage
merge(bgr_planes,imageq);
//DisplayEqualizedImage
imshow("EqualizedImage",imageq);
//Calculatethehistogramtoeachchanneloftheequalizedimage
histogramcalculation(imageq,histImage);
//DisplaytheHistogramoftheEqualizedImage
imshow("EqualizedColourImageHistogram",histImage);
![Page 115: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/115.jpg)
//Waituntiluserexitstheprogram
waitKey();
return0;
}
Theexamplecreatesfourwindowswith:
Thesourceimage:Thisisshowninthefollowingfigureintheupper-leftcorner.Theequalizedcolorimage:Thisisshowninthefollowingfigureintheupper-rightcorner.Thehistogramofthreechannels:Here,R=Read,G=GreenandB=Blue,forthesourceimage.Thisisshowninthefollowingfigureinthelower-leftcorner.ThehistogramofRGBchannelfortheequalizedimage:Thisisshowninnextfigureinthelower-rightcorner.ThefigureshowsyouhowthemostfrequentintensityvaluesforR,G,andBhavebeenstretchedoutduetotheequalizationprocess.
Thefollowingfigureshowsyoutheresultsofthealgorithm:
![Page 116: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/116.jpg)
TheexamplecodeThefollowingColourImageComparisonexampleshowsyouhowtocalculatea2Dhistogramcomposedoftwochannelsfromthesamecolorimage.Theexamplecodealsoperformsacomparisonbetweentheoriginalimageandtheequalizedimagebymeansofhistogrammatching.Themetricsusedforthematchingarethefourmetricsthathavebeenmentionedpreviously,thatis,Correlation,Chi-Square,Minimumdistance,andBhattacharyyadistance.The2DhistogramcalculationoftheHandScolorchannelisdonewiththehistogram2Dcalculation(InputArrayImagesrc,OutputArrayhisto2D)function.Toperformthehistogramcomparison,thenormalized1DhistogramhasbeencalculatedfortheRGBimage.Inordertocomparethehistogram,theyhavebeennormalized.ThisisdoneinhistogramRGcalculation(InputArrayImagesrc,OutputArrayhisto):
voidhistogram2Dcalculation(constMat&src,Mat&histo2D)
{
Mathsv;
cvtColor(src,hsv,CV_BGR2HSV);
//Quantizethehueto30-255levels
//andthesaturationto32-255levels
inthbins=255,sbins=255;
inthistSize[]={hbins,sbins};
//huevariesfrom0to179,seecvtColor
floathranges[]={0,180};
//saturationvariesfrom0(black-gray-white)to
//255(purespectrumcolor)
floatsranges[]={0,256};
constfloat*ranges[]={hranges,sranges};
MatNDhist,hist2;
//wecomputethehistogramfromthe0-thand1-stchannels
intchannels[]={0,1};
calcHist(&hsv,1,channels,Mat(),hist,1,histSize,ranges,true,
false);
doublemaxVal=0;
minMaxLoc(hist,0,&maxVal,0,0);
intscale=1;
MathistImg=Mat::zeros(sbins*scale,hbins*scale,CV_8UC3);
for(inth=0;h<hbins;h++)
for(ints=0;s<sbins;s++)
{
floatbinVal=hist.at<float>(h,s);
intintensity=cvRound(binVal*255/maxVal);
rectangle(histImg,Point(h*scale,s*scale),
Point((h+1)*scale-1,(s+1)*scale-1),
Scalar::all(intensity),
CV_FILLED);
}
histo2D=histImg;
![Page 117: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/117.jpg)
}
voidhistogramRGcalculation(constMat&src,Mat&histoRG)
{
//Using50binsforredand60forgreen
intr_bins=50;intg_bins=60;
inthistSize[]={r_bins,g_bins};
//redvariesfrom0to255,greenfrom0to255
floatr_ranges[]={0,255};
floatg_ranges[]={0,255};
constfloat*ranges[]={r_ranges,g_ranges};
//Usetheo-thand1-stchannels
intchannels[]={0,1};
//Histograms
MatNDhist_base;
//CalculatethehistogramsfortheHSVimages
calcHist(&src,1,channels,Mat(),hist_base,2,histSize,ranges,
true,false);
normalize(hist_base,hist_base,0,1,NORM_MINMAX,-1,Mat());
histoRG=hist_base;
}
intmain(intargc,char*argv[])
{
Matsrc,imageq;
MathistImg,histImgeq;
MathistHSorg,histHSeq;
//Readoriginalimage
src=imread("fruits.jpg");
if(!src.data)
{printf("Errorimagen\n");exit(1);}
//Separatetheimagein3places(B,GandR)
vector<Mat>bgr_planes;
split(src,bgr_planes);
//Displayresults
namedWindow("Sourceimage",0);
imshow("Sourceimage",src);
//Calculatethehistogramofthesourceimage
histogram2Dcalculation(src,histImg);
//Displaythehistogramforeachcolourchannel
imshow("H-SHistogram",histImg);
//EqualizedImage
![Page 118: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/118.jpg)
//ApplyHistogramEqualizationtoeachchannel
equalizeHist(bgr_planes[0],bgr_planes[0]);
equalizeHist(bgr_planes[1],bgr_planes[1]);
equalizeHist(bgr_planes[2],bgr_planes[2]);
//Mergetheequalizedimagechannelsintotheequalizedimage
merge(bgr_planes,imageq);
//DisplayEqualizedImage
namedWindow("EqualizedImage",0);
imshow("EqualizedImage",imageq);
//Calculatethe2DhistogramforHandSchannels
histogram2Dcalculation(imageq,histImgeq);
//Displaythe2DHistogram
imshow("H-SHistogramEqualized",histImgeq);
histogramRGcalculation(src,histHSorg);
histogramRGcalculation(imageq,histHSeq);
///Applythehistogramcomparisonmethods
for(inti=0;i<4;i++)
{
intcompare_method=i;
doubleorig_orig=compareHist(histHSorg,histHSorg,compare_method
);
doubleorig_equ=compareHist(histHSorg,histHSeq,compare_method);
printf("Method[%d]Original-Original,Original-Equalized:%f,%f
\n",i,orig_orig,orig_equ);
}
printf("Done\n");
waitKey();
}
Theexamplecreatesfourwindowswiththesourceimage,theequalizedcolorimageandthe2DhistogramforHandSchannelsforbothimagestheoriginal,andtheequalizedimage.ThealgorithmalsodisplaysthefournumericalmatchingparametersobtainedfromthecomparisonoftheoriginalRGBimagehistogramwithitselfandwiththeequalizedRGBimage.Forthecorrelationandintersectionmethods,thehigherthemetric,themoreaccuratethematch.Forthechi-squareandBhattacharyyadistance,thelesstheresult,thebetterthematch.ThefollowingfigureshowsyoutheoutputoftheColourImageComparisonalgorithm:
![Page 119: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/119.jpg)
Finally,youcanrefertoChapter3,CorrectingandEnhancingImages,aswellastheexampleswithintocoveressentialaspectsofthisbroadtopic,suchasimageenhancementbymeansofhistogrammodeling.
NoteFormoreinformation,refertoOpenCVEssentials,DenizO.,FernándezM.M.,VállezN.,BuenoG.,SerranoI.,Patón.A.,SalidoJ.byPacktPublishing,https://www.packtpub.com/application-development/opencv-essentials.
![Page 120: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/120.jpg)
![Page 121: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/121.jpg)
SummaryThischaptercoveredandestablishedthebasisofapplyingimageprocessingmethodsusedincomputervision.Imageprocessingisoftenthefirststeptofurthercomputervisionapplications,andtherefore,ithasbeencoveredhere:basicdatatypes,pixellevelaccess,commonoperationswithimages,arithmeticoperations,datapersistence,andhistograms.
YoucanalsorefertoChapter3,CorrectingandEnhancingImages,ofOpenCVEssentialsbyPacktPublishingtocoverfurtheressentialaspectsofthisbroadtopic,suchasimageenhancement,imagerestorationbymeansoffiltering,andgeometricalcorrection.
Thenextchapterwillcoverfurtheraspectsofimageprocessingtocorrectandenhanceimagesbymeansofsmoothing,sharpening,imageresolutionanalysis,morphologicalandgeometricaltransforms,inpainting,anddenoising.
![Page 122: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/122.jpg)
![Page 123: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/123.jpg)
Chapter3.CorrectingandEnhancingImagesThischapterpresentsmethodsforimageenhancementandcorrection.Sometimes,itisnecessarytoreducethenoiseinanimageoremphasizeorsuppresscertaindetailsinit.Theseproceduresareusuallycarriedoutbymodifyingpixelvalues,performingsomeoperationsonthem,orontheirlocalneighborhoodaswell.Bydefinition,image-enhancementoperationsareusedtoimproveimportantimagedetails.Enhancementoperationsincludenoisereduction,smoothing,andedgeenhancement.Ontheotherhand,imagecorrectionattemptstorestoreadamagedimage.InOpenCV,theimgprocmodulecontainsfunctionsforimageprocessing.
Inthischapter,wewillcover:
Imagefiltering.Thisincludesimagesmoothing,imagesharpening,andworkingwithimagepyramids.Applyingmorphologicaloperations,suchasdilation,erosion,opening,orclosing.Geometricaltransformations(affineandperspectivetransformations).Inpainting,whichisusedtoreconstructdamagedpartsofimages.Denoising,whichisnecessarytoreducetheimagenoiseproducedbytheimage-capturedevice.
![Page 124: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/124.jpg)
ImagefilteringImagefilteringisaprocesstomodifyorenhanceimages.Emphasizingcertainfeaturesorremovingothersinanimageareexamplesofimagefiltering.Filteringisaneighborhoodoperation.Theneighborhoodisasetofpixelsaroundaselectedone.Imagefilteringdeterminestheoutputvalueofacertainpixellocatedataposition(x,y)byperformingsomeoperationswiththevaluesofthepixelsinitsneighborhood.
OpenCVprovidesseveralfilteringfunctionsforcommonimage-processingoperations,suchassmoothingorsharpening.
![Page 125: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/125.jpg)
SmoothingSmoothing,alsocalledblurring,isanimage-processingoperationthatisfrequentlyusedtoreducenoise,amongotherpurposes.Asmoothingoperationisperformedbyapplyinglinearfilterstotheimage.Then,thepixelvaluesoftheoutputatpositions(xi,yj)arecomputedasaweightedsumoftheinputpixelvaluesatpositions(xi,yj)andtheirneighborhoods.Theweightsforthepixelsinthelinearoperationareusuallystoredinamatrixcalledkernel.Therefore,afiltercouldberepresentedasaslidingwindowofcoefficients.
Therepresentationofthepixelneighborhood
LetKbethekernelandIandOtheinputandoutputimages,respectively.Then,eachoutputpixelvalueat(i,j)iscalculatedasfollows:
Median,Gaussian,andbilateralarethemostusedOpenCVsmoothingfilters.Medianfilteringisverygoodtogetridofsalt-and-pepperorspecklenoise,whileGaussianisamuchbetterpreprocessingstepforedgedetection.Ontheotherhand,bilateralfilteringisagoodtechniquetosmoothanimagewhilerespectingstrongedges.
ThefunctionsincludedinOpenCVforthispurposeare:
voidboxFilter(InputArraysrc,OutputArraydst,intddepth,Sizeksize,
Pointanchor=Point(-1,-1),boolnormalize=true,intborderType=
BORDER_DEFAULT):Thisisaboxfilterwhosekernelcoefficientsareequal.Withnormalize=true,eachoutputpixelvalueisthemeanofitskernelneighborswithallcoefficientsequalto1/n,wheren=thenumberofelements.Withnormalize=false,allcoefficientsareequalto1.Thesrcargumentistheinputimage,whilethefilteredimageisstoredindst.Theddepthparameterindicatestheoutputimagedepththatis-1tousethesamedepthastheinputimage.Thekernelsizeisindicatedinksize.Theanchorpointindicatesthepositionoftheso-calledanchorpixel.The(-1,-1)defaultvaluemeansthattheanchorisatthecenterofthekernel.Finally,theborder-typetreatmentisindicatedintheborderTypeparameter.voidGaussianBlur(InputArraysrc,OutputArraydst,Sizeksize,double
sigmaX,doublesigmaY=0,intborderType=BORDER_DEFAULT):ThisisdonebyconvolvingeachpointinthesrcinputarraywithaGaussiankerneltoproducethe
![Page 126: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/126.jpg)
dstoutput.ThesigmaXandsigmaYparametersindicatetheGaussiankernelstandarddeviationinXandYdirections.IfsigmaYiszero,itissettobeequaltosigmaX,andifbothareequaltozero,theyarecomputedusingthewidthandheightgiveninksize.
NoteConvolutionisdefinedastheintegraloftheproductoftwofunctionsinwhichoneofthemispreviouslyreversedandshifted.
voidmedianBlur(InputArraysrc,OutputArraydst,intksize):Thisrunsthrougheachelementoftheimageandreplaceseachpixelwiththemedianofitsneighboringpixels.voidbilateralFilter(InputArraysrc,OutputArraydst,intd,double
sigmaColor,doublesigmaSpace,intborderType=BORDER_DEFAULT):ThisisanalogoustotheGaussianfilterconsideringtheneighboringpixelswithweightsassignedtoeachofthembuthavingtwocomponentsoneachweight,whichisthesameusedbytheGaussianfilter,andanotheronethattakesintoaccountthedifferenceinintensitybetweentheneighboringandevaluatedpixels.Thisfunctionneedsthediameterofthepixelneighborhoodasparameterd,andsigmaColorsigmaSpacevalues.AlargervalueofthesigmaColorparametermeansthatfarthercolorswithinthepixelneighborhoodwillbemixedtogether,generatinglargerareasofsemi-equalcolors,whereasalargervalueofthesigmaSpaceparametermeansthatfartherpixelswillinfluenceeachotheraslongastheircolorsarecloseenough.voidblur(InputArraysrc,OutputArraydst,Sizeksize,Point
anchor=Point(-1,-1),intborderType=BORDER_DEFAULT):Thisblursanimageusingthenormalizedboxfilter.ItisequivalenttousingboxFilterwithnormalize=true.Thekernelusedinthisfunctionis:
NoteThegetGaussianKernelandgetGaborKernelfunctionscanbeusedinOpenCVtogeneratecustomkernels,whichcanthenbepassedontofilter2D.
Inallcases,itisnecessarytoextrapolatethevaluesofthenon-existentpixelsoutsidetheimageboundary.OpenCVenablesthespecificationoftheextrapolationmethodinmostofthefilterfunctions.Thesemethodsare:
BORDER_REPLICATE:Thisrepeatsthelastknownpixelvalue:aaaaaa|abcdefgh|hhhhhhhBORDER_REFLECT:Thisreflectstheimageborder:fedcba|abcdefgh|hgfedcb
![Page 127: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/127.jpg)
BORDER_REFLECT_101:Thisreflectstheimageborderwithoutduplicatingthelastpixeloftheborder:gfedcb|abcdefgh|gfedcbaBORDER_WRAP:Thisappendsthevalueoftheoppositeborder:cdefgh|abcdefgh|abcdefgBORDER_CONSTANT:Thisestablishesaconstantoverthenewborder:kkkkkk|abcdefgh|kkkkkk
TheexamplecodeThefollowingSmoothexampleshowsyouhowtoloadanimageandapplyGaussianandmedianblurringtoitthroughGaussianBlurandmedianBlurfunctions:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Applythefilters
Matdst,dst2;
GaussianBlur(src,dst,Size(9,9),0,0);
medianBlur(src,dst2,9);
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("GAUSSIANBLUR",WINDOW_AUTOSIZE);
imshow("GAUSSIANBLUR",dst);
namedWindow("MEDIANBLUR",WINDOW_AUTOSIZE);
imshow("MEDIANBLUR",dst2);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 128: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/128.jpg)
OriginalandblurredimagesfromGaussianandMedianblurringtransformations
![Page 129: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/129.jpg)
SharpeningSharpeningfiltersareusedtohighlightbordersandotherfinedetailswithinimages.Theyarebasedonfirst-andsecond-orderderivatives.Thefirstderivativeofanimagecomputesanapproximationoftheimageintensitygradient,whereasthesecondderivativeisdefinedasthedivergenceofthisgradient.Sincedigitalimageprocessingdealswithdiscretequantities(pixelvalues),thediscreteversionsofthefirstandsecondderivativesareusedforsharpening.
First-orderderivativesproducethickerimageedgesandarewidelyusedforedge-extractionpurposes.However,second-orderderivativesareusedforimageenhancementduetotheirbetterresponsetofinedetails.TwopopularoperatorsusedtoobtainderivativesaretheSobelandtheLaplacian.
TheSobeloperatorcomputesthefirstimagederivativeofanimage,I,through:
TheSobelgradientmagnitudecanbeobtainedbycombiningthegradientapproximationsinthetwodirections,asfollows:
Ontheotherhand,thediscreteLaplacianofanimagecanbegivenasaconvolutionwiththefollowingkernel:
ThefunctionsincludedinOpenCVforthispurposeare:
![Page 130: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/130.jpg)
voidSobel(InputArraysrc,OutputArraydst,intddepth,intdx,intdy,
intksize=3,doublescale=1,doubledelta=0,intborderType=
BORDER_DEFAULT):Thiscalculatesthefirst,second,third,ormixed-imagederivativeswiththeSobeloperatorfromanimageinsrc.Theddepthparameterindicatestheoutputimagedepth,thatis,-1tousethesamedepthastheinputimage.Thekernelsizeisindicatedinksizeandthedesiredderivativeordersindxanddy.Ascalefactorforthecomputedderivativevalescanbeestablishedwithscale.Finally,theborder-typetreatmentisindicatedintheborderTypeparameterandadeltavaluecanbeaddedtotheresultsbeforestoringthemindst.voidScharr(InputArraysrc,OutputArraydst,intddepth,intdx,int
dy,doublescale=1,doubledelta=0,intborderType=BORDER_DEFAULT
):Thiscalculatesamoreaccuratederivativeforakernelofsize3x3.Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType)isequivalenttoSobel(src,dst,ddepth,dx,dy,CV_SCHARR,scale,delta,borderType).voidLaplacian(InputArraysrc,OutputArraydst,intddepth,intksize=
1,doublescale=1,doubledelta=0,intborderType=BORDER_DEFAULT):ThiscalculatestheLaplacianofanimage.AlltheparametersareequivalenttotheonesfromtheSobelandScharrfunctionsexceptforksize.Whenksize>1,itcalculatestheLaplacianoftheimageinsrcbyaddingupthesecondxandyderivativescalculatedusingSobel.Whenksize=1,theLaplacianiscalculatedbyfilteringtheimagewitha3x3kernelthatcontains-4forthecenter,0forthecorners,and1fortherestofthecoefficients.
NotegetDerivKernelscanbeusedinOpenCVtogeneratecustomderivativekernels,whichcanthenbepassedontosepFilter2D.
TheexamplecodeThefollowingSharpenexampleshowsyouhowtocomputeSobelandLaplacianderivativesfromanimagethroughSobelandLaplacianfunctions.Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//ApplySobelandLaplacian
Matdst,dst2;
Sobel(src,dst,-1,1,1);
Laplacian(src,dst2,-1);
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
![Page 131: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/131.jpg)
imshow("ORIGINAL",src);
namedWindow("SOBEL",WINDOW_AUTOSIZE);
imshow("SOBEL",dst);
namedWindow("LAPLACIAN",WINDOW_AUTOSIZE);
imshow("LAPLACIAN",dst2);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
ContoursobtainedbySobelandLaplacianderivatives
![Page 132: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/132.jpg)
WorkingwithimagepyramidsOnsomeoccasions,workingwithafixedimagesizeisnotpossible,andwewillneedtheoriginalimageatdifferentresolutions.Forexample,inobject-detectionproblems,examiningthewholeimagetryingtofindtheobjecttakestoomuchtime.Inthiscase,searchingforobjectsbystartingatsmallerresolutionsismoreefficient.Thistypeofimagesetiscalledpyramidormipmapduetothesimilaritywiththepyramidstructuretypeifimagesareorganizedfromthelargesttothesmallestfromthebottomtothetop.
TheGaussianpyramid
Therearetwokindsofimagepyramids:GaussianpyramidsandLaplacianpyramids.
GaussianpyramidsGaussianpyramidsarecreatedbyalternatelyremovingrowsandcolumnsinthelowerlevelandthenobtainingthevalueofthehigher-levelpixelbyapplyingaGaussianfilterusingtheneighborhoodfromtheunderlyinglevel.Aftereachpyramidstep,theimagereducesitswidthandheightbyhalfanditsareaisaquarterofthepreviouslevelimagearea.InOpenCV,GaussianpyramidscanbecomputedusingthepyrDown,pyrUp,andbuildPyramidfunctions:
voidpyrDown(InputArraysrc,OutputArraydst,constSize&dstsize=
Size(),intborderType=BORDER_DEFAULT):Thissubsamplesandblursansrcimage,savingtheresultindst.ThesizeoftheoutputimageiscomputedasSize((src.cols+1)/2,(src.rows+1)/2)whenitisnotsetwiththedstsizeparameter.voidpyrUp(InputArraysrc,OutputArraydst,constSize&dstsize=
Size(),intborderType=BORDER_DEFAULT):ThiscomputestheoppositeprocessofpyrDown.voidbuildPyramid(InputArraysrc,OutputArrayOfArraysdst,int
maxlevel,intborderType=BORDER_DEFAULT):ThisbuildsaGaussianpyramidforanimagestoredinsrc,obtainingmaxlevelnewimagesandstoringtheminthedstarrayfollowingtheoriginalimagethatisstoredindst[0].Thus,dststoresmaxlevel+1imagesasaresult.
![Page 133: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/133.jpg)
Pyramidsarealsousedforsegmentation.OpenCVprovidesafunctiontocomputemean-shiftpyramidsbasedonthefirststepofthemean-shiftsegmentationalgorithm:
voidpyrMeanShiftFiltering(InputArraysrc,OutputArraydst,doublesp,
doublesr,intmaxLevel=1,TermCriteriatermcrit=TermCriteria
(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1)):Thisimplementsthefilteringstageofthemean-shiftsegmentation,obtaininganimage,dst,withcolorgradientsandfine-graintextureflattened.Thespandsrparametersindicatethespatialwindowandthecolorwindowradii.
NoteMoreinformationaboutthemean-shiftsegmentationcanbefoundathttp://docs.opencv.org/trunk/doc/py_tutorials/py_video/py_meanshift/py_meanshift.html?highlight=meanshift.
LaplacianpyramidsLaplacianpyramidsdonothaveaspecificfunctionimplementationinOpenCV,buttheyareformedfromtheGaussianpyramids.Laplacianpyramidscanbeseenasborderimageswheremostofitselementsarezeros.TheithlevelintheLaplacianpyramidisthedifferencebetweentheithlevelintheGaussianpyramidandtheexpandedversionoftheith+1levelintheGaussianpyramid.
TheexamplecodeThefollowingPyramidsexampleshowsyouhowtoobtaintwolevelsfromaGaussianpyramidthroughthepyrDownfunctionandtheoppositeoperationthroughpyrUp.NoticethattheoriginalimagecannotbeobtainedafterusingpyrUp:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//ApplytwotimespyrDown
Matdst,dst2;
pyrDown(src,dst);
pyrDown(dst,dst2);
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("1stPYRDOWN",WINDOW_AUTOSIZE);
imshow("1stPYRDOWN",dst);
namedWindow("2stPYRDOWN",WINDOW_AUTOSIZE);
imshow("2stPYRDOWN",dst2);
![Page 134: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/134.jpg)
//ApplytwotimespyrUp
pyrUp(dst2,dst);
pyrUp(dst,src);
//Showtheresults
namedWindow("NEWORIGINAL",WINDOW_AUTOSIZE);
imshow("NEWORIGINAL",dst2);
namedWindow("1stPYRUP",WINDOW_AUTOSIZE);
imshow("1stPYRUP",dst);
namedWindow("2stPYRUP",WINDOW_AUTOSIZE);
imshow("2stPYRUP",src);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 135: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/135.jpg)
TheoriginalandtwolevelsoftheGaussianpyramid
![Page 136: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/136.jpg)
![Page 137: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/137.jpg)
MorphologicaloperationsMorphologicaloperationsprocessimagesaccordingtoshapes.Theyapplyadefined“structuringelement”toanimage,obtaininganewimagewherethepixelsatpositions(xi,yj)arecomputedbycomparingtheinputpixelvaluesatpositions(xi,yj)andtheirneighborhoods.Dependingonthestructuringelementselected,amorphologicaloperationismoresensitivetoonespecificshapeortheother.
Thetwobasicmorphologicaloperationsaredilationanderosion.Dilationaddspixelsfromthebackgroundtotheboundariesoftheobjectsinanimage,whileerosionremovespixels.Hereiswherethestructuringelementistakenintoaccounttoselectthepixelsthataretobeaddedordeleted.Indilation,thevalueoftheoutputpixelisthemaximumofallthepixelsintheneighborhood.Usingerosion,thevalueoftheoutputpixelistheminimumvalueofallthepixelsintheneighborhood.
Anexampleofdilationanderosion
Otherimage-processingoperationscanbedefinedbycombiningdilationanderosion,suchastheopeningandclosingoperations,andthemorphologicalgradient.Theopeningoperationisdefinedaserosion,followedbydilation,whileclosingisitsreverseoperation—dilationfollowedbyerosion.Therefore,openingremovessmallobjectsfromanimagewhilepreservingthelargeronesandclosingisusedtoremovesmallholeswhilepreservingthelargeronesinamannersimilartoopening.Themorphologicalgradientisdefinedasthedifferencebetweenthedilationandtheerosionofanimage.Furthermore,twomoreoperationsaredefinedusingopeningandclosing:top-hatandblack-hatoperations.Theyaredefinedasthedifferencebetweenthesourceimageanditsopeninginthecaseoftophatandthedifferencebetweentheclosingofanimageandthesourceimageinthecaseofblackhat.Alltheoperationsareappliedwiththesamestructuringelement.
InOpenCV,itispossibletoapplydilation,erosion,opening,andclosingthroughthefollowingfunctions:
voiddilate(InputArraysrc,OutputArraydst,InputArraykernel,Point
anchor=Point(-1,-1),intiterations=1,intborderType=
BORDER_CONSTANT,constScalar&borderValue=
morphologyDefaultBorderValue()):Thisdilatesanimagestoredinsrcusinga
![Page 138: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/138.jpg)
specificstructuringelement,savingtheresultindst.Thekernelparameteristhestructuringelementused.Theanchorpointindicatesthepositionofanchorpixel.The(-1,-1)valuemeansthattheanchorisatthecenter.Theoperationcanbeappliedseveraltimesusingiterations.Theborder-typetreatmentisindicatedintheborderTypeparameterandisthesameasinotherfiltersfromprevioussections.Finally,aconstantisindicatedinborderValueiftheBORDER_CONSTANTbordertypeisused.voiderode(InputArraysrc,OutputArraydst,InputArraykernel,Point
anchor=Point(-1,-1),intiterations=1,intborderType=
BORDER_CONSTANT,constScalar&borderValue=
morphologyDefaultBorderValue()):Thiserodesanimageusingaspecificstructuringelement.Itsparametersarethesameasthatindilate.voidmorphologyEx(InputArraysrc,OutputArraydst,intop,InputArray
kernel,Pointanchor=Point(-1,-1),intiterations=1,intborderType
=BORDER_CONSTANT,constScalar&borderValue=
morphologyDefaultBorderValue()):Thisperformsadvancedmorphologicaloperationsdefinedusingtheopparameter.PossibleopvaluesareMORPH_OPEN,MORPH_CLOSE,MORPH_GRADIENT,MORPH_TOPHAT,andMORPH_BLACKHAT.MatgetStructuringElement(intshape,Sizeksize,Pointanchor=
Point(-1,-1)):Thisreturnsastructuringelementofthespecifiedsizeandshapeformorphologicaloperations.SupportedtypesareMORPH_RECT,MORPH_ELLIPSE,andMORPH_CROSS.
![Page 139: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/139.jpg)
TheexamplecodeThefollowingMorphologicalexampleshowsyouhowtosegmentredcheckersinacheckerboard,applyingabinarythreshold(theinRangefunction)andthenrefiningtheresultswithdilationanderosionoperations(throughdilateanderodefunctions).Thestructureusedisacircleof15x15pixels.Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
usingnamespacestd;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Applythefilters
Matdst,dst2,dst3;
inRange(src,Scalar(0,0,100),Scalar(40,30,255),dst);
Matelement=getStructuringElement(MORPH_ELLIPSE,Size(15,15));
dilate(dst,dst2,element);
erode(dst2,dst3,element);
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("SEGMENTED",WINDOW_AUTOSIZE);
imshow("SEGMENTED",dst);
namedWindow("DILATION",WINDOW_AUTOSIZE);
imshow("DILATION",dst2);
namedWindow("EROSION",WINDOW_AUTOSIZE);
imshow("EROSION",dst3);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 140: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/140.jpg)
Original,redcolorsegmentation,dilation,anderosion
![Page 141: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/141.jpg)
![Page 142: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/142.jpg)
LUTsLook-uptables(LUTs)areverycommonincustomfiltersinwhichtwopixelswiththesamevalueintheinputinvolvesthesamevalueintheoutputtoo.AnLUTtransformationassignsanewpixelvaluetoeachpixelintheinputimageaccordingtothevaluesgivenbyatable.Inthistable,theindexrepresentstheinputintensityvalueandthecontentofthecellgivenbytheindexrepresentsthecorrespondingoutputvalue.Asthetransformationisactuallycomputedforeachpossibleintensityvalue,thisresultsinareductioninthetimeneededtoapplythetransformationoveranimage(imagestypicallyhavemorepixelsthanthenumberofintensityvalues).
TheLUT(InputArraysrc,InputArraylut,OutputArraydst,intinterpolation=0)OpenCVfunctionappliesalook-uptabletransformationoveran8-bitsignedoransrcunsignedimage.Thus,thetablegiveninthelutparametercontains256elements.Thenumberofchannelsinlutiseither1orsrc.channels.Ifsrchasmorethanonechannelbutluthasasingleone,thesamelutchannelisappliedtoalltheimagechannels.
![Page 143: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/143.jpg)
TheexamplecodeThefollowingLUTexampleshowsyouhowtodivide(bytwo)theintensityofthepixelsfromanimageusingalook-uptable.TheLUTneedstobeinitializedbeforeusingitwiththiscode:
uchar*M=(uchar*)malloc(256*sizeof(uchar));
for(inti=0;i<256;i++){
M[i]=i*0.5;//Theresultisroundedtoanintegervalue
}
Matlut(1,256,CV_8UC1,M);
AMatobjectiscreatedwhereeachcellcontainsthenewvalue.Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//CreatetheLUT
uchar*M=(uchar*)malloc(256*sizeof(uchar));
for(inti=0;i<256;i++){
M[i]=i*0.5;
}
Matlut(1,256,CV_8UC1,M);
//ApplytheLUT
Matdst;
LUT(src,lut,dst);
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("LUT",WINDOW_AUTOSIZE);
imshow("LUT",dst);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 144: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/144.jpg)
TheoriginalandLUT-transformedimages
![Page 145: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/145.jpg)
![Page 146: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/146.jpg)
GeometricaltransformationsGeometricaltransformationsdonotchangetheimagecontentbutinsteaddeformtheimagebydeformingtheirgrid.Inthiscase,outputimagepixelvaluesarecomputedbyfirstobtainingthecoordinatesoftheappropriateinputpixelsbyapplyingthecorrespondingmappingfunctionsandcopyingtheoriginalpixelvaluesfromtheobtainedpositionstothenewones:
Thistypeofoperationhastwoproblems:
Extrapolation:fx(x,y)andfy(x,y)couldobtainvaluesthatindicateapixeloutsidetheimageboundary.TheextrapolationmethodsusedingeometricaltransformationsarethesameastheonesusedinimagefilteringplusanotheronecalledBORDER_TRANSPARENT.Interpolation:fx(x,y)andfy(x,y)areusuallyfloating-pointnumbers.InOpenCV,itispossibletoselectbetweennearest-neighborandpolynomialinterpolationmethods.Nearest-neighborinterpolationconsistsofroundingthefloating-pointcoordinatetothenearestinteger.Thesupportedinterpolationmethodsare:
INTER_NEAREST:Thisisthenearest-neighborinterpolationexplainedpreviously.INTER_LINEAR:Thisisabilinearinterpolationmethod.Itisusedbydefault.INTER_AREA:Thisresamplesusingpixelarearelation.INTER_CUBIC:Thisisbicubicinterpolationmethodovera4x4pixelneighborhood.INTER_LANCZOS4:ThisistheLanczosinterpolationmethodoveran8x8pixelneighborhood.
ThegeometricaltransformationssupportedinOpenCVincludeaffine(scaling,translation,rotation,andsoon)andperspectivetransformations.
![Page 147: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/147.jpg)
AffinetransformationAnaffinetransformationisageometrictransformationthatpreservesallpointsfromaninitiallineonalineafterapplyingit.Furthermore,distanceratiosfromeachofthesepointstotheendsofthelinesarealsopreserved.Ontheotherhand,affinetransformationsdon’tnecessarilypreserveanglesandlengths.
Geometrictransformationssuchasscaling,translation,rotation,skewing,andreflectionareallaffinetransformations.
ScalingScalinganimageisresizingitbyshrinkingorzooming.ThefunctioninOpenCVforthispurposeisvoidresize(InputArraysrc,OutputArraydst,Sizedsize,doublefx=0,doublefy=0,intinterpolation=INTER_LINEAR).Apartfromsrcanddst,theinputandoutputimages,ithassomeparameterstospecifythesizetowhichtheimageistoberescaled.Ifthenewimagesizeisspecifiedbysettingdsizetoavaluedifferentfrom0,thescaledfactorparameters,fxandfy,areboth0andfxandfyarecalculatedfromdsizeandtheoriginalsizeoftheinputimage.Iffxandfyaredifferentfrom0anddsizeequals0,dsizeiscalculatedfromtheotherparameters.Ascaleoperationcouldberepresentedbyitstransformationmatrix:
Here,sxandsyarethescalefactorsinthexandyaxis.
Theexamplecode
ThefollowingScaleexampleshowsyouhowtoscaleanimagethroughtheresizefunction.Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Applythescale
Matdst;
resize(src,dst,Size(0,0),0.5,0.5);
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
![Page 148: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/148.jpg)
namedWindow("SCALED",WINDOW_AUTOSIZE);
imshow("SCALED",dst);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
Originalandscaledimages;fxandfyareboth0.5
TranslationTranslationissimplymovingtheimagealongaspecificdirectionanddistance.Thus,atranslationcouldberepresentedbymeansofavector,(tx,ty),oritstransformationmatrix:
![Page 149: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/149.jpg)
InOpenCV,itispossibletoapplytranslationsusingthevoidwarpAffine(InputArraysrc,OutputArraydst,InputArrayM,Sizedsize,intflags=INTER_LINEAR,
intborderMode=BORDER_CONSTANT,constScalar&borderValue=Scalar())
function.TheMparameteristhetransformationmatrixthatconvertssrcintodst.Theinterpolationmethodisspecifiedusingtheflagsparameter,whichalsosupportstheWARP_INVERSE_MAPvalue,whichmeansthatMistheinversetransformation.TheborderModeparameteristheextrapolationmethod,andborderValueisusedwhenborderModeisBORDER_CONSTANT.
Theexamplecode
TheTranslationexampleshowsyouhowtousethewarpAffinefunctiontotranslateanimage.Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Applytranslation
Matdst;
MatM=(Mat_<double>(2,3)<<1,0,200,0,1,150);
warpAffine(src,dst,M,src.size());
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("TRANSLATED",WINDOW_AUTOSIZE);
imshow("TRANSLATED",dst);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 150: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/150.jpg)
Originalanddisplacedimages.Thehorizontaldisplacementis200andverticaldisplacementis150.
ImagerotationImagerotationinvolvesaspecificangle,θ.OpenCVsupportsscaledrotationsinaspecificlocationusingatransformationmatrixdefinedasfollows:
Here,xandyarethecoordinatesoftherotationpointandsfisthescalefactor.
RotationsareappliedliketranslationsbymeansofthewarpAffinefunctionbutusingtheMatgetRotationMatrix2D(Point2fcenter,doubleangle,doublescale)functiontocreatetherotationtransformationmatrix.TheMparameteristhetransformationmatrixthatconvertssrcintodst.Asthenamesoftheparametersindicate,centeristhecenterpointoftherotation,angleistherotationangle(inacounter-clockwisedirection),andscaleisthescalefactor.
Theexamplecode
![Page 151: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/151.jpg)
ThefollowingRotateexampleshowsyouhowtousethewarpAffinefunctiontorotateanimage.A45-degreecenteredrotationmatrixisfirstlyobtainedbygetRotationMatrix2D(Point2f(src.cols/2,src.rows/2),45,1).Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Applytherotation
Matdst;
MatM=getRotationMatrix2D(Point2f(src.cols/2,src.rows/2),45,1);
warpAffine(src,dst,M,src.size());
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("ROTATED",WINDOW_AUTOSIZE);
imshow("ROTATED",dst);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 152: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/152.jpg)
Theoriginalimageandtheimageaftera45-degreecenteredrotationisapplied
SkewingAskewingtransformationdisplaceseachpointinafixeddirectionbyanamountproportionaltoitssigneddistancefromalinethatisparalleltothatdirection.Therefore,itwillusuallydistorttheshapeofageometricfigure,forexample,turningsquaresintonon-squareparallelogramsandcirclesintoellipses.However,askewingpreservestheareaofgeometricfigures,thealignment,andrelativedistancesofcollinearpoints.Askewingmappingisthemaindifferencebetweenuprightandslanted(oritalic)stylesofletters.
Skewingcanalsobedefinedbyitsangle,θ.
Theoriginalanditsrotated45degreesfromcenterimage
Usingtheskewingangle,thetransformationmatricesforhorizontalandverticalskewing
![Page 153: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/153.jpg)
are:
Duetothesimilaritieswithprevioustransformations,thefunctionusedtoapplyskewingiswarpAffine.
TipOnmostoccasions,itwillbenecessarytoaddsomesizetotheoutputimageand/orapplytranslation(changingthelastcolumnonthesheartransformationmatrix)inordertodisplaytheoutputimagecompletelyandinacenteredmanner.
Theexamplecode
ThefollowingSkewexampleshowsyouhowtousethewarpAffinefunctiontoskewθ=π/3horizontallyinanimage.Theexamplecodeis:
#include"opencv2/opencv.hpp"
#include<math.h>
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Applyskew
Matdst;
doublem=1/tan(M_PI/3);
MatM=(Mat_<double>(2,3)<<1,m,0,0,1,0);
warpAffine(src,dst,M,Size(src.cols+0.5*src.cols,src.rows));
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("SKEWED",WINDOW_AUTOSIZE);
imshow("SKEWED",dst);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 154: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/154.jpg)
Theoriginalimageandtheimagewhenskewedhorizontally
ReflectionAsreflectionisdoneoverthexandyaxesbydefault,itisnecessarytoapplytranslation(thelastcolumnofthetransformationmatrix).Then,thereflectionmatrixis:
Here,txisthenumberofimagecolumnsandtyisthenumberofimagerows.
Aswithprevioustransformations,thefunctionusedtoapplyreflectioniswarpAffine.
NoteOtheraffinetransformationscanbeappliedusingthewarpAffinefunctionwiththeircorrespondingtransformationmatrices.
Theexamplecode
ThefollowingReflectexampleshowsyouanexampleofhorizontal,vertical,andcombinedreflectionofanimageusingthewarpAffinefunction.Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
![Page 155: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/155.jpg)
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Applythereflections
Matdsth,dstv,dst;
MatMh=(Mat_<double>(2,3)<<-1,0,src.cols,0,1,0
MatMv=(Mat_<double>(2,3)<<1,0,0,0,-1,src.rows);
MatM=(Mat_<double>(2,3)<<-1,0,src.cols,0,-1,src.rows);
warpAffine(src,dsth,Mh,src.size());
warpAffine(src,dstv,Mv,src.size());
warpAffine(src,dst,M,src.size());
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("H-REFLECTION",WINDOW_AUTOSIZE);
imshow("H-REFLECTION",dsth);
namedWindow("V-REFLECTION",WINDOW_AUTOSIZE);
imshow("V-REFLECTION",dstv);
namedWindow("REFLECTION",WINDOW_AUTOSIZE);
imshow("REFLECTION",dst);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputforthecode:
![Page 156: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/156.jpg)
TheoriginalandrotatedimagesinX,Y,andbothaxes
![Page 157: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/157.jpg)
PerspectivetransformationForperspectivetransformation,a3x3transformationmatrixisneeded,althoughtheworkisperformedovertwo-dimensionalimages.Straightlinesremainstraightintheoutputimage,butinthiscase,proportionschange.Findingthetransformationmatrixismorecomplexthanwithaffinetransformations.Whenworkingwithperspective,thecoordinatesoffourpointsoftheinputimagematrixandtheircorrespondingcoordinatesontheoutputimagematrixareusedtoperformthisoperation.
WiththesepointsandthegetPerspectiveTransformOpenCVfunction,itispossibletofindtheperspectivetransformationmatrix.Afterobtainingthematrix,warpPerspectiveisappliedtoobtaintheoutputoftheperspectivetransformation.Thetwofunctionsareexplainedindetailhere:
MatgetPerspectiveTransform(InputArraysrc,InputArraydst)andMatgetPerspectiveTransform(constPoint2fsrc[],constPoint2fdst[]):Thisreturnstheperspectivetransformationmatrixcalculatedfromsrcanddst.voidwarpPerspective(InputArraysrc,OutputArraydst,InputArrayM,
Sizedsize,intflags=INTER_LINEAR,intborderMode=BORDER_CONSTANT,
constScalar&borderValue=Scalar()):ThisappliesanMaffinetransformationtoansrcimage,obtainingthenewdstimage.Therestoftheparametersarethesameasinothergeometricaltransformationsdiscussed.
TheexamplecodeThefollowingPerspectiveexampleshowsyouanexampleofhowtochangetheperspectiveofanimageusingthewarpPerspectivefunction.Inthiscase,itisnecessarytoindicatethecoordinatesoffourpointsfromthefirstimageandanotherfourfromtheoutputtocalculatetheperspectivetransformationmatrixthroughgetPerspectiveTransform.Theselectedpointsare:
Point2fsrc_verts[4];
src_verts[2]=Point(195,140);
src_verts[3]=Point(410,120);
src_verts[1]=Point(220,750);
src_verts[0]=Point(400,750);
Point2fdst_verts[4];
dst_verts[2]=Point(160,100);
dst_verts[3]=Point(530,120);
dst_verts[1]=Point(220,750);
dst_verts[0]=Point(400,750);
Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
![Page 158: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/158.jpg)
Matsrc;
src=imread(argv[1]);
Matdst;
Point2fsrc_verts[4];
src_verts[2]=Point(195,140);
src_verts[3]=Point(410,120);
src_verts[1]=Point(220,750);
src_verts[0]=Point(400,750);
Point2fdst_verts[4];
dst_verts[2]=Point(160,100);
dst_verts[3]=Point(530,120);
dst_verts[1]=Point(220,750);
dst_verts[0]=Point(400,750);
//ObtainandApplytheperspectivetransformation
MatM=getPerspectiveTransform(src_verts,dst_verts);
warpPerspective(src,dst,M,src.size());
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("PERSPECTIVE",WINDOW_AUTOSIZE);
imshow("PERSPECTIVE",dst);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 159: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/159.jpg)
Perspectiveresultswiththepointsmarkedintheoriginalimage
![Page 160: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/160.jpg)
![Page 161: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/161.jpg)
InpaintingInpaintingistheprocessofreconstructingdamagedpartsofimagesandvideos.Thisprocessisalsoknownasimageorvideointerpolation.Thebasicideaistosimulatetheprocessdonebyrestorerswithantiques.Nowadays,withthewideuseofdigitalcameras,inpaintinghasbecomeanautomaticprocessthatisusednotonlyforimagerestorationbydeletingscratches,butalsoforothertasks,suchasobjectortextremoval.
OpenCVsupportsaninpaintingalgorithmasofVersion2.4.Thefunctionforthispurposeis:
voidinpaint(InputArraysrc,InputArrayinpaintMask,OutputArraydst,
doubleinpaintRadius,intflags):Thisrestorestheareasindicatedwithnon-zerovaluesbytheinpaintMaskparameterinthesource(src)image.TheinpaintRadiusparameterindicatestheneighborhoodtobeusedbythealgorithmspecifiedbyflags.TwomethodscouldbeusedinOpenCV:
INPAINT_NS:ThisistheNavier-Stokes-basedmethodINPAINT_TELEA:ThisisthemethodproposedbyAlexandruTelea
Finally,therestoredimageisstoredindst.
NoteMoredetailsabouttheinpaintingalgorithmsusedinOpenCVcanbefoundathttp://www.ifp.illinois.edu/~yuhuang/inpainting.html
TipForvideoinpainting,considerthevideoasasequenceofimagesandapplythealgorithmoverallofthem.
![Page 162: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/162.jpg)
TheexamplecodeThefollowinginpaintingexampleshowsyouhowtousetheinpaintfunctiontoinpainttheareasofanimagespecifiedinanimagemask.
Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Readthemaskfile
Matmask;
mask=imread(argv[2]);
cvtColor(mask,mask,COLOR_RGB2GRAY);
//Applytheinpaintingalgorithms
Matdst,dst2;
inpaint(src,mask,dst,10,INPAINT_TELEA);
inpaint(src,mask,dst2,10,INPAINT_NS);
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("MASK",WINDOW_AUTOSIZE);
imshow("MASK",mask);
namedWindow("INPAINT_TELEA",WINDOW_AUTOSIZE);
imshow("INPAINT_TELEA",dst);
namedWindow("INPAINT_NS",WINDOW_AUTOSIZE);
imshow("INPAINT_NS",dst2);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 163: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/163.jpg)
Resultsofapplyinginpainting
NoteThefirstrowcontainstheoriginalimageandthemaskused.ThesecondrowcontainstheresultsfromtheinpaintingproposedbyTeleaontheleft-handsideandtheNavier-Stokes-basedmethodontheright-handside.
Gettingtheinpaintingmaskisnotaneasytask.Theinpainting2examplecodeshowsyouanexampleofhowwecanobtainthemaskfromthesourceimageusingbinarythresholdingthroughthreshold(mask,mask,235,255,THRESH_BINARY):
#include"opencv2/opencv.hpp"
usingnamespacecv;
![Page 164: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/164.jpg)
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Createthemask
Matmask;
cvtColor(src,mask,COLOR_RGB2GRAY);
threshold(mask,mask,235,255,THRESH_BINARY);
//Applytheinpaintingalgorithms
Matdst,dst2;
inpaint(src,mask,dst,10,INPAINT_TELEA);
inpaint(src,mask,dst2,10,INPAINT_NS);
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("MASK",WINDOW_AUTOSIZE);
imshow("MASK",mask);
namedWindow("INPAINT_TELEA",WINDOW_AUTOSIZE);
imshow("INPAINT_TELEA",dst);
namedWindow("INPAINT_NS",WINDOW_AUTOSIZE);
imshow("INPAINT_NS",dst2);
waitKey();
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 165: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/165.jpg)
Resultsofapplyinginpaintingalgorithmswithoutknowingthemask
NoteThefirstrowcontainstheoriginalimageandtheextractedmask.ThesecondrowcontainstheresultsfromtheinpaintingproposedbyTeleaontheleft-handsideandtheNavier-Stokes-basedmethodontheright-handside.
Theresultsfromthisexampleshowyouthatobtainingaperfectmaskisnotalwayspossible.Someotherpartsoftheimage,suchasthebackgroundornoise,areincludedsometimes.However,theinpaintingresultsremainacceptableastheresultingimagesareclosetotheonesobtainedintheothercase.
![Page 166: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/166.jpg)
![Page 167: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/167.jpg)
![Page 168: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/168.jpg)
DenoisingDenoisingornoisereductionistheprocessofremovingnoisefromsignalsobtainedfromanalogordigitaldevices.Thissectionfocusesitsattentiononreducingnoisefromdigitalimagesandvideos.
Althoughsmoothingandmedianfilteringaregoodoptionstodenoiseanimage,OpenCVprovidesotheralgorithmstoperformthistask.ThesearethenonlocalmeansandtheTVL1(TotalVariationL1)algorithms.Thebasicideaofthenonlocalmeansalgorithmistoreplacethecolorofapixelwithanaverageofthecolorsfromseveralimagesub-windowsthataresimilartotheonethatcomprisesthepixelneighborhood.Ontheotherhand,theTVL1variationaldenoisingmodel,whichisimplementedwiththeprimal-dualoptimizationalgorithm,considerstheimage-denoisingprocessavariationalproblem.
NoteMoreinformationaboutthenonlocalmeansandtheTVL1denoisingalgorithmscanbefoundathttp://www.ipol.im/pub/art/2011/bcm_nlmandhttp://znah.net/rof-and-tv-l1-denoising-with-primal-dual-algorithm.html,respectively.
OpenCVprovidesfourfunctionstodenoisecolorandgrayscaleimagesfollowingthenonlocalmeansapproach.FortheTVL1model,onefunctionisprovided.Thesefunctionsare:
voidfastNlMeansDenoising(InputArraysrc,OutputArraydst,floath=3,
inttemplateWindowSize=7,intsearchWindowSize=21):Thisdenoisesasinglegrayscaleimageloadedinsrc.ThetemplateWindowSizeandsearchWindowSizeparametersarethesizesinpixelsofthetemplatepatchthatisusedtocomputeweightsandthewindowthatisusedtocomputetheweightedaverageforthegivenpixel.Theseshouldbeoddandtheirrecommendedvaluesare7and21pixels,respectively.Thehparameterregulatestheeffectofthealgorithm.Largerhvaluesremovemorenoisedefectsbutwiththedrawbackofremovingmoreimagedetails.Theoutputisstoredindst.voidfastNlMeansDenoisingColored(InputArraysrc,OutputArraydst,float
h=3,floathForColorComponents=3,inttemplateWindowSize=7,int
searchWindowSize=21):Thisisamodificationofthepreviousfunctionforcoloredimages.ItconvertsthesrcimagetotheCIELABcolorspaceandthenseparatelydenoisestheLandABcomponentswiththefastNlMeansDenoisingfunction.voidfastNlMeansDenoisingMulti(InputArrayOfArrayssrcImgs,OutputArray
dst,intimgToDenoiseIndex,inttemporalWindowSize,floath=3,int
templateWindowSize=7,intsearchWindowSize=21):Thisusesanimagesequencetoobtainadenoisedimage.Twomoreparametersareneededinthiscase:imgToDenoiseIndexandtemporalWindowSize.ThevalueofimgToDenoiseIndexisthetargetimageindexinsrcImgstobedenoised.Finally,temporalWindowSizeisusedtoestablishthenumberofsurroundingimagestobeusedfordenoising.Thisshouldbeodd.
![Page 169: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/169.jpg)
voidfastNlMeansDenoisingColoredMulti(InputArrayOfArrayssrcImgs,
OutputArraydst,intimgToDenoiseIndex,inttemporalWindowSize,floath
=3,floathForColorComponents=3,inttemplateWindowSize=7,int
searchWindowSize=21):ThisisbasedonthefastNlMeansDenoisingColoredandfastNlMeansDenoisingMultifunctions.Theparametersareexplainedintherestofthefunctions.voiddenoise_TVL1(conststd::vector<Mat>&observations,Mat&result,
doublelambda,intniters):Thisobtainsadenoisedimageinresultfromoneormorenoisyimagesstoredinobservations.Thelambdaandnitersparameterscontrolthestrengthandthenumberofiterationsofthealgorithm.
![Page 170: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/170.jpg)
TheexamplecodeThefollowingdenoisingexampleshowsyouhowtouseoneofthedenoisingfunctionsfornoisereductionoveracoloredimage(fastNlMeansDenoisingColored).Astheexampleusesanimagewithoutnoise,somethingneedstobeadded.Forthispurpose,thefollowinglinesofcodeareused:
Matnoisy=src.clone();
Matnoise(src.size(),src.type());
randn(noise,0,50);
noisy+=noise;
AMatelementiscreatedwiththesamesizeandtypeoftheoriginalimagetostorenoisegeneratedbytherandnfunctiononit.Finally,thenoiseisaddedtotheclonedimagetoobtainthenoisyimage.
Theexamplecodeis:
#include"opencv2/opencv.hpp"
usingnamespacecv;
intmain(intargc,char**argv)
{
//Readthesourcefile
Matsrc;
src=imread(argv[1]);
//Addsomenoise
Matnoisy=src.clone();
Matnoise(src.size(),src.type());
randn(noise,0,50);
noisy+=noise;
//Applythedenoisingalgorithm
Matdst;
fastNlMeansDenoisingColored(noisy,dst,30,30,7,21);
//Showtheresults
namedWindow("ORIGINAL",WINDOW_AUTOSIZE);
imshow("ORIGINAL",src);
namedWindow("ORIGINALWITHNOISE",WINDOW_AUTOSIZE);
imshow("ORIGINALWITHNOISE",noisy);
namedWindow("DENOISED",WINDOW_AUTOSIZE);
imshow("DENOISED",dst);
waitKey();
return0;
}
Thefollowingfigureshowsyounoisyanddenoisedimagesfromexecutingthepreviouscode:
![Page 171: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/171.jpg)
Resultsfromapplyingdenoising
![Page 172: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/172.jpg)
![Page 173: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/173.jpg)
SummaryInthischapter,weexplainedmethodsforimageenhancementandcorrection,includingnoisereduction,edgeenhancement,morphologicaloperations,geometricaltransformations,andtherestorationofdamagedimages.DifferentoptionshavebeenpresentedineachcasetoprovidethereaderwithalltheoptionsthatcanbeusedinOpenCV.
Thenextchapterwillcovercolorspacesandhowtoconvertthem.Inaddition,color-space-basedsegmentationandcolor-transfermethodswillbeexplained.
![Page 174: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/174.jpg)
![Page 175: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/175.jpg)
Chapter4.ProcessingColorColorisaperceptualresultcreatedinresponsetotheexcitationofourvisualsystembylightincidentupontheretinainthevisibleregionofthespectrum.Thecolorofanimagemaycontainagreatdealofinformation,whichcanbeusedforsimplifyingimageanalysis,objectidentification,andextractionbasedoncolor.Theseproceduresareusuallycarriedoutconsideringthepixelvaluesinthecolorspaceinwhichitisdefined.Inthischapter,thefollowingtopicswillbecovered:
ThecolorspacesusedinOpenCVandhowtoconvertanimagefromonecolormodeltoanotherAnexampleofhowtosegmentapictureconsideringthecolorspaceinwhichitisdefinedHowtotransfertheappearanceofanimagetoanotherusingthecolortransfermethod
![Page 176: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/176.jpg)
ColorspacesThehumanvisualsystemisabletodistinguishhundredsofthousandsofcolors.Toobtainthisinformation,thehumanretinahasthreetypesofcolorphotoreceptorconecells,whichrespondtoincidentradiation.Becauseofthis,mosthumancolorperceptionscanbegeneratedwiththreenumericalcomponentscalledprimaries.
Tospecifyacolorintermsofthreeormoreparticularcharacteristics,thereareanumberofmethodscalledcolorspacesorcolormodels.Selectingbetweenthemtorepresentanimagedependsontheoperationstobeperformed,becausesomearemoreappropriateaccordingtotherequiredapplication.Forexample,insomecolorspacessuchasRGB,thebrightnessaffectsthethreechannels,afactthatcouldbeunfavorableforsomeimage-processingoperations.ThenextsectionexplainscolorspacesusedinOpenCVandhowtoconvertapicturefromonecolormodeltoanother.
![Page 177: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/177.jpg)
Conversionbetweencolorspaces(cvtColor)Therearemorethan150color-spaceconversionmethodsavailableinOpenCV.ThefunctionprovidedbyOpenCVintheimgprocmoduleisvoidcvtColor(InputArraysrc,OutputArraydst,intcode,intdstCn=0).Theargumentsofthisfunctionare:
src:Thisisaninputimage8-bitunsigned,16-bitunsigned(CV_16UC),orsingle-precisionfloating-point.dst:Thisistheoutputimageofthesamesizeanddepthassrc.code:Thisisthecolorspaceconversioncode.ThestructureofthisparameterisCOLOR_SPACEsrc2SPACEdst.SomeexamplevaluesareCOLOR_BGR2GRAYandCOLOR_YCrCb2BGR.dstCn:Thisisthenumberofchannelsinthedestinationimage.Ifthisparameteris0oromitted,thenumberofthechannelsisderivedautomaticallyfromsrcandcode.
Examplesofthisfunctionwillbedescribedintheupcomingsections.
TipThecvtColorfunctioncanonlyconvertfromRGBtoanothercolorspaceorfromanothercolorspacetoRGB,soifthereaderwantstoconvertbetweentwocolorspacesotherthanRGB,afirstconversiontoRGBmustbedone.
VariouscolorspacesinOpenCVarediscussedintheupcomingsections.
RGBRGBisanadditivemodelinwhichanimageconsistsofthreeindependentimageplanesorchannels:red,green,andblue(andoptionally,afourthchannelforthetransparency,sometimescalledalphachannel).Tospecifyaparticularcolor,eachvalueindicatestheamountofeachofthecomponentspresentoneachpixel,withhighervaluescorrespondingtobrighterpixels.Thiscolorspaceiswidelyusedbecauseitcorrespondstothethreephotoreceptorsofthehumaneye.
NoteThedefaultcolorformatinOpenCVisoftenreferredtoasRGBbutitisactuallystoredasBGR(thechannelsarereversed).
Theexamplecode
ThefollowingBGRsplitexampleshowsyouhowtoloadanRGBimage,splittingandshowingeachparticularchannelingrayandinacolor.Thefirstpartofthecodeisusedtoloadandshowthepicture:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
![Page 178: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/178.jpg)
vector<Mat>showSeparatedChannels(vector<Mat>channels);
intmain(intargc,constchar**argv)
{
//Loadtheimage
Matimage=imread("BGR.png");
imshow("Picture",image);
Thenextpartofthecodesplitsthepictureintoeachchannelandshowsit:
vector<Mat>channels;
split(image,channels);
//showchannelsingrayscale
namedWindow("Bluechannel(gray)",WINDOW_AUTOSIZE);
imshow("Bluechannel(gray)",channels[0]);
namedWindow("Greenchannel(gray)",WINDOW_AUTOSIZE);
imshow("Greenchannel(gray)",channels[1]);
namedWindow("Redchannel(gray)",WINDOW_AUTOSIZE);
imshow("Redchannel(gray)",channels[2]);
//showchannelsinBGR
vector<Mat>separatedChannels=showSeparatedChannels(channels);
namedWindow("Bluechannel",WINDOW_AUTOSIZE);
imshow("Bluechannel",separatedChannels[0]);
namedWindow("Greenchannel",WINDOW_AUTOSIZE);
imshow("Greenchannel",separatedChannels[1]);
namedWindow("Redchannel",WINDOW_AUTOSIZE);
imshow("Redchannel",separatedChannels[2]);
waitKey(0);
return0;
}
Itisworthnotingtheuseofthevoidsplit(InputArraym,OutputArrayOfArraysmv)OpenCVfunctiontosplittheimageminitsthreechannelsandsaveitinavectorofMatcalledmv.Onthecontrary,thevoidmerge(InputArrayOfArraysmv,OutputArraydst)functionisusedtomergeallthemvchannelsinonedstimage.Furthermore,afunctiondenominatedasshowSeparatedChannelsisusedtocreatethreecolorimagesrepresentingeachofthechannels.Foreachchannel,thefunctiongeneratesvector<Mat>auxcomposedbythechannelitselfandtwoauxiliarychannelsorderedwithalltheirvaluessetto0,whichrepresenttheothertwochannelsofthecolormodel.Finally,theauxpictureismerged,generatinganimagewithonlyonechannelfulfilled.Thisfunctioncode,whichwillalsobeusedinotherexamplesofthischapter,isasfollows:
vector<Mat>showSeparatedChannels(vector<Mat>channels){
vector<Mat>separatedChannels;
//createeachimageforeachchannel
for(inti=0;i<3;i++){
Matzer=Mat::zeros(channels[0].rows,channels[0].cols,
channels[0].type());
![Page 179: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/179.jpg)
vector<Mat>aux;
for(intj=0;j<3;j++){
if(j==i)
aux.push_back(channels[i]);
else
aux.push_back(zer);
}
Matchann;
merge(aux,chann);
separatedChannels.push_back(chann);
}
returnseparatedChannels;
}
Thefollowingfigureshowsyoutheoutputoftheexample:
TheoriginalRGBimageandchannelsplitting
GrayscaleIngrayscale,thevalueofeachpixelisrepresentedasasinglevaluecarryingonlytheintensityinformation,composinganimageexclusivelyformedfromdifferentshadesofgray.ThecolorspaceconversioncodetoconvertbetweenRGBandgrayscale(Y)inOpenCVusingcvtColorisCOLOR_BGR2GRAY,COLOR_RGB2GRAY,COLOR_GRAY2BGR,andCOLOR_GRAY2RGB.Thesetransformationsareinternallycomputedasfollows:
Note
![Page 180: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/180.jpg)
Notefromtheprecedingformulathatitisnotpossibletoretrievecolorsdirectlyfromagrayscaleimage.
Examplecode
ThefollowingGrayexampleshowsyouhowtoconvertanRGBimagetograyscale,showingthetwopictures.Theexamplecodeis:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacecv;
intmain(intargc,constchar**argv)
{
//Loadtheimage
Matimage=imread("Lovebird.jpg");
namedWindow("Picture",WINDOW_AUTOSIZE);
imshow("Picture",image);
MatimageGray;
cvtColor(image,imageGray,COLOR_BGR2GRAY);
namedWindow("Graypicture",WINDOW_AUTOSIZE);
imshow("Graypicture",imageGray);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 181: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/181.jpg)
TheoriginalRGBimageandthegrayscaleconversion
NoteThismethodtoconvertfromRGBtograyscalehasthedisadvantageoflosingthecontrastoftheoriginalimage.Chapter6,ComputationalPhotography,ofthisbookdescribesthedecolorizationprocess,whichmakesthissameconversionwhileovercomingthisissue.
CIEXYZTheCIEXYZsystemdescribescolorwithaluminancecomponentY,whichisrelatedtothebrightnesssensitivityofhumanvisionandtwoadditionalchannels,XandZ,standardizedbytheCommissionInternationaledeL’Éclairage(CIE)usingstatisticsfromexperimentswithseveralhumanobservers.Thiscolorspaceisusedtoreportcolorfrommeasuringinstruments,suchasacolorimeteroraspectrophotometer,anditisusefulwhenaconsistentcolorrepresentationacrossdifferentdevicesisneeded.Themainproblemofthiscolorspaceisthatthecolorsarescaledinanon-uniformmanner.ThisfactcausedtheCIEtoadopttheCIEL*a*b*andCIEL*u*v*colormodels.
ThecolorspaceconversioncodetoconvertbetweenRGBandCIEXYZinOpenCVusingcvtColorisCOLOR_BGR2XYZ,COLOR_RGB2XYZ,COLOR_XYZ2BGR,andCOLOR_XYZ2RGB.Thesetransformationsarecomputedasfollows:
![Page 182: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/182.jpg)
Theexamplecode
ThefollowingCIExyzexampleshowsyouhowtoconvertanRGBimagetotheCIEXYZcolorspace,splittingandshowingeachparticularchannelingrayandinacolor.Thefirstpartofthecodeisusedtoloadandconvertthepicture:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
vector<Mat>showSeparatedChannels(vector<Mat>channels);
intmain(intargc,constchar**argv)
{
//Loadtheimage
Matimage=imread("Lovebird.jpg");
imshow("Picture",image);
//transformtoCIEXYZ
cvtColor(image,image,COLOR_BGR2XYZ);
ThenextpartofthecodesplitsthepictureineachoftheCIEXYZchannelsandshowsthem:
vector<Mat>channels;
split(image,channels);
//showchannelsingrayscale
namedWindow("Xchannel(gray)",WINDOW_AUTOSIZE);
imshow("Xchannel(gray)",channels[0]);
namedWindow("Ychannel(gray)",WINDOW_AUTOSIZE);
imshow("Ychannel(gray)",channels[1]);
namedWindow("Zchannel(gray)",WINDOW_AUTOSIZE);
imshow("Zchannel(gray)",channels[2]);
//showchannelsinBGR
vector<Mat>separatedChannels=showSeparatedChannels(channels);
for(inti=0;i<3;i++){
![Page 183: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/183.jpg)
cvtColor(separatedChannels[i],separatedChannels[i],COLOR_XYZ2BGR);
}
namedWindow("Xchannel",WINDOW_AUTOSIZE);
imshow("Xchannel",separatedChannels[0]);
namedWindow("Ychannel",WINDOW_AUTOSIZE);
imshow("Ychannel",separatedChannels[1]);
namedWindow("Zchannel",WINDOW_AUTOSIZE);
imshow("Zchannel",separatedChannels[2]);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
TheoriginalRGBimageandtheCIEXYZchannelsplitting
YCrCbThiscolorspaceiswidelyusedinvideo-andimage-compressionschemes,anditisnotanabsolutecolorspacebecauseitisawaytoencodetheRGBcolorspace.TheYchannelrepresentsluminance,whileCrandCbrepresentred-difference(thedifferencebetweentheRchannelintheRGBcolorspaceandY)andblue-difference(thedifferencebetweentheBchannelintheRGBcolorspaceandY)chromacomponents,respectively.Itisusedwidelyinvideo-andimage-compressionschemes,suchasMPEGandJPEG.
ThecolorspaceconversioncodetoconvertbetweenRGBandYCrCbinOpenCVusingcvtColorisCOLOR_BGR2YCrCb,COLOR_RGB2YCrCb,COLOR_YCrCb2BGR,andCOLOR_YCrCb2RGB.Thesetransformationsarecomputedasfollows:
![Page 184: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/184.jpg)
Then,takealookatthefollowing:
Theexamplecode
ThefollowingYCrCbcolorexampleshowsyouhowtoconvertanRGBimagetotheYCrCbcolorspace,splittingandshowingeachparticularchannelingrayandinacolor.Thefirstpartofthecodeisusedtoloadandconvertthepicture:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
vector<Mat>showSeparatedChannels(vector<Mat>channels);
intmain(intargc,constchar**argv)
{
//Loadtheimage
Matimage=imread("Lovebird.jpg");
![Page 185: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/185.jpg)
imshow("Picture",image);
//transformtoYCrCb
cvtColor(image,image,COLOR_BGR2YCrCb);
ThenextpartofthecodesplitsthepictureintoeachoftheYCrCbchannelsandshowsthem:
vector<Mat>channels;
split(image,channels);
//showchannelsingrayscale
namedWindow("Ychannel(gray)",WINDOW_AUTOSIZE);
imshow("Ychannel(gray)",channels[0]);
namedWindow("Crchannel(gray)",WINDOW_AUTOSIZE);
imshow("Crchannel(gray)",channels[1]);
namedWindow("Cbchannel(gray)",WINDOW_AUTOSIZE);
imshow("Cbchannel(gray)",channels[2]);
//showchannelsinBGR
vector<Mat>separatedChannels=showSeparatedChannels(channels);
for(inti=0;i<3;i++){
cvtColor(separatedChannels[i],separatedChannels[i],COLOR_YCrCb2BGR);
}
namedWindow("Ychannel",WINDOW_AUTOSIZE);
imshow("Ychannel",separatedChannels[0]);
namedWindow("Crchannel",WINDOW_AUTOSIZE);
imshow("Crchannel",separatedChannels[1]);
namedWindow("Cbchannel",WINDOW_AUTOSIZE);
imshow("Cbchannel",separatedChannels[2]);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 186: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/186.jpg)
TheoriginalRGBimageandtheYCrCbchannelsplitting
HSVTheHSVcolorspacebelongstothegroupoftheso-calledhue-orientedcolor-coordinatesystems.Thistypeofcolormodelcloselyemulatesmodelsofhumancolorperception.Whileinothercolormodels,suchasRGB,animageistreatedasanadditiveresultofthreebasecolors,thethreechannelsofHSVrepresenthue(Hgivesameasureofthespectralcompositionofacolor),saturation(Sgivestheproportionofpurelightofthedominantwavelength,whichindicateshowfaracolorisfromagrayofequalbrightness),andvalue(Vgivesthebrightnessrelativetothebrightnessofasimilarlyilluminatedwhitecolor)correspondingtotheintuitiveappealoftint,shade,andtone.HSViswidelyusedtomakeacomparisonofcolorsbecauseHisalmostindependentlightvariations.Thefollowingfigureshowsyouthiscolormodelrepresentingeachofthechannelsasapartofacylinder:
![Page 187: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/187.jpg)
ThecolorspaceconversioncodetoconvertbetweenRGBandHSVinOpenCVusingcvtColorisCOLOR_BGR2HSV,COLOR_RGB2HSV,COLOR_HSV2BGR,andCOLOR_HSV2RGB.Inthiscase,itisworthnotingthatifthesrcimageformatis8-bitor16-bit,cvtColorfirstconvertsittoafloating-pointformat,scalingthevaluesbetween0and1.Afterthat,thetransformationsarecomputedasfollows:
IfH<0,thenH=H+360.Finally,thevaluesarereconvertedtothedestinationdatatype.
Theexamplecode
ThefollowingHSVcolorexampleshowsyouhowtoconvertanRGBimagetotheHSVcolorspace,splittingandshowingeachparticularchannelingrayscaleandtheHSVimage.Theexamplecodeis:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
intmain(intargc,constchar**argv)
{
//Loadtheimage
Matimage=imread("Lovebird.jpg");
imshow("Picture",image);
//transformtoHSV
cvtColor(image,image,COLOR_BGR2HSV);
vector<Mat>channels;
![Page 188: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/188.jpg)
split(image,channels);
//showchannelsingrayscale
namedWindow("Hchannel(gray)",WINDOW_AUTOSIZE);
imshow("Hchannel(gray)",channels[0]);
namedWindow("Schannel(gray)",WINDOW_AUTOSIZE);
imshow("Schannel(gray)",channels[1]);
namedWindow("Vchannel(gray)",WINDOW_AUTOSIZE);
imshow("Vchannel(gray)",channels[2]);
namedWindow("HSVimage(allchannels)",WINDOW_AUTOSIZE);
imshow("HSVimage(allchannels)",image);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
TheoriginalRGBimage,HSVconversion,andchannelsplitting
NoteTheimshowfunctionofOpenCVassumesthatthecoloroftheimagetobeshownisRGB,
![Page 189: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/189.jpg)
soitdisplaysitincorrectly.Ifyouhaveanimageinanothercolorspaceandyouwanttodisplayitcorrectly,youfirsthavetoconvertitbacktoRGB.
HLSTheHLScolorspacebelongstothegroupofhue-orientedcolor-coordinatesystems,suchastheHSVcolormodelexplainedpreviously.Thismodelwasdevelopedtospecifythevaluesofhue,lightness,andsaturationofacolorineachchannel.ThedifferencewithrespecttotheHSVcolormodelisthatthelightnessofapurecolordefinedbyHLSisequaltothelightnessofamediumgray,whilethebrightnessofapurecolordefinedbyHSVisequaltothebrightnessofwhite.
ThecolorspaceconversioncodetoconvertbetweenRGBandHLSinOpenCVusingcvtColorisCOLOR_BGR2HLS,COLOR_RGB2HLS,COLOR_HLS2BGR,andCOLOR_HLS2RGB.Inthiscase,aswithHSV,ifthesrcimageformatis8-bitor16-bit,cvtColorfirstconvertsittoafloating-pointformat,scalingthevaluesbetween0and1.Afterthat,thetransformationsarecomputedasfollows:
IfH<0,thenH=H+360.Finally,thevaluesarereconvertedtothedestinationdatatype.
Theexamplecode
ThefollowingHLScolorexampleshowsyouhowtoconvertanRGBimagetoHLScolor
![Page 190: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/190.jpg)
space,splittingandshowingeachparticularchannelingrayscaleandtheHLSimage.Theexamplecodeis:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
intmain(intargc,constchar**argv)
{
//Loadtheimage
Matimage=imread("Lovebird.jpg");
imshow("Picture",image);
//transformtoHSV
cvtColor(image,image,COLOR_BGR2HLS);
vector<Mat>channels;
split(image,channels);
//showchannelsingrayscale
namedWindow("Hchannel(gray)",WINDOW_AUTOSIZE);
imshow("Hchannel(gray)",channels[0]);
namedWindow("Lchannel(gray)",WINDOW_AUTOSIZE);
imshow("Lchannel(gray)",channels[1]);
namedWindow("Schannel(gray)",WINDOW_AUTOSIZE);
imshow("Schannel(gray)",channels[2]);
namedWindow("HLSimage(allchannels)",WINDOW_AUTOSIZE);
imshow("HLSimage(allchannels)",image);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 191: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/191.jpg)
TheoriginalRGBimage,HLSconversion,andchannelsplitting
CIEL*a*b*TheCIEL*a*b*colorspaceistheseconduniformcolorspacestandardizedbyCIEafterCIEL*u*v*,whichisderivedbasedontheCIEXYZspaceandwhitereferencepoint.Actually,itisthemostcompletecolorspacespecifiedbyCIEandwascreatedtobedevice-independent,liketheCYEXYZmodel,andtobeusedasareference.Itisabletodescribethecolorsvisibletothehumaneye.Thethreechannelsrepresentthelightnessofthecolor(L*),itspositionbetweenmagentaandgreen(a*),anditspositionbetweenyellowandblue(b*).
ThecolorspaceconversioncodetoconvertbetweenRGBandCIEL*a*b*inOpenCVusingcvtColorisCOLOR_BGR2Lab,COLOR_RGB2Lab,COLOR_Lab2BGR,andCOLOR_Lab2RGB.Theprocedureusedtocomputethesetransformationsisexplainedathttp://docs-hoffmann.de/cielab03022003.pdf.
Theexamplecode
ThefollowingCIElabexampleshowsyouhowtoconvertanRGBimagetotheCIEL*a*b*colorspace,splittingandshowingeachparticularchannelingrayscaleandtheCIEL*a*b*image.Theexamplecodeis:
![Page 192: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/192.jpg)
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
intmain(intargc,constchar**argv)
{
//Loadtheimage
Matimage=imread("Lovebird.jpg");
imshow("Picture",image);
//transformtoCIELab
cvtColor(image,image,COLOR_BGR2Lab);
vector<Mat>channels;
split(image,channels);
//showchannelsingrayscale
namedWindow("Lchannel(gray)",WINDOW_AUTOSIZE);
imshow("Lchannel(gray)",channels[0]);
namedWindow("achannel(gray)",WINDOW_AUTOSIZE);
imshow("achannel(gray)",channels[1]);
namedWindow("bchannel(gray)",WINDOW_AUTOSIZE);
imshow("bchannel(gray)",channels[2]);
namedWindow("CIELabimage(allchannels)",WINDOW_AUTOSIZE);
imshow("CIELabimage(allchannels)",image);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 193: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/193.jpg)
TheoriginalRGBimage,CIEL*a*b*conversion,andchannelsplitting
CIEL*u*v*TheCIEL*u*v*colorspaceisthefirstuniformcolorspacestandardizedbyCIE.Itisasimple-to-computetransformationoftheCIEXYZspaceandwhitereferencepoint,whichattemptsperceptualuniformity.LiketheCIEL*a*b*colorspace,itwascreatedtobedevice-independent.Thethreechannelsrepresentthelightnessofthecolor(L*)anditspositionbetweengreenandred(u*),andthelastonerepresentsmostlyblueandpurpletypecolors(v*).Thiscolormodelisusefulforadditivemixturesoflightsduetoitslinearadditionproperties.
ThecolorspaceconversioncodetoconvertbetweenRGBandCIEL*u*v*inOpenCVusingcvtColorisCOLOR_BGR2Luv,COLOR_RGB2Luv,COLOR_Luv2BGR,andCOLOR_Luv2RGB.Theprocedureusedtocomputethesetransformationscanbeseenathttp://docs.opencv.org/trunk/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor
Theexamplecode
ThefollowingCIELuvcolorexampleshowsyouhowtoconvertanRGBimagetotheCIEL*u*v*colorspace,splittingandshowingeachparticularchannelingrayscaleandtheCIEL*u*v*image.Theexamplecodeis:
![Page 194: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/194.jpg)
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
intmain(intargc,constchar**argv)
{
//Loadtheimage
Matimage=imread("Lovebird.jpg");
imshow("Picture",image);
//transformtoCIELuv
cvtColor(image,image,COLOR_BGR2Luv);
vector<Mat>channels;
split(image,channels);
//showchannelsingrayscale
namedWindow("Lchannel(gray)",WINDOW_AUTOSIZE);
imshow("Lchannel(gray)",channels[0]);
namedWindow("uchannel(gray)",WINDOW_AUTOSIZE);
imshow("uchannel(gray)",channels[1]);
namedWindow("vchannel(gray)",WINDOW_AUTOSIZE);
imshow("vchannel(gray)",channels[2]);
namedWindow("CIELuvimage(allchannels)",WINDOW_AUTOSIZE);
imshow("CIELuvimage(allchannels)",image);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 195: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/195.jpg)
OriginalRGBimage,CIEL*u*v*conversion,andchannelsplitting
BayerTheBayerpixel-spacecompositioniswidelyusedindigitalcameraswithonlyoneimagesensor.Unlikecameraswiththreesensors(oneperRGBchannel,whichisabletoobtainalltheinformationofaparticularcomponent),inonesensorcamera,everypixeliscoveredbyadifferentcolorfilter,soeachpixelisonlymeasuredinthiscolor.ThemissingcolorinformationisextrapolatedfromitsneighborsusingtheBayermethod.Itallowsyoutogetcompletecolorpicturesfromasingleplanewherethepixelsareinterleavedasfollows:
ABayerpatternexample
![Page 196: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/196.jpg)
NoteNotethattheBayerpatternisrepresentedbymoreGpixelsthanRandBbecausethehumaneyeismoresensitivetogreenfrequencies.
Thereareseveralmodificationsoftheshownpatternobtainedbyshiftingthepatternbyonepixelinanydirection.ThecolorspaceconversioncodetoconvertfromBayertoRGBinOpenCVisdefinedconsideringthecomponentsofthesecondandthirdcolumnsofthesecondrow(XandY,respectively)asCOLOR_BayerXY2BGR.Forexample,thepatternofthepreviouspicturehasa“BG”type,soitsconversioncodeisCOLOR_BayerBG2BGR.
Theexamplecode
ThefollowingBayerexampleshowsyouhowtoconvertapicturedefinedbyanRGBayerpatternobtainedfromanimagesensortoanRGBimage.Theexamplecodeis:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacecv;
intmain(intargc,constchar**argv)
{
//Showbayeredimageincolor
Matbayer_color=imread("Lovebird_bayer_color.jpg");
namedWindow("Bayerpictureincolor",WINDOW_AUTOSIZE);
imshow("Bayerpictureincolor",bayer_color);
//Loadbayeredimage
Matbayer=imread("Lovebird_bayer.jpg",CV_8UC3);
namedWindow("Bayerpicture",WINDOW_AUTOSIZE);
imshow("Bayerpicture",bayer);
MatimageColor;
cvtColor(bayer,imageColor,COLOR_BayerRG2BGR);
namedWindow("Colorpicture",WINDOW_AUTOSIZE);
imshow("Colorpicture",imageColor);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 197: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/197.jpg)
TheBayerpatternimageandRGBconversion
![Page 198: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/198.jpg)
![Page 199: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/199.jpg)
Color-space-basedsegmentationEachcolorspacerepresentsanimageindicatingthenumericvalueofthespecificcharacteristicmeasuredbyeachchanneloneachpixel.Consideringthesecharacteristics,itispossibletopartitionthecolorspaceusinglinearboundaries(forexample,planesinthree-dimensionalspacesandonespaceperchannel),allowingyoutoclassifyeachpixelaccordingtothepartitionitliesin,thereforeallowingyoutoselectasetofpixelswithpredefinedcharacteristics.Thisideacanbeusedtosegmentobjectsofanimageweareinterestedin.
OpenCVprovidesthevoidinRange(InputArraysrc,InputArraylowerb,InputArrayupperb,OutputArraydst)functiontocheckwhetheranarrayofelementsliebetweentheelementsoftwootherarrays.Withrespecttocolor-space-basedsegmentation,thisfunctionallowsyoutoobtainthesetofpixelsofansrcimage,thevaluesofwhosechannelsliebetweenthelowerblowerboundariesandupperbupperboundaries,obtainingthedstimage.
NoteThelowerbandupperbboundariesareusuallydefinedasScalar(x,y,z),wherex,y,andzarethenumericalvaluesofeachchanneldefinedaslowerorupperboundaries.
Thefollowingexamplesshowyouhowtodetectpixelsthatcanbeconsideredtobeskin.Ithasbeenobservedthatskincolordiffersmoreinintensitythanchrominance,sonormally,theluminancecomponentisnotconsideredforskindetection.ThisfactmakesitdifficulttodetectskininapicturerepresentedinRGBbecauseofthedependenceofthiscolorspaceonluminance,soHSVandYCrCbcolormodelsareused.Itisworthnotingthatforthistypeofsegmentation,itisnecessarytoknoworobtainthevaluesoftheboundariesperchannel.
![Page 200: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/200.jpg)
HSVsegmentationAsstatedpreviously,HSViswidelyusedtomakeacomparisonofcolorsbecauseHisalmostindependentoflightvariations,soitisusefulinskindetection.Inthisexample,thelowerboundaries(0,10,60)andtheupperboundaries(20,150,255)areselectedtodetecttheskinineachpixel.Theexamplecodeis:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
intmain()
{
//Loadtheimage
Matimage=imread("hand.jpg");
namedWindow("Picture",WINDOW_AUTOSIZE);
imshow("Picture",image);
Mathsv;
cvtColor(image,hsv,COLOR_BGR2HSV);
//selectpixels
Matbw;
inRange(hsv,Scalar(0,10,60),Scalar(20,150,255),bw);
namedWindow("Selectedpixels",WINDOW_AUTOSIZE);
imshow("Selectedpixels",bw);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 201: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/201.jpg)
SkindetectionusingtheHSVcolorspace
![Page 202: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/202.jpg)
YCrCbsegmentationTheYCrCbcolorspacereducestheredundancyofRGBcolorchannelsandrepresentsthecolorwithindependentcomponents.Consideringthattheluminanceandchrominancecomponentsareseparated,thisspaceisagoodchoiceforskindetection.
ThefollowingexampleusestheYCrCbcolorspaceforskindetectionusingthelowerboundaries(0,133,77)andtheupperboundaries(255,173,177)ineachpixel.Theexamplecodeis:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
intmain()
{
//Loadtheimage
Matimage=imread("hand.jpg");
namedWindow("Picture",WINDOW_AUTOSIZE);
imshow("Picture",image);
Matycrcb;
cvtColor(image,ycrcb,COLOR_BGR2HSV);
//selectpixels
Matbw;
inRange(ycrcb,Scalar(0,133,77),Scalar(255,173,177),bw);
namedWindow("Selectedpixels",WINDOW_AUTOSIZE);
imshow("Selectedpixels",bw);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
![Page 203: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/203.jpg)
SkindetectionusingtheYCrCbcolorspace
NoteFormoreimage-segmentationmethods,refertoChapter4ofOpenCVEssentialsbyPacktPublishing.
![Page 204: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/204.jpg)
![Page 205: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/205.jpg)
ColortransferAnothertaskcommonlycarriedoutinimageprocessingistomodifythecolorofanimage,specificallyincaseswhereitisnecessarytoremoveadominantorundesirablecolorcast.Oneofthesemethodsiscalledcolortransfer,whichcarriesoutasetofcolorcorrectionsthatborrowonesourceimage’scolorcharacteristics,andtransfertheappearanceofthesourceimagetothetargetimage.
![Page 206: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/206.jpg)
TheexamplecodeThefollowingcolorTransferexampleshowsyouhowtotransferthecolorfromasourcetotargetimage.ThismethodfirstconvertstheimagecolorspacetoCIEL*a*b*.Next,itsplitsthechannelsforsourceandtargetimages.Afterthat,itfitsthechanneldistributionfromoneimagetoanotherusingthemeanandthestandarddeviation.Finally,thechannelsaremergedbacktogetherandconvertedtoRGB.
NoteForfulltheoreticaldetailsofthetransformationusedintheexample,refertoColorTransferbetweenImagesathttp://www.cs.tau.ac.il/~turkel/imagepapers/ColorTransfer.pdf.
ThefirstpartofthecodeconvertstheimagetotheCIEL*a*b*colorspace,whilealsochangingthetypeoftheimagetoCV_32FC1:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespacecv;
intmain(intargc,constchar**argv)
{
//Loadtheimages
Matsrc=imread("clock_tower.jpg");
Mattar=imread("big_ben.jpg");
//ConverttoLabspaceandCV_32F1
Matsrc_lab,tar_lab;
cvtColor(src,src_lab,COLOR_BGR2Lab);
cvtColor(tar,tar_lab,COLOR_BGR2Lab);
src_lab.convertTo(src_lab,CV_32FC1);
tar_lab.convertTo(tar_lab,CV_32FC1);
Thenextpartofthecodeperformsthecolortransferasstatedpreviously:
//Findmeanandstdofeachchannelforeachimage
Matmean_src,mean_tar,stdd_src,stdd_tar;
meanStdDev(src_lab,mean_src,stdd_src);
meanStdDev(tar_lab,mean_tar,stdd_src);
//Splitintoindividualchannels
vector<Mat>src_chan,tar_chan;
split(src_lab,src_chan);
split(tar_lab,tar_chan);
//Foreachchannelcalculatethecolordistribution
for(inti=0;i<3;i++){
tar_chan[i]-=mean_tar.at<double>(i);
![Page 207: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/207.jpg)
tar_chan[i]*=(stdd_src.at<double>(i)/stdd_src.at<double>(i));
tar_chan[i]+=mean_src.at<double>(i);
}
//Mergethechannels,converttoCV_8UC1eachchannelandconvertto
BGR
Matoutput;
merge(tar_chan,output);
output.convertTo(output,CV_8UC1);
cvtColor(output,output,COLOR_Lab2BGR);
//showpictures
namedWindow("Sourceimage",WINDOW_AUTOSIZE);
imshow("Sourceimage",src);
namedWindow("Targetimage",WINDOW_AUTOSIZE);
imshow("Targetimage",tar);
namedWindow("Resultimage",WINDOW_AUTOSIZE);
imshow("Resultimage",output);
waitKey(0);
return0;
}
Thefollowingfigureshowsyoutheoutputofthecode:
Anightappearancecolor-transferexample
![Page 208: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/208.jpg)
![Page 209: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/209.jpg)
SummaryInthischapter,weprovidedadeeperviewofthecolorspacesusedinOpenCVandshowedyouhowtoconvertbetweenthemusingthecvtColorfunction.Furthermore,thepossibilitiesofimageprocessingusingdifferentcolormodelsandtheimportanceofselectingthecorrectcolorspaceconsideringtheoperationsweneedtomakewashighlighted.Tothisend,color-space-basedsegmentationandcolor-transfermethodswereimplemented.
Thenextchapterwillcoverimage-processingtechniquesusedforvideoorasequenceofimages.Wewillseehowtoimplementvideostabilization,superresolution,andstitchingalgorithmswithOpenCV.
![Page 210: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/210.jpg)
![Page 211: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/211.jpg)
Chapter5.ImageProcessingforVideoThischaptershowsyoudifferenttechniquesrelatedtoimageprocessingforvideo.Whilemostclassicalimageprocessingdealswithstaticimages,video-basedprocessingisbecomingpopularandaffordable.
Thischaptercoversthefollowingtopics:
VideostabilizationThevideosuperresolutionprocessImagestitching
Inthischapter,wewillworkwithavideosequenceoralivecameradirectly.Theoutputofimageprocessingmaybeeitherasetofmodifiedimagesorusefulhigh-levelinformation.Mostimage-processingtechniquesconsiderimagesasatwo-dimensionaldigitalsignalandapplydifferenttechniquestoit.Inthischapter,asequenceofimagesfromavideoorlivecamerawillbeusedtomakeorimproveanewenhancedsequencewithdifferenthigh-leveltechniques.Thus,moreusefulinformationisobtained,thatis,athirdtimedimensionisincorporated.
![Page 212: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/212.jpg)
VideostabilizationVideostabilizationreferstoafamilyofmethodsusedtoreducetheblurringassociatedwiththemotionofthecamera.Inotherwords,itcompensatesforanyangularmovement,equivalenttoyaw,pitch,roll,andxandytranslationsofthecamera.Thefirstimagestabilizersappearedintheearly60s.Thesesystemswereabletoslightlycompensateforcamerashakesandinvoluntarymovements.Theywerecontrolledbygyroscopesandaccelerometersbasedonmechanismsthatcouldcancelorreduceunwantedmovementbychangingthepositionofalens.Currently,thesemethodsarewidelyusedinbinoculars,videocameras,andtelescopes.
Therearevariousmethodsforimageorvideostabilization,andthischapterfocusesonthemostextendedfamiliesofmethods:
Mechanicalstabilizationsystems:Thesesystemsuseamechanicalsystemonthecameralenssothatwhenthecameraismoved,motionisdetectedbyaccelerometersandgyroscopes,andthesystemgeneratesamovementonthelens.Thesesystemswillnotbeconsideredhere.Digitalstabilizationsystems:Thesearenormallyusedinvideoandtheyactdirectlyontheimageobtainedfromthecamera.Inthesesystems,thesurfaceofthestabilizedimageisslightlysmallerthanthesourceimage’ssurface.Whenthecameraismoved,thecapturedimageismovedtocompensatethismovement.Althoughthesetechniqueseffectivelyworktocancelmovementbyreducingtheusableareaofmovementsensor,resolutionandimageclarityaresacrificed.
Video-stabilizationalgorithmsusuallyencompassthefollowingsteps:
GeneralstepsofVideo-Stabilizationalgorithms
ThischapterfocusesonthevideostabmoduleinOpenCV3.0Alpha,whichcontainsasetoffunctionsandclassesthatcanbeusedtosolvethevideo-stabilizationproblem.
Let’sexplorethegeneralprocessinmoredetail.Videostabilizationisachievedbyafirstestimationoftheinter-framemotionbetweenconsecutiveframesusingtheRANSACmethod.Attheendofthisstep,anarrayof3x3matricesisobtained,andeachofthemdescribesthemotionofthetwopairsofconsecutiveframes.Globalmotionestimationisveryimportantforthisstepanditaffectstheaccuracyofthestabilizedfinalsequence.
Note
![Page 213: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/213.jpg)
YoucanfindmoredetailedinformationabouttheRANSACmethodathttp://en.wikipedia.org/wiki/RANSAC.
Thesecondstepgeneratesanewsequenceofframesbasedontheestimatedmotion.Additionalprocessingisperformed,suchassmoothing,deblurring,borderextrapolation,andsoon,toimprovethequalityofstabilization.
Thethirdstepremovestheannoyingirregularperturbations—refertothefollowingfigure.Thereareapproachesthatassumeacamera-motionmodel,whichworkwellwhensomeassumptionscanbemadeabouttheactualcameramotion.
Removingtheirregularperturbations
IntheOpenCVexamples([opencv_source_code]/samples/cpp/videostab.cpp),avideo-stabilizationprogramexamplecanbefound.ForthefollowingvideoStabilizerexample,thevideoStabilizer.proprojectneedstheselibraries:lopencv_core300,lopencv_highgui300,lopencv_features2d300,lopencv_videoio300,andlopencv_videostab300.
ThefollowingvideoStabilizerexamplehasbeencreatedusingthevideostabmoduleofOpenCV3.0Alpha:
#include<string>
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/videostab.hpp>
usingnamespacestd;
usingnamespacecv;
usingnamespacecv::videostab;
voidprocessing(Ptr<IFrameSource>stabilizedFrames,stringoutputPath);
intmain(intargc,constchar**argv)
{
Ptr<IFrameSource>stabilizedFrames;
try
{
![Page 214: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/214.jpg)
//1-Preparetheinputvideoandcheckit
stringinputPath;
stringoutputPath;
if(argc>1)
inputPath=argv[1];
else
inputPath=".\\cube4.avi";
if(argc>2)
outputPath=argv[2];
else
outputPath=".\\cube4_stabilized.avi";
Ptr<VideoFileSource>source=makePtr<VideoFileSource>(inputPath);
cout<<"framecount(rough):"<<source->count()<<endl;
//2-Preparethemotionestimator
//first,preparethemotiontheestimationbuilder,RANSACL2
doublemin_inlier_ratio=0.1;
Ptr<MotionEstimatorRansacL2>est=makePtr<MotionEstimatorRansacL2>
(MM_AFFINE);
RansacParamsransac=est->ransacParams();
ransac.size=3;
ransac.thresh=5;
ransac.eps=0.5;
est->setRansacParams(ransac);
est->setMinInlierRatio(min_inlier_ratio);
//second,createafeaturedetector
intnkps=1000;
Ptr<GoodFeaturesToTrackDetector>feature_detector=
makePtr<GoodFeaturesToTrackDetector>(nkps);
//third,createthemotionestimator
Ptr<KeypointBasedMotionEstimator>motionEstBuilder=
makePtr<KeypointBasedMotionEstimator>(est);
motionEstBuilder->setDetector(feature_detector);
Ptr<IOutlierRejector>outlierRejector=makePtr<NullOutlierRejector>();
motionEstBuilder->setOutlierRejector(outlierRejector);
//3-Preparethestabilizer
StabilizerBase*stabilizer=0;
//first,preparetheoneortwopassstabilizer
boolisTwoPass=1;
intradius_pass=15;
if(isTwoPass)
{
//withatwopassstabilizer
boolest_trim=true;
TwoPassStabilizer*twoPassStabilizer=newTwoPassStabilizer();
twoPassStabilizer->setEstimateTrimRatio(est_trim);
twoPassStabilizer-
>setMotionStabilizer(makePtr<GaussianMotionFilter>(radius_pass));
![Page 215: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/215.jpg)
stabilizer=twoPassStabilizer;
}
else
{
//withanonepassstabilizer
OnePassStabilizer*onePassStabilizer=newOnePassStabilizer();
onePassStabilizer-
>setMotionFilter(makePtr<GaussianMotionFilter>(radius_pass));
stabilizer=onePassStabilizer;
}
//second,setuptheparameters
intradius=15;
doubletrim_ratio=0.1;
boolincl_constr=false;
stabilizer->setFrameSource(source);
stabilizer->setMotionEstimator(motionEstBuilder);
stabilizer->setRadius(radius);
stabilizer->setTrimRatio(trim_ratio);
stabilizer->setCorrectionForInclusion(incl_constr);
stabilizer->setBorderMode(BORDER_REPLICATE);
//caststabilizertosimpleframesourceinterfacetoread
stabilizedframes
stabilizedFrames.reset(dynamic_cast<IFrameSource*>(stabilizer));
//4-Processingthestabilizedframes.Theresultsareshowedandsaved.
processing(stabilizedFrames,outputPath);
}
catch(constexception&e)
{
cout<<"error:"<<e.what()<<endl;
stabilizedFrames.release();
return-1;
}
stabilizedFrames.release();
return0;
}
voidprocessing(Ptr<IFrameSource>stabilizedFrames,stringoutputPath)
{
VideoWriterwriter;
MatstabilizedFrame;
intnframes=0;
doubleoutputFps=25;
//foreachstabilizedframe
while(!(stabilizedFrame=stabilizedFrames->nextFrame()).empty())
{
nframes++;
//initwriter(once)andsavestabilizedframe
if(!outputPath.empty())
![Page 216: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/216.jpg)
{
if(!writer.isOpened())
writer.open(outputPath,VideoWriter::fourcc('X','V','I','D'),
outputFps,stabilizedFrame.size());
writer<<stabilizedFrame;
}
imshow("stabilizedFrame",stabilizedFrame);
charkey=static_cast<char>(waitKey(3));
if(key==27){cout<<endl;break;}
}
cout<<"processedframes:"<<nframes<<endl;
cout<<"finished"<<endl;
}
Thisexampleacceptsthenameofaninputvideofileasadefaultvideofilename(.\cube4.avi).Theresultingvideowillbedisplayedandthensavedas.\cube4_stabilized.avi.Notehowthevideostab.hppheaderisincludedandthecv::videostabnamespaceisused.Theexampletakesfourimportantsteps.Thefirststeppreparestheinputvideopath,andthisexampleusesthestandardcommand-lineinputarguments(inputPath=argv[1])toselectthevideofile.Ifitdoesnothaveaninputvideofile,thenitusesthedefaultvideofile(.\cube4.avi).
Thesecondstepbuildsamotionestimator.ArobustRANSAC-basedglobal2Dmethodiscreatedforthemotionestimatorusingasmartpointer(Ptr<object>)ofOpenCV(Ptr<MotionEstimatorRansacL2>est=makePtr<MotionEstimatorRansacL2>(MM_AFFINE)).Therearedifferentmotionmodelstostabilizethevideo:
MM_TRANSLATION=0MM_TRANSLATION_AND_SCALE=1MM_ROTATIO=2MM_RIGID=3MM_SIMILARITY=4MM_AFFINE=5MM_HOMOGRAPHY=6MM_UNKNOWN=7
Thereisatrade-offbetweenaccuracytostabilizethevideoandcomputationaltime.Themorebasicmotionmodelshaveworseaccuracyandbettercomputationaltime;however,themorecomplexmodelshavebetteraccuracyandworsecomputationaltime.
TheRANSACobjectisnowcreated(RansacParamsransac=est->ransacParams())andtheirparametersareset(ransac.size,ransac.threshandransac.eps).Afeaturedetectorisalsoneededtoestimatethemovementbetweeneachconsecutiveframethatwillbeusedbythestabilizer.ThisexampleusestheGoodFeaturesToTrackDetectormethodtodetect(nkps=1000)salientfeaturesineachframe.Then,itusestherobustRANSACandfeature-detectormethodstocreatethemotionestimatorusingthePtr<KeypointBasedMotionEstimator>motionEstBuilder=
makePtr<KeypointBasedMotionEstimator>(est)classandsettingthefeaturedetector
![Page 217: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/217.jpg)
withmotionEstBuilder->setDetector(feature_detector).
RANSACparameters
Size Thesubsetsize
Thresh Themaximumerrortoclassifyasinliers
Eps Themaximumoutliersratio
Prob Theprobabilityofsuccess
Thethirdstepcreatesastabilizerthatneedsthepreviousmotionestimator.Youcanselect(isTwoPass=1)aone-ortwo-passstabilizer.Ifyouusethetwo-passstabilizer(TwoPassStabilizer*twoPassStabilizer=newTwoPassStabilizer()),theresultsareusuallybetter.However,inthisexample,thisiscomputationallyslower.Ifyouusetheotheroption,one-passstabilizer(OnePassStabilizer*onePassStabilizer=newOnePassStabilizer()),theresultsareworsebuttheresponseisfaster.Thestabilizerneedstosetotheroptionstoworkcorrectly,suchasthesourcevideofile(stabilizer->setFrameSource(source))andthemotionestimator(stabilizer->setMotionEstimator(motionEstBuilder)).Italsoneedstocastthestabilizertosimpleframesourcevideotoreadstabilizedframes(stabilizedFrames.reset(dynamic_cast<IFrameSource*>(stabilizer))).
Thelaststepstabilizesthevideousingthecreatedstabilizer.Theprocessing(Ptr<IFrameSource>stabilizedFrames)functioniscreatedtoprocessandstabilizeeachframe.Thisfunctionneedstointroduceapathtosavetheresultingvideo(stringoutputPath=".//stabilizedVideo.avi")andsettheplaybackspeed(doubleoutputFps=25).Afterwards,thisfunctioncalculateseachstabilizedframeuntiltherearenomoreframes(stabilizedFrame=stabilizedFrames->nextFrame().empty()).Internally,thestabilizerfirstestimatesthemotionofeveryframe.Thisfunctioncreatesavideowriter(writer.open(outputPath,VideoWriter::fourcc('X','V','I','D'),outputFps,stabilizedFrame.size()))tostoreeachframeintheXVIDformat.Finally,itsavesandshowseachstabilizedframeuntiltheuserpressestheEsckey.
TodemonstratehowtostabilizeavideowithOpenCV,thepreviousvideoStabilizerexampleisused.Theexampleisexecutedfromthecommandlineasfollows:
<bin_dir>\videoStabilizer.exe.\cube4.avi.\cube4_stabilized.avi
NoteThiscube4.avivideocanbefoundintheOpenCVsamplesfolder.Italsohasagreatdealofcameramovement,whichisperfectforthisexample.
Toshowthestabilizationresults,first,seefourframesofcube4.aviinthefollowingfigure.Thefigurefollowingtheseframesshowsthefirst10framesofcube4.aviandcube4_stabilized.avisuperimposedwithout(left-handsideofthefigure)andwith(right-handsideofthefigure)stabilization.
![Page 218: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/218.jpg)
Thefourconsecutiveframesofcube4.avivideothatarecameramovements
10superimposedframesofcube4.aviandcube4_stabilizatedvideoswithoutandwithstabilization
Lookingattheprecedingfigure,ontheright-handside,youcanseethatthevibrationsproducedbythecameramovementhavebeenreducedduetothestabilization.
![Page 219: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/219.jpg)
![Page 220: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/220.jpg)
SuperresolutionSuperresolutionreferstothetechniquesoralgorithmsdesignedtoincreasethespatialresolutionofanimageorvideo,usuallyfromasequenceofimagesoflowerresolution.Itdiffersfromthetraditionaltechniquesofimagescaling,whichuseasingleimagetoincreasetheresolution,keepingthesharpedges.Incontrast,superresolutionmergesinformationfrommultipleimagestakenfromthesamescenetorepresentdetailsthatwerenotinitiallycapturedintheoriginalimages.
Theprocessofcapturinganimageorvideofromareal-lifescenerequiresthefollowingsteps:
Sampling:ThisisthetransformationofthecontinuoussystemfromthesceneofanidealdiscretesystemwithoutaliasingGeometrictransformation:Thisreferstoapplyingasetoftransformations,suchastranslationorrotation,duetothecamerapositionandlenssystemtoinfer,ideally,detailsofthescenethatarriveateachsensorBlur:ThishappensduetothelenssystemortheexistingmotioninthesceneduringtheintegrationtimeSubsampling:Withthis,thesensoronlyintegratesthenumberofpixelsatitsdisposal(photosites)
Youcanseethisprocessofimagecapturinginthefollowingfigure:
Theprocessofcapturinganimagefromarealscene
Duringthiscaptureprocess,thedetailsofthesceneareintegratedbydifferentsensorssothateachpixelineachcaptureincludesdifferentinformation.Therefore,superresolutionisbasedontryingtofindtherelationshipbetweendifferentcapturesthathaveobtaineddifferentdetailsofthesceneinordertocreateanewimagewithmoreinformation.Superresolutionis,therefore,usedtoregenerateadiscretizedscenewithahigherresolution.
Superresolutioncanbeobtainedbyvarioustechniques,rangingfromthemostintuitivein
![Page 221: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/221.jpg)
thespatialdomaintotechniquesbasedonanalyzingthefrequencyspectrum.Techniquesarebasicallydividedintooptical(usinglenses,zoom,andsoon)orimage-processing-basedtechniques.Thischapterfocusesonimage-processing-basedsuperresolution.Thesemethodsuseotherpartsofthelower-resolutionimages,orotherunrelatedimages,toinferwhatthehigh-resolutionimageshouldlooklike.Thesealgorithmscanbealsodividedintothefrequencyorspatialdomain.Originally,superresolutionmethodsonlyworkedwellongrayscaleimages,butnewmethodshavebeendevelopedtoadaptthemtocolorimages.
Ingeneral,superresolutioniscomputationallydemanding,bothspatiallyandtemporally,becausethesizeoflow-resolutionandhigh-resolutionimagesishighandhundredsofsecondsmaybeneededtogenerateanimage.Totrytoreducethecomputationaltime,preconditionersareusedcurrentlyforoptimizersthatareresponsibleforminimizingthesefunctions.AnotheralternativeistouseGPUprocessingtoimprovethecomputationaltimebecausethesuperresolutionprocessisinherentlyparallelizable.
ThischapterfocusesonthesuperresmoduleinOpenCV3.0Alpha,whichcontainsasetoffunctionsandclassesthatcanbeusedtosolvetheproblemofresolutionenhancement.Themoduleimplementsanumberofmethodsbasedonimage-processingsuperresolution.ThischapterspecificallyfocusesontheBilateralTV-L1(BTVL1)superresolutionmethodimplemented.Amajordifficultyofthesuperresolutionprocessistoestimatethewarpingfunctiontobuildthesuperresolutionimage.TheBilateralTV-L1usesopticalflowtoestimatethewarpingfunction.
NoteYoucanfindmoredetailedinformationabouttheBilateralTV-Lmethodathttp://www.ipol.im/pub/art/2013/26/andopticalflowathttp://en.wikipedia.org/wiki/Optical_flow.
IntheOpenCVexamples([opencv_source_code]/samples/gpu/super_resolution.cpp),abasicexampleofsuperresolutioncanbefound.
NoteYoucanalsodownloadthisexamplefromtheOpenCVGitHubrepositoryathttps://github.com/Itseez/opencv/blob/master/samples/gpu/super_resolution.cpp.
Forthefollowingsuperresolutionexampleproject,thesuperresolution.proprojectfileshallincludetheselibraries:lopencv_core300,lopencv_imgproc300,lopencv_highgui300,lopencv_features2d300,lopencv_videoio300,andlopencv_superres300toworkcorrectly:
#include<iostream>
#include<iomanip>
#include<string>
#include<opencv2/core.hpp>
#include<opencv2/core/utility.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
![Page 222: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/222.jpg)
#include<opencv2/superres.hpp>
#include<opencv2/superres/optical_flow.hpp>
#include<opencv2/opencv_modules.hpp>
usingnamespacestd;
usingnamespacecv;
usingnamespacecv::superres;
staticPtr<DenseOpticalFlowExt>createOptFlow(stringname);
intmain(intargc,char*argv[])
{
//1-Initializetheinitialparameters
//Inputandoutputvideo
stringinputVideoName;
stringoutputVideoName;
if(argc>1)
inputVideoName=argv[1];
else
inputVideoName=".\\tree.avi";
if(argc>2)
outputVideoName=argv[2];
else
outputVideoName=".\\tree_superresolution.avi";
constintscale=4;//Scalefactor
constintiterations=180;//Iterationscount
constinttemporalAreaRadius=4;//Radiusofthetemporalsearcharea
stringoptFlow="farneback";//Opticalflowalgorithm
//optFlow="farneback";
//optFlow="tvl1";
//optFlow="brox";
//optFlow="pyrlk";
doubleoutputFps=25.0;//Playbackspeedoutput
//2-Createanopticalflowmethod
Ptr<DenseOpticalFlowExt>optical_flow=createOptFlow(optFlow);
if(optical_flow.empty())return-1;
//3-Createthesuperresolutionmethodandsetitsparameters
Ptr<SuperResolution>superRes;
superRes=createSuperResolution_BTVL1();
superRes->set("opticalFlow",optical_flow);
superRes->set("scale",scale);
superRes->set("iterations",iterations);
superRes->set("temporalAreaRadius",temporalAreaRadius);
Ptr<FrameSource>frameSource;
![Page 223: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/223.jpg)
frameSource=createFrameSource_Video(inputVideoName);
superRes->setInput(frameSource);
//Notusethefirstframe
Matframe;
frameSource->nextFrame(frame);
//4-Processingtheinputvideowiththesuperresolution
//Showtheinitialoptions
cout<<"Input:"<<inputVideoName<<""<<
frame.size()<<endl;
cout<<"Output:"<<outputVideoName<<endl;
cout<<"Playbackspeedoutput:"<<outputFps<<endl;
cout<<"Scalefactor:"<<scale<<endl;
cout<<"Iterations:"<<iterations<<endl;
cout<<"Temporalradius:"<<temporalAreaRadius<<endl;
cout<<"OpticalFlow:"<<optFlow<<endl;
cout<<endl;
VideoWriterwriter;
doublestart_time,finish_time;
for(inti=0;;++i)
{
cout<<'['<<setw(3)<<i<<"]:";
Matresult;
//Calculatetheprocessingtime
start_time=getTickCount();
superRes->nextFrame(result);
finish_time=getTickCount();
cout<<(finish_time-start_time)/getTickFrequency()<<"secs,
Size:"<<result.size()<<endl;
if(result.empty())break;
//Showtheresult
imshow("SuperResolution",result);
if(waitKey(1000)>0)break;
//Savetheresultonoutputfile
if(!outputVideoName.empty())
{
if(!writer.isOpened())
writer.open(outputVideoName,VideoWriter::fourcc('X','V',
'I','D'),outputFps,result.size());
writer<<result;
}
}
writer.release();
return0;
}
staticPtr<DenseOpticalFlowExt>createOptFlow(stringname)
![Page 224: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/224.jpg)
{
if(name=="farneback")
returncreateOptFlow_Farneback();
elseif(name=="tvl1")
returncreateOptFlow_DualTVL1();
elseif(name=="brox")
returncreateOptFlow_Brox_CUDA();
elseif(name=="pyrlk")
returncreateOptFlow_PyrLK_CUDA();
else
cerr<<"IncorrectOpticalFlowalgorithm-"<<name<<endl;
returnPtr<DenseOpticalFlowExt>();
}
Thisexamplecreatesaprogram(superresolution)toobtainvideoswithsuperresolution.Ittakesthepathofaninputvideoorusesadefaultvideopath(.\tree.avi).Theresultingvideoisdisplayedandsavedas.\tree_superresolution.avi.Inthefirstplace,thesuperres.hppandsuperres/optical_flow.hppheadersareincludedandthecv::superresnamespaceisused.Theexamplefollowsfourimportantsteps.
Thefirststepsetstheinitialparameters.Itistheinputvideopaththatusesthestandardinput(inputVideoName=argv[1])toselectthevideofile,andifitdoesnothaveaninputvideofile,thenitusesadefaultvideofile.Theoutputvideopathalsousestheinputstandard(outputVideoName=argv[2])toselecttheoutputvideofile,andifitdoesnothaveanoutputvideofile,thenitusesthedefaultoutputvideofile(.\tree_superresolution)andtheoutputplaybackspeedisalsoset(doubleoutputFps=25.0).Otherimportantparametersofthesuperresolutionmethodarethescalefactor(constintscale=4),theiterationcount(constintiterations=100),theradiusofthetemporalsearcharea(constinttemporalAreaRadius=4),andtheoptical-flowalgorithm(stringoptFlow="farneback").
Thesecondstepcreatesanoptical-flowmethodtodetectsalientfeaturesandtrackthemforeachvideoframe.Anewmethod(staticPtr<DenseOpticalFlowExt>createOptFlow(stringname))hasbeencreatedtoselectbetweenthedifferentoptical-flowmethods.Youcanselectbetweenfarneback,tvl1,brox,andpyrlkoptical-flowmethods.Anewmethod(staticPtr<DenseOpticalFlowExt>createOptFlow(stringname))iswrittentocreateanoptical;-flowmethodtotrackfeatures.ThetwomostimportantmethodsareFarneback(createOptFlow_Farneback())andTV-L1(createOptFlow_DualTVL1()).ThefirstmethodisbasedonGunnerFarneback’salgorithmthatcomputestheopticalflowforallpointsintheframe.ThesecondmethodcalculatestheopticalflowbetweentwoimageframesthatarebasedondualformulationontheTVenergyandemploysanefficientpoint-wisethresholdingstep.Thissecondmethodiscomputationallymoreefficient.
Comparisonbetweenthedifferentopticalflowmethods
![Page 225: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/225.jpg)
Method Complexity Parallelizable
Farneback Quadratic No
TV-L1 Lineal Yes
Brox Lineal Yes
PyrLK Lineal No
NoteYoucanalsolearnmoreabouttheFarnebackoptical-flowmethodusedathttp://www.diva-portal.org/smash/get/diva2:273847/FULLTEXT01.pdf.
Thethirdstepcreatesandsetsthesuperresolutionmethod.Aninstanceofthismethodiscreated(Ptr<SuperResolution>superRes),whichusestheBilateralTV-L1algorithm(superRes=createSuperResolution_BTVL1()).Thismethodhasthefollowingparametersforthealgorithm:
scale:Thisisthescalefactoriterations:Thisistheiterationcounttau:Thisisanasymptoticvalueofthesteepestdescentmethodlambda:Thisistheweightparametertobalancethedatatermandsmoothnesstermalpha:ThisisaparameterofspatialdistributioninBilateral-TVbtvKernelSize:ThisisthekernelsizeoftheBilateral-TVfilterblurKernelSize:ThisistheGaussianblurkernelsizeblurSigma:ThisistheGaussianblursigmatemporalAreaRadius:ThisistheradiusofthetemporalsearchareaopticalFlow:Thisisadenseoptical-flowalgorithm
Theseparametersaresetasfollows:
superRes->set("parameter",value);
Onlythefollowingparametersareset;theotherparametersusetheirdefaultvalues:
superRes->set("opticalFlow",optical_flow);
superRes->set("scale",scale);
superRes->set("iterations",iterations);
superRes->set("temporalAreaRadius",temporalAreaRadius);
Afterwards,theinputvideoframeisselected(superRes->setInput(frameSource)).
Thelaststepprocessestheinputvideotocomputethesuperresolution.Foreachvideoframe,thesuperresolutioniscalculated(superRes->nextFrame(result));thiscalculationiscomputationallyveryslow,thustheprocessingtimeisestimatedtoshowprogress.Finally,eachresultframeisshown(imshow("SuperResolution",result))andsaved(writer<<result).
Toshowthesuperresolutionresults,asmallpartofthefirstframeofthetree.aviandtree_superresolution.avivideosarecomparedwithandwithoutsuperresolution:
![Page 226: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/226.jpg)
Partofthefirstframeoftree.aviandtree_superresolution.avivideoswithoutandwiththesuperresolutionprocess
Intheright-hand-sidesectionoftheprecedingfigure,youcanobservemoredetailsintheleavesandbranchesofthetreeduetothesuperresolutionprocess.
![Page 227: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/227.jpg)
![Page 228: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/228.jpg)
StitchingImagestitching,orphotostitching,candiscoverthecorrespondencerelationshipbetweenimageswithsomedegreeofoverlap.Thisprocesscombinesasetofimageswithoverlappingfieldsofviewtoproduceapanoramaorhigher-resolutionimage.Mostofthetechniquesforimagestitchingneednearlyexactoverlapsbetweentheimagestoproduceseamlessresults.Somedigitalcamerascaninternallystitchasetofimagestobuildapanoramaimage.Anexampleisshowninthefollowingfigure:
Apanoramaimagecreatedwithstitching
NoteTheprecedingimageexampleandmoreinformationaboutimagestitchingcanbefoundathttp://en.wikipedia.org/wiki/Image_stitching.
Stitchingcannormallybedividedintothreeimportantsteps:
Registration(images)impliesmatchingfeaturesinasetofimagestosearchforadisplacementthatminimizesthesumofabsolutevaluesinthedifferencesbetweenoverlappingpixels.Direct-alignmentmethodscouldbeusedtogetbetterresults.Theusercouldalsoaddaroughmodelofthepanoramatohelpthefeaturematchingstage,inwhichcase,theresultsaretypicallymoreaccurateandcomputationallyfaster.Calibration(images)focusesonminimizingdifferencesbetweenanidealmodelandthecamera-lenssystem:differentcamerapositionsandopticaldefectssuchasdistortions,exposure,chromaticaberrations,andsoon.Compositing(images)usestheresultsofthepreviousstep,calibration,combinedwiththeremappingoftheimagestoanoutputprojection.Colorsarealsoadjustedbetweenimagestocompensateforexposuredifferences.Imagesareblendedtogetherandseam-lineadjustmentisdonetominimizethevisibilityofseamsbetweenimages.
Whenthereareimagesegmentsthathavebeentakenfromthesamepointinspace,stitchingcanbeperformedusingoneofvariousmapprojections.Themostimportantmapprojectionsareshownasfollows:
Rectilinearprojection:Here,thestitchingimageisviewedonatwo-dimensionalplaneintersectingthepanoramasphereinasinglepoint.Linesthatarestraightin
![Page 229: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/229.jpg)
realityareshownsimilarregardlessoftheirdirectionontheimage.Whentherearewideviews(around120degrees),imagesaredistortedneartheborders.Cylindricalprojection:Here,thestitchingimageshowsa360-degreehorizontalfieldofviewandalimitedverticalfieldofview.Thisprojectionismeanttobeviewedasthoughtheimageiswrappedintoacylinderandviewedfromwithin.Whenviewedona2Dplane,horizontallinesappearcurved,whileverticallinesremainstraight.Sphericalprojection:Here,thestitchingimageshowsa360-degreehorizontalfieldofviewand180-degreeverticalfieldofview,thatis,thewholesphere.Panoramaimageswiththisprojectionaremeanttobeviewedasthoughtheimageiswrappedintoasphereandviewedfromwithin.Whenviewedona2Dplane,horizontallinesappearcurvedasinacylindricalprojection,whileverticallinesremainvertical.Stereographicprojectionorfisheyeprojection:Thiscanbeusedtoformalittleplanetpanoramabypointingthevirtualcamerastraightdownandsettingthefieldofviewlargeenoughtoshowthewholegroundandsomeoftheareasaboveit;pointingthevirtualcameraupwardscreatesatunneleffect.Paniniprojection:Thishasspecializedprojectionsthatmayhavemoreaestheticallypleasingadvantagesovernormalcartographyprojections.Thisprojectioncombinesdifferentprojectionsinthesameimagetofine-tunethefinallookoftheoutputpanoramaimage.
ThischapterfocusesonthestitchingmoduleandthedetailsubmoduleinOpenCV3.0Alpha,whichcontainsasetoffunctionsandclassesthatimplementastitcher.Usingthesemodules,itispossibletoconfigureorskipsomesteps.Theimplementedstitchingexamplehasthefollowinggeneraldiagram:
![Page 230: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/230.jpg)
IntheOpenCVexamples,therearetwobasicexamplesofstitching,whichcanbefoundat([opencv_source_code]/samples/cpp/stitching.cpp])and([opencv_source_code]/samples/cpp/stitching_detailed.cpp]).
Forthefollowing,moreadvancedstitchingAdvancedexample,thestitchingAdvanced.proprojectfilemustincludethefollowinglibrariestoworkcorrectly:lopencv_core300,lopencv_imgproc300,lopencv_highgui300,lopencv_features2d300,lopencv_videoio300,lopencv_imgcodecs300,andlopencv_stitching300:
#include<iostream>
#include<string>
#include<opencv2/opencv_modules.hpp>
#include<opencv2/core/utility.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/features2d.hpp>
#include<opencv2/stitching/detail/blenders.hpp>
#include<opencv2/stitching/detail/camera.hpp>
#include<opencv2/stitching/detail/exposure_compensate.hpp>
#include<opencv2/stitching/detail/matchers.hpp>
#include<opencv2/stitching/detail/motion_estimators.hpp>
#include<opencv2/stitching/detail/seam_finders.hpp>
#include<opencv2/stitching/detail/util.hpp>
#include<opencv2/stitching/detail/warpers.hpp>
#include<opencv2/stitching/warpers.hpp>
usingnamespacestd;
usingnamespacecv;
usingnamespacecv::detail;
intmain(intargc,char*argv[])
{
//Defaultparameters
vector<String>img_names;
doublescale=1;
stringfeatures_type="orb";//"surf"or"orb"featurestype
floatmatch_conf=0.3f;
floatconf_thresh=1.f;
stringadjuster_method="ray";//"reproj"or"ray"adjustermethod
booldo_wave_correct=true;
WaveCorrectKindwave_correct_type=WAVE_CORRECT_HORIZ;
stringwarp_type="spherical";
intexpos_comp_type=ExposureCompensator::GAIN_BLOCKS;
stringseam_find_type="gc_color";
floatblend_strength=5;
intblend_type=Blender::MULTI_BAND;
stringresult_name="panorama_result.jpg";
doublestart_time=getTickCount();
//1-Inputimages
![Page 231: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/231.jpg)
if(argc>1)
{
for(inti=1;i<argc;i++)
img_names.push_back(argv[i]);
}
else
{
img_names.push_back("./panorama_image1.jpg");
img_names.push_back("./panorama_image2.jpg");
}
//Checkifhaveenoughimages
intnum_images=static_cast<int>(img_names.size());
if(num_images<2){cout<<"Needmoreimages"<<endl;return-1;}
//2-Resizeimagesandfindfeaturessteps
cout<<"Findingfeatures…"<<endl;
doublet=getTickCount();
Ptr<FeaturesFinder>finder;
if(features_type=="surf")
finder=makePtr<SurfFeaturesFinder>();
elseif(features_type=="orb")
finder=makePtr<OrbFeaturesFinder>();
else{cout<<"Unknown2Dfeaturestype:'"<<features_type<<endl;
return-1;}
Matfull_img,img;
vector<ImageFeatures>features(num_images);
vector<Mat>images(num_images);
vector<Size>full_img_sizes(num_images);
for(inti=0;i<num_images;++i)
{
full_img=imread(img_names[i]);
full_img_sizes[i]=full_img.size();
if(full_img.empty()){cout<<"Can'topenimage"<<img_names[i]
<<endl;return-1;}
resize(full_img,img,Size(),scale,scale);
images[i]=img.clone();
(*finder)(img,features[i]);
features[i].img_idx=i;
cout<<"Featuresinimage#"<<i+1<<"are:"<<
features[i].keypoints.size()<<endl;
}
finder->collectGarbage();
full_img.release();
img.release();
cout<<"Findingfeatures,time:"<<((getTickCount()-t)/
getTickFrequency())<<"sec"<<endl;
//3-Matchfeatures
![Page 232: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/232.jpg)
cout<<"Pairwisematching"<<endl;
t=getTickCount();
vector<MatchesInfo>pairwise_matches;
BestOf2NearestMatchermatcher(false,match_conf);
matcher(features,pairwise_matches);
matcher.collectGarbage();
cout<<"Pairwisematching,time:"<<((getTickCount()-t)/
getTickFrequency())<<"sec"<<endl;
//4-Selectimagesandmatchessubsettobuildpanorama
vector<int>indices=leaveBiggestComponent(features,pairwise_matches,
conf_thresh);
vector<Mat>img_subset;
vector<String>img_names_subset;
vector<Size>full_img_sizes_subset;
for(size_ti=0;i<indices.size();++i)
{
img_names_subset.push_back(img_names[indices[i]]);
img_subset.push_back(images[indices[i]]);
full_img_sizes_subset.push_back(full_img_sizes[indices[i]]);
}
images=img_subset;
img_names=img_names_subset;
full_img_sizes=full_img_sizes_subset;
//Estimatecameraparametersrough
HomographyBasedEstimatorestimator;
vector<CameraParams>cameras;
if(!estimator(features,pairwise_matches,cameras)){cout<<
"Homographyestimationfailed."<<endl;return-1;}
for(size_ti=0;i<cameras.size();++i)
{
MatR;
cameras[i].R.convertTo(R,CV_32F);
cameras[i].R=R;
cout<<"Initialintrinsic#"<<indices[i]+1<<":\n"<<
cameras[i].K()<<endl;
}
//5-Refinecameraparametersglobally
Ptr<BundleAdjusterBase>adjuster;
if(adjuster_method=="reproj")
//"reproj"method
adjuster=makePtr<BundleAdjusterReproj>();
else//"ray"method
adjuster=makePtr<BundleAdjusterRay>();
adjuster->setConfThresh(conf_thresh);
if(!(*adjuster)(features,pairwise_matches,cameras)){cout<<"Camera
parametersadjustingfailed."<<endl;return-1;}
//Findmedianfocallength
vector<double>focals;
for(size_ti=0;i<cameras.size();++i)
![Page 233: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/233.jpg)
{
cout<<"Camera#"<<indices[i]+1<<":\n"<<cameras[i].K()<<
endl;
focals.push_back(cameras[i].focal);
}
sort(focals.begin(),focals.end());
floatwarped_image_scale;
if(focals.size()%2==1)
warped_image_scale=static_cast<float>(focals[focals.size()/2]);
else
warped_image_scale=static_cast<float>(focals[focals.size()/2-
1]+focals[focals.size()/2])*0.5f;
//6-Wavecorrelation(optional)
if(do_wave_correct)
{
vector<Mat>rmats;
for(size_ti=0;i<cameras.size();++i)
rmats.push_back(cameras[i].R.clone());
waveCorrect(rmats,wave_correct_type);
for(size_ti=0;i<cameras.size();++i)
cameras[i].R=rmats[i];
}
//7-Warpimages
cout<<"Warpingimages(auxiliary)..."<<endl;
t=getTickCount();
vector<Point>corners(num_images);
vector<UMat>masks_warped(num_images);
vector<UMat>images_warped(num_images);
vector<Size>sizes(num_images);
vector<UMat>masks(num_images);
//Prepareimagesmasks
for(inti=0;i<num_images;++i)
{
masks[i].create(images[i].size(),CV_8U);
masks[i].setTo(Scalar::all(255));
}
//Mapprojections
Ptr<WarperCreator>warper_creator;
if(warp_type=="rectilinear")
warper_creator=makePtr<cv::CompressedRectilinearWarper>(2.0f,1.0f);
elseif(warp_type=="cylindrical")
warper_creator=makePtr<cv::CylindricalWarper>();
elseif(warp_type=="spherical")
warper_creator=makePtr<cv::SphericalWarper>();
elseif(warp_type=="stereographic")
warper_creator=makePtr<cv::StereographicWarper>();
![Page 234: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/234.jpg)
elseif(warp_type=="panini")
warper_creator=makePtr<cv::PaniniWarper>(2.0f,1.0f);
if(!warper_creator){cout<<"Can'tcreatethefollowingwarper'"<<
warp_type<<endl;return1;}
Ptr<RotationWarper>warper=warper_creator->create(static_cast<float>
(warped_image_scale*scale));
for(inti=0;i<num_images;++i)
{
Mat_<float>K;
cameras[i].K().convertTo(K,CV_32F);
floatswa=(float)scale;
K(0,0)*=swa;K(0,2)*=swa;
K(1,1)*=swa;K(1,2)*=swa;
corners[i]=warper->warp(images[i],K,cameras[i].R,INTER_LINEAR,
BORDER_REFLECT,images_warped[i]);
sizes[i]=images_warped[i].size();
warper->warp(masks[i],K,cameras[i].R,INTER_NEAREST,BORDER_CONSTANT,
masks_warped[i]);
}
vector<UMat>images_warped_f(num_images);
for(inti=0;i<num_images;++i)
images_warped[i].convertTo(images_warped_f[i],CV_32F);
cout<<"Warpingimages,time:"<<((getTickCount()-t)/
getTickFrequency())<<"sec"<<endl;
//8-Compensateexposureerrors
Ptr<ExposureCompensator>compensator=
ExposureCompensator::createDefault(expos_comp_type);
compensator->feed(corners,images_warped,masks_warped);
//9-Findseammasks
Ptr<SeamFinder>seam_finder;
if(seam_find_type=="no")
seam_finder=makePtr<NoSeamFinder>();
elseif(seam_find_type=="voronoi")
seam_finder=makePtr<VoronoiSeamFinder>();
elseif(seam_find_type=="gc_color")
seam_finder=makePtr<GraphCutSeamFinder>
(GraphCutSeamFinderBase::COST_COLOR);
elseif(seam_find_type=="gc_colorgrad")
seam_finder=makePtr<GraphCutSeamFinder>
(GraphCutSeamFinderBase::COST_COLOR_GRAD);
elseif(seam_find_type=="dp_color")
seam_finder=makePtr<DpSeamFinder>(DpSeamFinder::COLOR);
![Page 235: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/235.jpg)
elseif(seam_find_type=="dp_colorgrad")
seam_finder=makePtr<DpSeamFinder>(DpSeamFinder::COLOR_GRAD);
if(!seam_finder){cout<<"Can'tcreatethefollowingseamfinder'"<<
seam_find_type<<endl;return1;}
seam_finder->find(images_warped_f,corners,masks_warped);
//Releaseunusedmemory
images.clear();
images_warped.clear();
images_warped_f.clear();
masks.clear();
//10-Createablender
Ptr<Blender>blender=Blender::createDefault(blend_type,false);
Sizedst_sz=resultRoi(corners,sizes).size();
floatblend_width=sqrt(static_cast<float>(dst_sz.area()))*
blend_strength/100.f;
if(blend_width<1.f)
blender=Blender::createDefault(Blender::NO,false);
elseif(blend_type==Blender::MULTI_BAND)
{
MultiBandBlender*mb=dynamic_cast<MultiBandBlender*>(blender.get());
mb->setNumBands(static_cast<int>(ceil(log(blend_width)/log(2.))-
1.));
cout<<"Multi-bandblender,numberofbands:"<<mb->numBands()
<<endl;
}
elseif(blend_type==Blender::FEATHER)
{
FeatherBlender*fb=dynamic_cast<FeatherBlender*>(blender.get());
fb->setSharpness(1.f/blend_width);
cout<<"Featherblender,sharpness:"<<fb->sharpness()<<endl;
}
blender->prepare(corners,sizes);
//11-Compositingstep
cout<<"Compositing…"<<endl;
t=getTickCount();
Matimg_warped,img_warped_s;
Matdilated_mask,seam_mask,mask,mask_warped;
for(intimg_idx=0;img_idx<num_images;++img_idx)
{
cout<<"Compositingimage#"<<indices[img_idx]+1<<endl;
//11.1-Readimageandresizeitifnecessary
full_img=imread(img_names[img_idx]);
if(abs(scale-1)>1e-1)
resize(full_img,img,Size(),scale,scale);
else
img=full_img;
full_img.release();
![Page 236: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/236.jpg)
Sizeimg_size=img.size();
MatK;
cameras[img_idx].K().convertTo(K,CV_32F);
//11.2-Warpthecurrentimage
warper->warp(img,K,cameras[img_idx].R,INTER_LINEAR,BORDER_REFLECT,
img_warped);
//Warpthecurrentimagemask
mask.create(img_size,CV_8U);
mask.setTo(Scalar::all(255));
warper->warp(mask,K,cameras[img_idx].R,INTER_NEAREST,
BORDER_CONSTANT,mask_warped);
//11.3-Compensateexposureerrorstep
compensator->apply(img_idx,corners[img_idx],img_warped,mask_warped);
img_warped.convertTo(img_warped_s,CV_16S);
img_warped.release();
img.release();
mask.release();
dilate(masks_warped[img_idx],dilated_mask,Mat());
resize(dilated_mask,seam_mask,mask_warped.size());
mask_warped=seam_mask&mask_warped;
//11.4-Blendingimagesstep
blender->feed(img_warped_s,mask_warped,corners[img_idx]);
}
Matresult,result_mask;
blender->blend(result,result_mask);
cout<<"Compositing,time:"<<((getTickCount()-t)/
getTickFrequency())<<"sec"<<endl;
imwrite(result_name,result);
cout<<"Finished,totaltime:"<<((getTickCount()-start_time)/
getTickFrequency())<<"sec"<<endl;
return0;
}
ThisexamplecreatesaprogramtostitchimagesusingOpenCVsteps.Ittakesaninputpathtoselectthedifferentinputimagesorusesdefaultinputimages(.\panorama_image1.jpgandpanorama_image2.jpg),whichareshownlater.Finally,theresultingimageisshownandsavedas.\panorama_result.jpg.Inthefirstplace,thestitching.hppanddetailheadersareincludedandthecv::detailnamespaceisused.Themoreimportantparametersarealsoset,andyoucanconfigurethestitchingprocesswiththeseparameters.Ifyouneedtouseacustomconfiguration,itisveryusefultounderstandthegeneraldiagramofthestitchingprocess(thepreviousfigure).Thisadvancedexamplehas11importantsteps.Thefirststepreadsandcheckstheinputimages.Thisexampleneedstwoormoreimagestowork.
![Page 237: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/237.jpg)
Thesecondstepresizestheinputimagesusingthedoublescale=1parameterandfindsthefeaturesoneachimage;youcanselectbetweentheSurf(finder=makePtr<SurfFeaturesFinder>())orOrb(finder=makePtr<OrbFeaturesFinder>())featurefindersusingthestringfeatures_type="orb"parameter.Afterwards,thisstepresizestheinputimages(resize(full_img,img,Size(),scale,scale))andfindsthefeatures((*finder)(img,features[i])).
NoteFormoreinformationaboutSURFandORBdescriptors,refertoChapter5ofOpenCVEssentialsbyPacktPublishing.
Thethirdstepmatchesthefeaturesthathavebeenfoundpreviously.Amatcheriscreated(BestOf2NearestMatchermatcher(false,match_conf))withthefloatmatch_conf=0.3fparameter.
Thefourthstepselectsimagesandmatchessubsetstobuildthepanorama.Then,thebestfeaturesareselectedandmatchedusingthevector<int>indices=leaveBiggestComponent(features,pairwise_matches,conf_thresh)function.Withthesefeatures,anewsubsetiscreatedtobeused.
Thefifthsteprefinesparametersgloballyusingbundleadjustmenttobuildanadjuster(Ptr<BundleAdjusterBase>adjuster).Givenasetofimagesdepictinganumberof2Dor3Dpointsfromdifferentviewpoints,bundleadjustmentcanbedefinedastheproblemofsimultaneouslyrefiningthe2Dor3Dcoordinates,describingthescenegeometryaswellastheparametersoftherelativemotionandopticalcharacteristicsofthecamerasemployedtoacquiretheimagesaccordingtoanoptimalitycriterioninvolvingthecorrespondingimageprojectionsofallpoints.Therearetwomethodstocalculatethisbundleadjustment,reproj(adjuster=makePtr<BundleAdjusterReproj>())orray(adjuster=makePtr<BundleAdjusterRay>()),whichareselectedwiththestringadjuster_method="ray"parameter.Finallythisbundleadjustmentisusedas(*adjuster)(features,pairwise_matches,cameras).
Thesixthstepisanoptionalstep(booldo_wave_correct=true)thatcalculatesthewavecorrelationtoimprovethecamerasetting.ThetypeofwavecorrelationisselectedwiththeWaveCorrectKindwave_correct_type=WAVE_CORRECT_HORIZparameterandcalculatedaswaveCorrect(rmats,wave_correct_type).
Theseventhstepcreatesawarperimagethatneedsamapprojection.Themapprojectionshavebeendescribedpreviously,andtheycanberectilinear,cylindrical,spherical,stereographic,orpanini.ThereareactuallymoremapprojectionsimplementedinOpenCV.Themapprojectionscanbeselectedwiththestringwarp_type="spherical"parameter.Afterwards,awarperiscreated(Ptr<RotationWarper>warper=warper_creator->create(static_cast<float>(warped_image_scale*scale)))andeachimageiswarped(warper->warp(masks[i],K,cameras[i].R,INTER_NEAREST,BORDER_CONSTANT,masks_warped[i])).
Theeighthstepcompensatesexposureerrorsbycreatingacompensator(Ptr<ExposureCompensator>compensator=
![Page 238: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/238.jpg)
ExposureCompensator::createDefault(expos_comp_type))anditisappliedtoeachwarpedimage(compensator->feed(corners,images_warped,masks_warped)).
Theninthstepfindsseammasks.Thisprocesssearchesforthebestareasofattachmentforeachpanoramaimage.TherearesomemethodsimplementedinOpenCVtoperformthistask,andthisexampleusesthestringseam_find_type="gc_color"parametertoselectthem.ThesemethodsareNoSeamFinder(there’snouseofthismethod),VoronoiSeamFinder,GraphCutSeamFinderBase::COST_COLOR,GraphCutSeamFinderBase::COST_COLOR_GRAD,DpSeamFinder::COLOR,andDpSeamFinder::COLOR_GRAD.
Thetenthstepcreatesablendertocombineeachimagetobuildthepanorama.TherearetwotypesofblendersimplementedinOpenCV,MultiBandBlender*mb=dynamic_cast<MultiBandBlender*>(blender.get())andFeatherBlender*fb=dynamic_cast<FeatherBlender*>(blender.get()),whichcanbeselectedwiththeintblend_type=Blender::MULTI_BANDparameter.Finally,theblenderisprepared(blender->prepare(corners,sizes)).
Thelaststepcompositesthefinalpanorama.Thisstepneedswhatthepreviousstepshavedonetoconfigurethestitching.Foursub-stepsareperformedtocalculatethefinalpanorama.First,eachinputimageisread(full_img=imread(img_names[img_idx]))and,ifnecessary,resized(resize(full_img,img,Size(),scale,scale)).Second,theseimagesarewarpedwiththecreatedwarper(warper->warp(img,K,cameras[img_idx].R,INTER_LINEAR,BORDER_REFLECT,img_warped)).Third,theseimagesarecompensatedforexposureerrorswiththecreatedcompensator(compensator->apply(img_idx,corners[img_idx],img_warped,mask_warped)).Finally,theseimagesareblendedusingthecreatedblender.Thefinalresultpanoramaisnowsavedinthestringresult_name="panorama_result.jpg"file.
ToshowyouthestitchingAdvancedresults,twoinputimagesarestitchedandtheresultingpanoramaisshownasfollows:
![Page 239: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/239.jpg)
![Page 240: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/240.jpg)
![Page 241: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/241.jpg)
SummaryInthischapter,youlearnedhowtousethreeimportantmodulesofOpenCVthathandleimageprocessinginvideo.Thesemodulesarevideostabilization,superresolution,andstitching.Someofthetheoreticalunderpinningshavealsobeenexplainedforeachmodule.
Ineachsectionofthischapter,acompleteexample,developedinC++,isexplained.Animageresultwasalsoshownforeachmodule,showingthemaineffect.
Thenextchapterintroduceshigh-dynamic-rangeimagesandshowsyouhowtohandlethemwithOpenCV.High-dynamic-rangeimagingistypicallyconsideredwithinwhatisnowcalledcomputationalphotography.Roughlyspeaking,computationalphotographyreferstotechniquesthatallowyoutoextendthetypicalcapabilitiesofdigitalphotography.Thismayincludehardwareadd-onsormodifications,butitmostlyreferstosoftware-basedtechniques.Thesetechniquesmayproduceoutputimagesthatcannotbeobtainedwitha“traditional”digitalcamera.
![Page 242: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/242.jpg)
![Page 243: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/243.jpg)
Chapter6.ComputationalPhotographyComputationalphotographyreferstotechniquesthatallowyoutoextendthetypicalcapabilitiesofdigitalphotography.Thismayincludehardwareadd-onsormodifications,butitmostlyreferstosoftware-basedtechniques.Thesetechniquesmayproduceoutputimagesthatcannotbeobtainedwitha“traditional”digitalcamera.Thischapterintroducessomeofthelesser-knowntechniquesavailableinOpenCVforcomputationalphotography:high-dynamic-rangeimaging,seamlesscloning,decolorization,andnon-photorealisticrendering.Thesethreeareinsidethephotomoduleofthelibrary.Notethatothertechniquesinsidethismodule(inpaintinganddenoising)havebeenalreadyconsideredinpreviouschapters.
![Page 244: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/244.jpg)
High-dynamic-rangeimagesThetypicalimagesweprocesshave8bitsperpixel(bpp).Colorimagesalsouse8bitstorepresentthevalueofeachchannel,thatis,red,green,andblue.Thismeansthatonly256differentintensityvaluesareused.This8bpplimithasprevailedthroughoutthehistoryofdigitalimaging.However,itisobviousthatlightinnaturedoesnothaveonly256differentlevels.Weshould,therefore,considerwhetherthisdiscretizationisdesirableorevensufficient.Thehumaneye,forexample,isknowntocaptureamuchhigherdynamicrange(thenumberoflightlevelsbetweenthedimmestandbrightestlevels),estimatedatbetween1and100millionlightlevels.Withonly256lightlevels,therearecaseswherebrightlightsappearoverexposedorsaturated,whiledarkscenesaresimplycapturedasblack.
Therearecamerasthatcancapturemorethan8bpp.However,themostcommonwaytocreatehigh-dynamic-rangeimagesistousean8bppcameraandtakeimageswithdifferentexposurevalues.Whenwedothis,problemsofalimiteddynamicrangeareevident.Consider,forexample,thefollowingfigure:
Ascenecapturedwithsixdifferentexposurevalues
NoteThetop-leftimageismostlyblack,butwindowdetailsarevisible.Conversely,thebottom-rightimageshowsdetailsoftheroom,butthewindowdetailsarebarelyvisible.
Wecantakepictureswithdifferentexposurelevelsusingmodernsmartphonecameras.WithiPhoneandiPads,forexample,asofiOS8,itisveryeasytochangetheexposurewiththenativecameraapp.Bytouchingthescreen,ayellowboxappearswithasmallsunonitsside.Swipingupordowncanthenchangetheexposure(seethefollowingscreenshot).
Note
![Page 245: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/245.jpg)
Therangeofexposurelevelsisquitelarge,sowemayhavetorepeattheswipinggestureanumberoftimes.
IfyouusepreviousversionsofiOS,youcandownloadcameraappssuchasCamera+thatallowyoutofocusonaspecificpointandchangeexposure.
ForAndroid,tonsofcameraappsareavailableonGooglePlaythatcanadjusttheexposure.OneexampleisCameraFV-5,whichhasbothfreeandpaidversions.
TipIfyouuseahandhelddevicetocapturetheimages,makesurethedeviceisstatic.Infact,youmaywelluseatripod.Otherwise,imageswithdifferentexposureswillnotbealigned.Also,movingsubjectswillinevitablyproduceghostartifacts.Threeimagesaresufficientformostcases,withlow,medium,andhighexposurelevels.
TheexposurecontrolusingthenativecameraappinaniPhone5S
Smartphonesandtablesarehandytocaptureanumberofimageswithdifferentexposures.TocreateHDRimages,weneedtoknowtheexposure(orshutter)timeforeachcapturedimage(seethefollowingsectionforthereason).Notallappsallowyoutocontrol(orevensee)thismanually(theiOS8nativeappdoesn’t).Atthetimeofwritingthis,atleasttwofreeappsallowthisforiOS:ManuallyandManualShot!InAndroid,thefreeCameraFV-5allowsyoutocontrolandseeexposuretimes.NotethatF/StopandISOaretwootherparametersthatcontroltheexposure.
ImagesthatarecapturedcanbetransferredtothedevelopmentcomputerandusedtocreatetheHDRimage.
Note
![Page 246: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/246.jpg)
AsofiOS7,thenativecameraapphasanHDRmodethatautomaticallycapturesthreeimagesinarapidsequence,eachwithdifferentexposure.Theseimagesarealsoautomaticallycombinedintoasingle(sometimesbetter)image.
![Page 247: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/247.jpg)
CreatingHDRimagesHowdowecombinemultiple(three,forexample)exposureimagesintoanHDRimage?Ifweconsideronlyoneofthechannelsandagivenpixel,thethreepixelvalues(oneforeachexposurelevel)mustbemappedtoasinglevalueinthelargeroutputrange(say,16bpp).Thismappingisnoteasy.Firstofall,wehavetoconsiderthatpixelintensitiesarea(rough)measureofsensorirradiance(theamountoflightincidentonthecamerasensor).Digitalcamerasmeasureirradiancebutinanonlinearway.Camerashaveanonlinearresponsefunctionthattranslatesirradiancetopixelintensityvaluesintherangeof0to255].Inordertomapthesevaluestoalargersetofdiscretevalues,wemustestimatethecameraresponsefunction(thatis,theresponsewithinthe0to255range).
Howdoweestimatethecameraresponsefunction?Wedothatfromthepixelsthemselves!TheresponsefunctionisanS-shapedcurveforeachcolorchannel,anditcanbeestimatedfromthepixels(withthreeexposuresofapixel,wehavethreepointsonthecurveforeachcolorchannel).Asthisisverytimeconsuming,usually,asetofrandompixelsischosen.
There’sonlyonethingleft.Wepreviouslytalkedaboutestimatingtherelationshipbetweenirradianceandpixelintensity.Howdoweknowirradiance?Sensorirradianceisdirectlyproportionaltotheexposuretime(orequivalently,theshutterspeed).Thisisthereasonwhyweneedexposuretime!
Finally,theHDRimageiscomputedasaweightedsumoftherecoveredirradiancevaluesfromthepixelsofeachexposure.Notethatthisimagecannotbedisplayedonconventionalscreens,whichalsohavealimitedrange.
NoteAgoodbookonhigh-dynamic-rangeimagingisHighDynamicRangeImaging:Acquisition,Display,andImage-BasedLightingbyReinhardetal,MorganKaufmannPub.ThebookisaccompaniedbyaDVDcontainingimagesindifferentHDRformats.
ExampleOpenCV(asof3.0only)providesfunctionstocreateHDRimagesfromasetofimagestakenwithdifferentexposures.There’sevenatutorialexamplecalledhdr_imaging,whichreadsalistofimagefilesandexposuretimes(fromatextfile)andcreatestheHDRimage.
NoteInordertorunthehdr_imagingtutorial,youwillneedtodownloadtherequiredimagefilesandtextfileswiththelist.Youcandownloadthemfromhttps://github.com/Itseez/opencv_extra/tree/master/testdata/cv/hdr.
TheCalibrateDebevecandMergeDebevecclassesimplementDebevec’smethodtoestimatethecameraresponsefunctionandmergetheexposuresintoanHDRimage,respectively.ThefollowingcreateHDRexampleshowsyouhowtousebothclasses:
![Page 248: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/248.jpg)
#include<opencv2/photo.hpp>
#include<opencv2/highgui.hpp>
#include<iostream>
usingnamespacecv;
usingnamespacestd;
intmain(int,char**argv)
{
vector<Mat>images;
vector<float>times;
//Loadimagesandexposures…
Matimg1=imread("1div66.jpg");
if(img1.empty())
{
cout<<"Error!Inputimagecannotberead…\n";
return-1;
}
Matimg2=imread("1div32.jpg");
Matimg3=imread("1div12.jpg");
images.push_back(img1);
images.push_back(img2);
images.push_back(img3);
times.push_back((float)1/66);
times.push_back((float)1/32);
times.push_back((float)1/12);
//Estimatecameraresponse…
Matresponse;
Ptr<CalibrateDebevec>calibrate=createCalibrateDebevec();
calibrate->process(images,response,times);
//Showtheestimatedcameraresponsefunction…
cout<<response;
//CreateandwritetheHDRimage…
Mathdr;
Ptr<MergeDebevec>merge_debevec=createMergeDebevec();
merge_debevec->process(images,hdr,times,response);
imwrite("hdr.hdr",hdr);
cout<<"\nDone.Pressanykeytoexit…\n";
waitKey();//Waitforkeypress
return0;
}
Theexampleusesthreeimagesofacup(theimagesareavailablealongwiththecodeaccompanyingthisbook).TheimagesweretakenwiththeManualShot!appmentionedpreviously,usingexposuresof1/66,1/32,and1/12seconds;refertothefollowingfigure:
![Page 249: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/249.jpg)
Thethreeimagesusedintheexampleasinputs
NotethatthecreateCalibrateDebevecmethodexpectstheimagesandexposuretimesinanSTLvector(STLisakindoflibraryofusefulcommonfunctionsanddatastructuresavailableinstandardC++).Thecameraresponsefunctionisgivenasa256real-valuedvector.Thisrepresentsthemappingbetweenthepixelvalueandirradiance.Actually,itisa256x3matrix(onecolumnpereachofthethreecolorchannels).Thefollowingfigureshowsyoutheresponsegivenbytheexample:
TheestimatedRGBcameraresponsefunctions
![Page 250: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/250.jpg)
TipThecoutpartofcodedisplaysthematrixintheformatusedbyMATLABandOctave,twowidelyusedpackagesfornumericalcomputation.ItisstraightforwardtocopythematrixintheoutputandpasteitinMATLAB/Octaveinordertodisplayit.
TheresultingHDRimageisstoredinthelosslessRGBEformat.Thisimageformatusesonebytepercolorchannelplusonebyteasasharedexponent.Theformatusesthesameprincipleastheoneusedinthefloating-pointnumberrepresentation:thesharedexponentallowsyoutorepresentamuchwiderrangeofvalues.RGBEimagesusethe.hdrextension.Notethatasitisalosslessimageformat,.hdrfilesarerelativelylarge.Inthisexample,theRGBinputimagesare1224x1632each(100to200KBeach),whiletheoutput.hdrfileoccupies5.9MB.
TheexampleusesDebevecandMalik’smethod,butOpenCValsoprovidesanothercalibrationfunctionbasedonRobertson’smethod.Bothcalibrationandmergefunctionsareavailable,thatis,createCalibrateRobertsonandMergeRobertson.
NoteFormoreinformationontheotherfunctionsandthetheorybehindthem,refertohttp://docs.opencv.org/trunk/modules/photo/doc/hdr_imaging.html.
Finally,notethattheexampledoesnotdisplaytheresultingimage.TheHDRimagecannotbedisplayedinconventionalscreens,soweneedtoperformanotherstepcalledtonemapping.
![Page 251: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/251.jpg)
TonemappingWhenhigh-dynamic-rangeimagesaretobedisplayed,informationcanbelost.Thisisduetothefactthatcomputerscreensalsohavealimitedcontrastratio,andprintedmaterialisalsotypicallylimitedto256tones.Whenwehaveahigh-dynamic-rangeimage,itisnecessarytomaptheintensitiestoalimitedsetofvalues.Thisiscalledtonemapping.
SimplyscalingtheHDRimagevaluestothereducedrangeofthedisplaydeviceisnotsufficientinordertoprovidearealisticoutput.Scalingtypicallyproducesimagesthatappearaslackingdetail(contrast),eliminatingtheoriginalscenecontent.Ultimately,tone-mappingalgorithmsaimatprovidingoutputsthatappearvisuallysimilartotheoriginalscene(thatis,similartowhatahumanwouldseewhenviewingthescene).Varioustone-mappingalgorithmshavebeenproposedanditisstillamatterofextensiveresearch.ThefollowinglinesofcodecanapplytonemappingtotheHDRimageobtainedinthepreviousexample:
Matldr;
Ptr<TonemapDurand>tonemap=createTonemapDurand(2.2f);
tonemap->process(hdr,ldr);//ldrisafloatingpointimagewith
ldr=ldr*255;//valuesininterval[0..1]
imshow("LDR",ldr);
ThemethodwasproposedbyDurandandDorseyin2002.Theconstructoractuallyacceptsanumberofparametersthataffecttheoutput.Thefollowingfigureshowsyoutheoutput.Notehowthisimageisnotnecessarilybetterthananyofthethreeoriginalimages:
Thetone-mappedoutput
Threeothertone-mappingalgorithmsareavailableinOpenCV:createTonemapDrago,
![Page 252: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/252.jpg)
createTonemapReinhard,andcreateTonemapMantiuk.
AnHDRimage(theRGBEformat,thatis,fileswiththe.hdrextension)canbedisplayedusingMATLAB.Allittakesisthreelinesofcode:
hdr=hdrread('hdr.hdr');
rgb=tonemap(hdr);
imshow(rgb);
Notepfstoolsisanopensourcesuiteofcommand-linetoolstoread,write,andrenderHDRimages.Thesuite,whichcanread.hdrandotherformats,includesanumberofcameracalibrationandtone-mappingalgorithms.LuminanceHDRisfreeGUIsoftwarebasedonpfstools.
![Page 253: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/253.jpg)
AlignmentThescenethatwillbecapturedwithmultipleexposureimagesmustbestatic.Thecameramustalsobestatic.Evenifthetwoconditionsmet,itisadvisabletoperformanalignmentprocedure.
OpenCVprovidesanalgorithmforimagealignmentproposedbyG.Wardin2003.Themainfunction,createAlignMTB,takesaninputparameterthatdefinesthemaximumshift(actually,alogarithmthebasetwoofthemaximumshiftineachdimension).Thefollowinglinesshouldbeinsertedrightbeforeestimatingthecameraresponsefunctioninthepreviousexample:
vector<Mat>images_(images);
Ptr<AlignMTB>align=createAlignMTB(4);//4=max16pixelshift
align->process(images_,images);
![Page 254: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/254.jpg)
ExposurefusionWecanalsocombineimageswithmultipleexposureswithneithercameraresponsecalibration(thatis,exposuretimes)norintermediateHDRimage.Thisiscalledexposurefusion.ThemethodwasproposedbyMertensetalin2007.Thefollowinglinesperformexposurefusion(imagesistheSTLvectorofinputimages;refertothepreviousexample):
Matfusion;
Ptr<MergeMertens>merge_mertens=createMergeMertens();
merge_mertens->process(images,fusion);//fusionisa
fusion=fusion*255;//float.pointimagew.valuesin[0..1]
imwrite("fusion.png",fusion);
Thefollowingfigureshowsyoutheresult:
Exposurefusion
![Page 255: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/255.jpg)
![Page 256: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/256.jpg)
SeamlesscloningInphotomontages,wetypicallywanttocutanobject/personinasourceimageandinsertitintoatargetimage.Ofcourse,thiscanbedoneinastraightforwardwaybysimplypastingtheobject.However,thiswouldnotproducearealisticeffect.See,forexample,thefollowingfigure,inwhichwewantedtoinserttheboatinthetophalfoftheimageintotheseaatthebottomhalfoftheimage:
Cloning
AsofOpenCV3,thereareseamlesscloningfunctionsavailableinwhichtheresultismorerealistic.ThisfunctioniscalledseamlessCloneanditusesamethodproposedbyPerezandGangnetin2003.ThefollowingseamlessCloningexampleshowsyouhowitcanbeused:
#include<opencv2/photo.hpp>
#include<opencv2/highgui.hpp>
#include<iostream>
usingnamespacecv;
usingnamespacestd;
intmain(int,char**argv)
{
![Page 257: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/257.jpg)
//Loadandshowimages…
Matsource=imread("source1.png",IMREAD_COLOR);
Matdestination=imread("destination1.png",IMREAD_COLOR);
Matmask=imread("mask.png",IMREAD_COLOR);
imshow("source",source);
imshow("mask",mask);
imshow("destination",destination);
Matresult;
Pointp;//pwillbeneartoprightcorner
p.x=(float)2*destination.size().width/3;
p.y=(float)destination.size().height/4;
seamlessClone(source,destination,mask,p,result,NORMAL_CLONE);
imshow("result",result);
cout<<"\nDone.Pressanykeytoexit…\n";
waitKey();//Waitforkeypress
return0;
}
Theexampleisstraightforward.TheseamlessClonefunctiontakesthesource,destination,andmaskimagesandapointinthedestinationimageinwhichthecroppedobjectwillbeinserted(thesethreeimagescanbedownloadedfromhttps://github.com/Itseez/opencv_extra/tree/master/testdata/cv/cloning/Normal_Cloning).Seetheresultinthefollowingfigure:
Seamlesscloning
ThelastparameterofseamlessClonerepresentstheexactmethodtobeused(therearethreemethodsavailablethatproduceadifferentfinaleffect).Ontheotherhand,thelibraryprovidesthefollowingrelatedfunctions:
Function Effect
colorChangeMultiplieseachofthethreecolorchannelsofthesourceimagebyafactor,applyingthemultiplicationonlyintheregiongivenbythemask
illuminationChange Changesilluminationofthesourceimage,onlyintheregiongivenbythemask
![Page 258: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/258.jpg)
textureFlattening Washesouttexturesinthesourceimage,onlyintheregiongivenbythemask
AsopposedtoseamlessClone,thesethreefunctionsonlyacceptsourceandmaskimages.
![Page 259: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/259.jpg)
![Page 260: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/260.jpg)
DecolorizationDecolorizationistheprocessofconvertingacolorimagetograyscale.Giventhisdefinition,thereadermaywellask,don’twealreadyhavegrayscaleconversion?Yes,grayscaleconversionisabasicroutineinOpenCVandanyimage-processinglibrary.ThestandardconversionisbasedonalinearcombinationoftheR,G,andBchannels.Theproblemisthatsuchaconversionmayproduceimagesinwhichcontrastintheoriginalimageislost.Thereasonisthattwodifferentcolors(whichareperceivedascontrastsintheoriginalimage)mayendupbeingmappedtothesamegrayscalevalue.Considertheconversionoftwocolors,AandB,tograyscale.Let’ssupposethatBisavariationofAintheRandGchannels:
A=(R,G,B)=>G=(R+G+B)/3
B=(R-x,G+x,B)=>G=(R-x+G+x+B)/3=(R+G+B)/3
Eventhoughtheyareperceivedasdistinct,thetwocolorsAandBaremappedtothesamegrayscalevalue!Theimagesfromthefollowingdecolorizationexampleshowthis:
#include<opencv2/photo.hpp>
#include<opencv2/highgui.hpp>
#include<iostream>
usingnamespacecv;
usingnamespacestd;
intmain(int,char**argv)
{
//Loadandshowimages…
Matsource=imread("color_image_3.png",IMREAD_COLOR);
imshow("source",source);
//firstcomputeandshowstandardgrayscaleconversion…
Matgrayscale=Mat(source.size(),CV_8UC1);
cvtColor(source,grayscale,COLOR_BGR2GRAY);
imshow("grayscale",grayscale);
//nowcomputeandshowdecolorization…
Matdecolorized=Mat(source.size(),CV_8UC1);
Matdummy=Mat(source.size(),CV_8UC3);
decolor(source,decolorized,dummy);
imshow("decolorized",decolorized);
cout<<"\nDone.Pressanykeytoexit…\n";
waitKey();//Waitforkeypress
return0;
}
![Page 261: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/261.jpg)
Decolorizationexampleoutput
Theexampleisstraightforward.Afterreadingtheimageandshowingtheresultofastandardgrayscaleconversion,itusesthedecolorfunctiontoperformthedecolorization.Theimageused(thecolor_image_3.pngfile)isincludedintheopencv_extrarepositoryathttps://github.com/Itseez/opencv_extra/tree/master/testdata/cv/decolor.
NoteTheimageusedintheexampleisactuallyanextremecase.Itscolorshavebeenchosensothatthestandardgrayscaleoutputisfairlyhomogeneous.
![Page 262: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/262.jpg)
![Page 263: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/263.jpg)
Non-photorealisticrenderingAspartofthephotomodule,fourfunctionsareavailablethattransformaninputimageinawaythatproducesanon-realisticbutstillartisticoutput.ThefunctionsareveryeasytouseandaniceexampleisincludedwithOpenCV(npr_demo).Forillustrativepurposes,hereweshowyouatablethatallowsyoutograsptheeffectofeachfunction.Takealookatthefollowingfruits.jpginputimage,includedwithOpenCV:
Theinputreferenceimage
Theeffectsare:
Function Effect
edgePreservingFilterSmoothingisahandyandfrequentlyusedfilter.Thisfunctionperformssmoothingwhilepreservingobjectedgedetails.
![Page 264: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/264.jpg)
detailEnhance Enhancesdetailsintheimage
![Page 265: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/265.jpg)
pencilSketch Apencil-likelinedrawingversionoftheinputimage
![Page 266: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/266.jpg)
stylization Watercoloreffect
![Page 267: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/267.jpg)
![Page 268: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/268.jpg)
![Page 269: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/269.jpg)
SummaryInthischapter,youlearnedwhatcomputationalphotographyisandtherelatedfunctionsavailableinOpenCV3.Weexplainedthemostimportantfunctionswithinthephotomodule,butnotethatotherfunctionsofthismodule(inpaintingandnoisereduction)werealsoconsideredinpreviouschapters.Computationalphotographyisarapidlyexpandingfield,withstrongtiestocomputergraphics.Therefore,thismoduleofOpenCVisexpectedtogrowinfutureversions.
Thenextchapterwillbedevotedtoanimportantaspectthatwehavenotyetconsidered:time.Manyofthefunctionsexplainedtakeasignificanttimetocomputetheresults.Thenextchapterwillshowyouhowtodealwiththatusingmodernhardware.
![Page 270: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/270.jpg)
![Page 271: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/271.jpg)
Chapter7.AcceleratingImageProcessingThischapterdealswiththeaccelerationofimageprocessingtasksusingGeneralPurposeGraphicsProcessingUnits(GPGPUs)or,inshort,GPUswithparallelprocessing.AGPUisessentiallyacoprocessordedicatedtographicsprocessingorfloatingpointoperations,aimedatimprovingperformanceonapplicationssuchasvideogamesandinteractive3Dgraphics.WhilethegraphicsprocessingisexecutedintheGPU,theCPUcanbededicatedtoothercalculations(suchastheartificialintelligencepartingames).EveryGPUisequippedwithhundredsofsimpleprocessingcoresthatallowmassiveparallelexecutiononhundredsof“simple”mathematicaloperationson(normally)floatingpointnumbers.
CPUsseemtohavereachedtheirspeedandthermalpowerlimits.BuildingacomputerwithseveralCPUshasbecomeacomplexproblem.ThisiswhereGPUscomeintoplay.GPUprocessingisanewcomputingparadigmthatusestheGPUtoimprovethecomputationalperformance.GPUsinitiallyimplementedcertainparalleloperationscalledgraphicsprimitivesthatwereoptimizedforgraphicsprocessing.Oneofthemostcommonprimitivesfor3Dgraphicsprocessingisantialiasing,whichmakestheedgesofthefigureshaveamorerealisticappearance.Otherprimitivesaredrawingsofrectangles,triangles,circles,andarcs.GPUscurrentlyincludehundredsofgeneral-purposeprocessingfunctionsthatcandomuchmorethanrenderinggraphics.Particularly,theyareveryvaluableintasksthatcanbeparallelized,whichisthecaseformanycomputervisionalgorithms.
OpenCVlibrariesincludesupportfortheOpenCLandCUDAGPUarchitectures.CUDAimplementsmanyalgorithms;however,itonlyworkswithNVIDIAgraphiccards.CUDAisaparallelcomputingplatformandprogrammingmodelcreatedbyNVIDIAandimplementedbytheGPUsthattheyproduce.ThischapterfocusesontheOpenCLarchitecture,asitissupportedbymoredevicesandisevenincludedinsomeNVIDIAgraphiccards.
TheOpenComputingLanguage(OpenCL)isaframeworkthatwritesprogramsthatcanbeexecutedonCPUsorGPUsattachedtoahostprocessor(aCPU).ItdefinesaC-likelanguagetowritefunctions,calledkernels,whichareexecutedonthecomputingdevices.UsingOpenCL,kernelscanberunonallormanyoftheindividualprocessingelements(PEs)inparalleltotheCPUsorGPUs.
Inaddition,OpenCLdefinesanApplicationProgrammingInterface(API)thatallowsprogramsrunningonthehost(theCPU)tolaunchkernelsonthecomputerdevicesandmanagetheirdevicememories,whichare(atleastconceptually)separatedfromthehostmemory.OpenCLprogramsareintendedtobecompiledatruntimesothatapplicationsthatuseOpenCLareportablebetweenimplementationsofvarioushostcomputerdevices.OpenCLisalsoanopenstandardmaintainedbythenonprofittechnologyconsortiumKhronosGroup(https://www.khronos.org/).
OpenCVcontainsasetofclassesandfunctionsthatimplementandacceleratetheOpenCVfunctionalityusingOpenCL.OpenCVcurrentlyprovidesatransparentAPIthatenablestheunificationofitsoriginalAPIwithOpenCL-acceleratedprogramming.
![Page 272: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/272.jpg)
Therefore,youonlyneedtowriteyourcodeonce.Thereisanewunifieddatastructure(UMat)thathandlesdatatransferstotheGPUswhenitisneededandpossible.
SupportforOpenCLinOpenCVhasbeendesignedforeaseofuseanddoesnotrequireanyknowledgeofOpenCL.Ataminimumlevel,itcanbeviewedasasetofaccelerations,whichcantakeadvantageofthehighcomputingpowerwhenusingmodernCPUandGPUdevices.
TocorrectlyrunOpenCLprograms,theOpenCLruntimeshouldbeprovidedbythedevicevendor,typicallyintheformofadevicedriver.Also,touseOpenCVwithOpenCL,acompatibleSDKisneeded.Currently,therearefiveavailableOpenCLSDKs:
AMDAPPSDK:ThisSDKsupportsOpenCLonCPUsandGPUs,suchasX86+SSE2(orhigher)CPUsandAMDFusion,AMDRadeon,AMDMobility,andATIFireProGPUs.IntelSDK:ThisSDKsupportsOpenCLonIntelCoreprocessorsandIntelHDGPUs,suchasIntel+SSE4.1,SSE4.2orAVX,IntelCorei7,i5andi3(1st,2nd,and3rdGeneration),IntelHDGraphics,IntelCore2Solo(DuoQuadandExtreme),andIntelXeonCPUs.IBMOpenCLDevelopmentKit:ThisSDKsupportsOpenCLonAMDserverssuchasIBMPower,IBMPERCS,andIBMBladeCenter.IBMOpenCLCommonRuntime:ThisSDKsupportsOpenCVonCPUsandGPUs,suchasX86+SSE2(orhigher)CPUsandAMDFusionandRaedon,NVIDIAIon,NVIDIAGeForce,andNVIDIAQuadroGPUs.NvidiaOpenCLDriverandTools:ThisSDKsupportsOpenCLonsomeNvidiagraphicdevicessuchasNVIDIATesla,NVIDIAGeForce,NVIDIAIon,andNVIDIAQuadroGPUs.
![Page 273: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/273.jpg)
OpenCVwiththeOpenCLinstallationTheinstallationstepsalreadypresentedinChapter1,HandlingImageandVideoFiles,needsomeadditionalstepstoincludeOpenCL.Thenewlyrequiredsoftwareisexplainedinthefollowingsection.
TherearenewrequirementstocompileandinstallOpenCVwithOpenCLonWindows:
OpenCL-capableGPUorCPU:Thisisthemostimportantrequirement.NotethatOpenCLsupportsmanycomputingdevicesbutnotall.YoucancheckwhetheryourgraphiccardsorprocessorsarecompatiblewithOpenCL.ThischapterusestheAMDAPPSDKforanAMDFireProW5000GPUtoexecutetheexamples.
NoteThereisalistwiththesupportedcomputerdevicesforthisSDKathttp://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/system-requirements-driver-compatibility/.There,youcanalsoconsulttheminimumSDKversionthatyouneed.
Compilers:OpenCVwithOpenCLiscompatiblewithMicrosoftandMinGWcompilers.ItispossibletoinstallthefreeVisualStudioExpressedition.However,ifyouchooseMicrosofttocompileOpenCV,atleastVisualStudio2012isrecommended.However,theMinGWcompilerisusedinthischapter.AMDAPPSDK:ThisSDKisasetofadvancedsoftwaretechnologiesthatenableustousecompatiblecomputingdevicestoexecuteandacceleratemanyapplicationsbeyondjustgraphics.ThisSDKisavailableathttp://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/.ThischapterusesVersion2.9oftheSDK(for64bitWindows);youcanseetheinstallationprogressinthefollowingscreenshot.
NoteIfthisstepfails,maybeyoumightneedtoupdatethecontrollerofyourgraphiccard.TheAMDcontrollersareavailableathttp://www.amd.com/en-us/innovations/software-technologies.
![Page 274: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/274.jpg)
InstallingtheAMDAPPSDK
OpenCLBLAS:BasicLinearAlgebraSubroutines(BLAS)isasetofopensourcemathlibrariesforparallelprocessingonAMDdevices.Itcanbedownloadedfromhttp://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-math-libraries/.Thischapterusesthe1.1BLASversionforWindows32/64bits,andyoucanseetheinstallationprogressinthefollowingscreenshot(theleft-handside).OpenCLFFT:FastFourierTransform(FFT)isaveryusefulfunctionthatmanyalgorithmsofimageprocessingneed.Therefore,thisfunctionisimplementedforparallelprocessingonAMDdevices.ItcanbedownloadedfromthesameURLasgivenpreviously.Thischapterusesthe1.1FFTversionforWindows32/64bits,andyoucanseetheinstallationprogressinthefollowingscreenshot(theright-handside):
![Page 275: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/275.jpg)
InstallingBLASandFFTforOpenCL
QtlibrariesforC++compiler:Inthischapter,theMinGWbinariesofQtlibrariesareusedtocompileOpenCVwithOpenCL.TheotheralternativeistoinstallthelatestversionofQtandusetheVisualC++compiler.YoucanchoosetheQtversionandusedcompiler.Thepackagemanager,bymeansoftheMaintenanceTool.exeapplicationlocatedatC:\Qt\Qt5.3.1,canbeusedtodownloadotherQtversions.ThischapterusesQt(5.3.1)andMinGW(4.8.2)32bitstocompileOpenCVwithOpenCL.
Whenthepreviousrequirementsaremet,youcangenerateanewbuildconfigurationwithCMake.Thisprocessdiffersinsomepointsfromthetypicalinstallationthatwasexplainedinthefirstchapter.Thedifferencesareexplainedinthislist:
Whenselectingthegeneratorfortheproject,youcanchoosethecompilerversioncorrespondingwiththeinstalledenvironmentinyourmachine.ThischapterusesMinGWtocompileOpenCVwithOpenCL,andthentheMinGWMakefilesoptionisselected,specifyingthenativecompilers.Thefollowingscreenshotshowsthisselection:
CMakeselectingthegeneratorproject
TheoptionsshowninthefollowingscreenshotareneededtobuildtheOpenCVwithOpenCLproject.TheWITH_OPENCL,WITH_OPENCLAMDBLAS,andWITH_OPENCLAMDFFToptionsmustbeenabled.TheBLASandFFTpathsmustbeintroducedonCLAMDBLAS_INCLUDE_DIR,CLAMDBLAS_ROOT_DIR,CLAMDFFT_INCLUDE_DIR,andCLAMDFFT_ROOT_DIR.Inaddition,asshowninChapter1,HandlingImageandVideoFiles,youwillneedtoenableWITH_QTanddisabletheWITH_IPPoptionaswell.ItisalsoadvisabletoenableBUILD_EXAMPLES.Thefollowingscreenshotshowsyouthemainoptionsselectedinthebuildconfiguration:
![Page 276: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/276.jpg)
CMakeselectingthemainoptions
Finally,tobuildtheOpenCVwithOpenCLproject,theCMakeprojectthatwaspreviouslygeneratedmustbecompiled.TheprojectwasgeneratedforMinGW,andtherefore,theMinGWcompilerisneededtobuildthisproject.Firstly,the[opencv_build]/folderisselectedwithWindowsConsole,andweexecutethis:
./mingw32-make.exe-j4install
The-j4parameteristhenumberofthecoreCPUsofthesystemthatwewanttousefor
![Page 277: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/277.jpg)
theparallelizationofthecompilation.
NowtheOpenCVwithOpenCLprojectisreadytobeused.Thepathofthenewbinariesfilesmustbeaddedtothesystempath,inthiscase,[opencv_build]/install/x64/mingw/bin.
NoteDonotforgettoremovetheoldbinaryfilesofOpenCVfromthepathenvironmentvariable.
![Page 278: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/278.jpg)
AquickrecipetoinstallOpenCVwithOpenCLTheinstallationprocesscanbesummarizedinthefollowingsteps:
1. DownloadandinstallAMDAPPSDK,whichisavailableathttp://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk.
2. DownloadandinstallBLASandFFTAMD,whichareavailableathttp://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-math-libraries.
3. ConfiguretheOpenCVbuildwithCMake.EnabletheWITH_OPENCL,WITH_OPENCLAMDBLAS,WITH_QT,andBuild_EXAMPLESWITH_OPENCLAMDFFToptions.DisabletheWITH_IPPoption.Finally,introducetheBLASandFFTpathsonCLAMDBLAS_INCLUDE_DIR,CLAMDBLAS_ROOT_DIR,CLAMDFFT_INCLUDE_DIR,andCLAMDFFT_ROOT_DIR.
4. CompiletheOpenCVprojectwithmingw32-make.exe.5. Finally,modifythepathenvironmentvariabletoupdatetheOpenCVbindirectory
(forexample,[opencv_build]/install/x64/mingw/bin).
![Page 279: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/279.jpg)
ChecktheGPUusageWhentheGPUisbeingusedonaWindowsplatform,thereisnoapplicationtomeasureitsusage.TheGPUusageisusefulfortworeasons:
ItispossibletoknowwhetheryouareusingtheGPUcorrectlyYoucanmonitortheGPUusagepercentage
Therearesomeapplicationsinthemarketforthispurpose.ThischapterusesAMDSystemMonitortochecktheGPUusage.ThisapplicationmonitorstheCPU,memoryRAM,andGPUusage.Refertothefollowingscreenshotforthis:
AMDSystemMonitormonitorstheCPU,GPU,andMemoryRAMusages
Note
![Page 280: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/280.jpg)
TheAMDSystemMonitorcanbedownloadedfromhttp://support.amd.com/es-xl/kb-articles/Pages/AMDSystemMonitor.aspxforMicrosoftWindows(32or64bits).
![Page 281: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/281.jpg)
![Page 282: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/282.jpg)
AcceleratingyourownfunctionsInthissection,therearethreeexamplesofusingOpenCVwithOpenCL.ThefirstexampleallowsyoutocheckwhethertheinstalledSDKisavailableandobtainusefulinformationaboutthecomputingdevicesthatsupportOpenCL.ThesecondexampleshowsyoutwoversionsofthesameprogramusingCPUandGPUprogramming,respectively.Thelastexampleisacompleteprogramtodetectandmarkfaces.Inaddition,acomputationalcomparativeisperformed.
![Page 283: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/283.jpg)
CheckingyourOpenCLThefollowingisasimpleprogramthatisshowntocheckyourSDKandtheavailablecomputingdevices.ThisexampleiscalledcheckOpenCL.ItallowsyoutodisplaythecomputerdevicesusingtheOCLmoduleofOpenCV:
#include<opencv2/opencv.hpp>
#include<opencv2/core/ocl.hpp>
usingnamespacestd;
usingnamespacecv;
usingnamespacecv::ocl;
intmain()
{
vector<ocl::PlatformInfo>info;
getPlatfomsInfo(info);
PlatformInfosdk=info.at(0);
if(sdk.deviceNumber()<1)
return-1;
cout<<"******SDK*******"<<endl;
cout<<"Name:"<<sdk.name()<<endl;
cout<<"Vendor:"<<sdk.vendor()<<endl;
cout<<"Version:"<<sdk.version()<<endl;
cout<<"Numberofdevices:"<<sdk.deviceNumber()<<endl;
for(inti=0;i<sdk.deviceNumber();i++){
Devicedevice;
sdk.getDevice(device,i);
cout<<"\n\n*********************\nDevice"<<i+1<<endl;
cout<<"VendorID:"<<device.vendorID()<<endl;
cout<<"Vendorname:"<<device.vendorName()<<endl;
cout<<"Name:"<<device.name()<<endl;
cout<<"Driverversion:"<<device.driverVersion()<<endl;
if(device.isAMD())cout<<"IsanAMDdevice"<<endl;
if(device.isIntel())cout<<"IsaInteldevice"<<endl;
cout<<"GlobalMemorysize:"<<device.globalMemSize()<<endl;
cout<<"Memorycachesize:"<<device.globalMemCacheSize()<<endl;
cout<<"Memorycachetype:"<<device.globalMemCacheType()<<endl;
cout<<"LocalMemorysize:"<<device.localMemSize()<<endl;
cout<<"LocalMemorytype:"<<device.localMemType()<<endl;
cout<<"MaxClockfrequency:"<<device.maxClockFrequency()<<
endl;
}
return0;
}
ThecodeexplanationThisexampledisplaystheinstalledSDKandtheavailablecomputingdevicesthatarecompatiblewithOpenCL.Firstly,thecore/ocl.hppheaderisincludedandthecv::ocl
![Page 284: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/284.jpg)
namespaceisdeclared.
TheinformationabouttheavailableSDKinyourcomputerisobtainedusingthegetPlatfomsInfo(info)method.Thisinformationisstoredinthevector<ocl::PlatformInfo>infovectorandselectedwithPlatformInfosdk=info.at(0).Afterwards,themaininformationaboutyourSDKisshown,suchasthename,vendor,SDKversion,andthenumberofcomputingdevicescompatiblewithOpenCL.
Finally,foreachcompatibledevice,itsinformationisobtainedwiththesdk.getDevice(device,i)method.Nowdifferentinformationabouteachcomputingdevicecanbeshown,suchasthevendorID,vendorname,driverversion,globalmemorysize,memorycachesize,andsoon.
Thefollowingscreenshotshowsyoutheresultsofthisexampleforthecomputerused:
InformationabouttheSDKusedandcompatiblecomputingdevices
![Page 285: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/285.jpg)
YourfirstGPU-basedprogramInthefollowingcode,twoversionsofthesameprogramareshown:oneonlyusestheCPU(native)toperformthecomputationsandtheotherusestheGPU(withOpenCL).ThesetwoexamplesarecalledcalculateEdgesCPUandcalculateEdgesGPU,respectively,andallowyoutoobservethedifferencesbetweenCPUandGPUversions.
ThecalculateEdgesCPUexampleisshowninthefirstplace:
#include<opencv2/opencv.hpp>
usingnamespacestd;
usingnamespacecv;
intmain(intargc,char*argv[])
{
if(argc<2)
{
cout<<"./calculateEdgesCPU<image>"<<endl;
return-1;
}
MatcpuFrame=imread(argv[1]);
MatcpuBW,cpuBlur,cpuEdges;
namedWindow("CannyEdgesCPU",1);
cvtColor(cpuFrame,cpuBW,COLOR_BGR2GRAY);
GaussianBlur(cpuBW,cpuBlur,Size(1,1),1.5,1.5);
Canny(cpuBlur,cpuEdges,50,100,3);
imshow("CannyEdgesCPU",cpuEdges);
waitKey();
return0;
}
Now,thecalculateEdgesGPUexampleisshown:
#include"opencv2/opencv.hpp"
#include"opencv2/core/ocl.hpp"
usingnamespacestd;
usingnamespacecv;
usingnamespacecv::ocl;
intmain(intargc,char*argv[])
{
if(argc<2)
{
cout<<"./calculateEdgesGPU<image>"<<endl;
return-1;
}
setUseOpenCL(true);
![Page 286: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/286.jpg)
MatcpuFrame=imread(argv[1]);
UMatgpuFrame,gpuBW,gpuBlur,gpuEdges;
cpuFrame.copyTo(gpuFrame);
namedWindow("CannyEdgesGPU",1);
cvtColor(gpuFrame,gpuBW,COLOR_BGR2GRAY);
GaussianBlur(gpuBW,gpuBlur,Size(1,1),1.5,1.5);
Canny(gpuBlur,gpuEdges,50,100,3);
imshow("CannyEdgesGPU",gpuEdges);
waitKey();
return0;
}
ThecodeexplanationThesetwoexamplesobtainthesameresult,asshowninthefollowingscreenshot.Theyreadanimagefromthestandardcommand-lineinputarguments.Afterwards,theimageisconvertedtograyscaleandtheGaussianBlurandtheCannyfilterfunctionsareapplied.
Inthesecondexample,therearesomedifferencesthatarerequiredtoworkwiththeGPU.First,OpenCLmustbeactivatedwiththesetUseOpenCL(true)method.Second,UnifiedMats(UMat)areusedtoallocatememoryintheGPU(UMatgpuFrame,gpuBW,gpuBlur,gpuEdges).Third,theinputimageiscopiedfromtheRAMtoGPUmemorywiththecpuFrame.copyTo(gpuFrame)method.Now,whenthefunctionsareused,iftheyhaveanOpenCLimplementation,thenthesefunctionswillbeexecutedontheGPU.IfsomeofthesefunctionsdonothaveanOpenCLimplementation,thenormalfunctionwillbeexecutedontheCPU.Inthisexample,thetimeelapseusingtheGPUprogramming(secondexample)is10timesbetter:
![Page 287: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/287.jpg)
Resultsoftheprecedingtwoexamples
![Page 288: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/288.jpg)
GoingrealtimeOneofthemainadvantagesofGPUprocessingistoperformcomputationsinamuchfasterway.Thisincreaseinspeedallowsyoutoexecuteheavycomputationalalgorithmsinreal-timeapplications,suchasstereovision,pedestriandetection,opticalflow,orfacedetection.ThefollowingdetectFacesexampleshowsyouanapplicationtodetectfacesfromavideocamera.ThisexamplealsoallowsyoutoselectbetweentheCPUorGPUprocessinginordertocomparethecomputationaltime.
IntheOpenCVexamples([opencv_source_code]/samples/cpp/facedetect.cpp),arelatedfacedetectorexamplecanbefound.ForthefollowingdetectFacesexample,thedetectFace.proprojectneedstheselibraries:-lopencv_core300,-opencv_imgproc300,-lopencv_highgui300,-lopencv_videoio300,andlopencv_objdetct300.
ThedetectFacesexampleusestheoclmoduleofOpenCV:
#include<opencv2/core/core.hpp>
#include<opencv2/core/ocl.hpp>
#include<opencv2/objdetect.hpp>
#include<opencv2/videoio.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
#include<stdio.h>
usingnamespacestd;
usingnamespacecv;
usingnamespacecv::ocl;
intmain(intargc,char*argv[])
{
//1-Settheinitialparameters
//Vectortostorethefaces
vector<Rect>faces;
CascadeClassifierface_cascade;
Stringface_cascade_name=argv[2];
intface_size=30;
doublescale_factor=1.1;
intmin_neighbours=2;
VideoCapturecap(0);
UMatframe,frameGray;
boolfinish=false;
//2-Loadthefilexmltousetheclassifier
if(!face_cascade.load(face_cascade_name))
{
cout<<"Cannotloadthefacexml!"<<endl;
return-1;
}
namedWindow("VideoCapture");
![Page 289: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/289.jpg)
//3-SelectbetweentheCPUorGPUprocessing
if(argc<2)
{
cout<<"./detectFaces[CPU/GPU|C/G]"<<endl;
cout<<"TryingtouseGPU…"<<endl;
setUseOpenCL(true);
}
else
{
cout<<"./detectFacestryingtouse"<<argv[1]<<endl;
if(argv[1][0]=='C')
//TryingtousetheCPUprocessing
setUseOpenCL(false);
else
//TryingtousetheGPUprocessing
setUseOpenCL(true);
}
Rectr;
doublestart_time,finish_time,start_total_time,finish_total_time;
intcounter=0;
//4-Detectthefacesforeachimagecapture
start_total_time=getTickCount();
while(!finish)
{
start_time=getTickCount();
cap>>frame;
if(frame.empty())
{
cout<<"Nocaptureframe-->finish"<<endl;
break;
}
cvtColor(frame,frameGray,COLOR_BGR2GRAY);
equalizeHist(frameGray,frameGray);
//Detectthefaces
face_cascade.detectMultiScale(frameGray,faces,scale_factor,
min_neighbours,0|CASCADE_SCALE_IMAGE,Size(face_size,face_size));
//Foreachdetectedface
for(intf=0;f<faces.size();f++)
{
r=faces[f];
//Drawarectangleovertheface
rectangle(frame,Point(r.x,r.y),Point(r.x+r.width,r.y+r.height),
Scalar(0,255,0),3);
}
//Showtheresults
imshow("VideoCapture",frame);
//Calculatethetimeprocessing
![Page 290: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/290.jpg)
finish_time=getTickCount();
cout<<"Timeperframe:"<<(finish_time-start_time)/getTickFrequency()
<<"secs"<<endl;
counter++;
//PressEsckeytofinish
if(waitKey(1)==27)finish=true;
}
finish_total_time=getTickCount();
cout<<"Averagetimeperframe:"<<((finish_total_time-
start_total_time)/getTickFrequency())/counter<<"secs"<<endl;
return0;
}
ThecodeexplanationThefirststepsetstheinitialparameters,suchasthexmlfile(Stringface_cascade_nameargv[2])thatusestheclassifiertodetectthefaces,theminimumsizeofeachdetectedface(face_size=30),thescalefactor(scale_factor=1.1),andtheminimumnumberofneighbors(min_neighbours=2)tofindatrade-offbetweentruepositiveandfalsepositivedetections.YoucanalsoseethemoreimportantdifferencesbetweentheCPUandGPUsourcecodes;youonlyneedtousetheUnifiedMat(UMatframe,frameGray).
NoteThereareotheravailablexmlfilesinthe[opencv_source_code]/data/haarcascades/foldertodetectdifferentbodypartssuchaseyes,lowerbodies,smiles,andsoon.
Thesecondstepcreatesadetectorusingtheprecedingxmlfiletodetectfaces.ThisdetectorisbasedonaHaarfeature-basedclassifierthatisaneffectiveobject-detectionmethodproposedbyPaulViolaandMichaelJones.Thisclassifierhasahighaccuracyofdetectingfaces.Thissteploadsthexmlfilewiththeface_cascade.load(face_cascade_name)method.
NoteYoucanfindmoredetailedinformationaboutPaulViolaandMichaelJonesmethodathttp://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework.
ThethirdstepallowsyoutoselectbetweentheCPUorGPUprocessing(setUseOpenCL(false)orsetUseOpenCL(true),respectively).Thisexampleusesthestandardcommand-lineinputarguments(argv[1])toselectthis.TheusercanexecutethefollowingfromtheWindowsconsoletoselectbetweenCPUorGPUprocessing,respectively,andtheclassifierpath:
<bin_dir>/detectFacesCPUpathClassifier
<bin_dir>/detectFacesGPUpathClassifier
Iftheuserdoesnotintroduceaninputargument,thenGPUprocessingisused.
Thefourthstepdetectsfacesforeachimagecapturedfromthevideocamera.Beforethat,
![Page 291: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/291.jpg)
eachcapturedimageisconvertedtograyscale(cvtColor(frame,frameGray,COLOR_BGR2GRAY))anditshistogramisequalized(equalizeHist(frameGray,frameGray)).Afterwards,usingthecreatedfacedetector,thedifferentfacesaresearchedoverthecurrentframeusingtheface_cascade.detectMultiScale(frameGray,faces,scale_factor,min_neighbours,0|CASCADE_SCALE_IMAGE,
Size(face_size,face_size))multiscaledetectionmethod.Finally,agreenrectangleisdrawnovereachdetectedface,andthenitisdisplayed.Ascreenshotofthisexamplerunningisshowninthefollowingscreenshot:
Theprecedingexampledetectingaface
TheperformanceIntheprecedingexample,thecomputationaltimeiscalculatedtocomparetheCPUandGPUprocessing.Theaverageprocessingtimeperframeisobtained.
AbigadvantageofchoosingGPUprogrammingisperformance.Therefore,thepreviousexamplecalculatesthetimemeasurementstocomparethespeedupsobtainedwithrespecttotheCPUversion.ThetimeisstoredatthebeginningoftheprogramusingthegetTickCount()method.Afterwards,attheendoftheprogram,thesamefunctiontoestimatethetimeisusedagain.Acounterisstoredtoknowthenumberofiterationsaswell.Finally,theaverageprocessingtimeperframeiscalculated.Theprecedingexamplehasanaverageprocessingtimeperframeof0.057secondsperframe(or17.5FPS)usingtheGPU,whereasthesameexampleusingtheCPUhasanaverageprocessingtimeperframeof0.335secondsperframe(or2.9FPS).Inconclusion,thereisaspeedincrementof6x.Thisincrementissignificant,especiallywhenyouonlyneedtochangeafewlines
![Page 292: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/292.jpg)
ofthecode.However,itispossibletoachieveamuchhigherrateofspeedincrements,whichisrelatedtotheproblemandevenwithhowthekernelsaredesigned.
![Page 293: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/293.jpg)
![Page 294: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/294.jpg)
SummaryInthischapter,youlearnedhowtoinstallOpenCVwithOpenCLonyourcomputeranddevelopapplicationsusingyourcomputerdevices,whicharecompatiblewithOpenCL,withthelastversionofOpenCV.
ThefirstsectionexplainswhatOpenCLisandtheavailableSDKs.Rememberthatdependingyourcomputingdevices,youwillneedaspecificSDKtoworkcorrectlywithOpenCL.Inthesecondsection,theinstallationprocesstoinstallOpenCVwithOpenCLisexplained,andtheAMDAPPSDKhasbeenused.Inthelastsection,therearethreeexamplesusingGPUprogramming(thesecondexamplealsohasaCPUversioninordertocomparethem).Inaddition,inthelastsection,thereisacomputationalcomparativebetweenCPUandGPUprocessing,wheretheGPUisshowntobesixtimesfasterthantheCPUversion.
![Page 295: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/295.jpg)
IndexA
affinetransformationabout/Affinetransformationscaling/Scalingtranslation/Translationimagerotation/Imagerotationskewing/Skewingreflection/Reflection
alignment,HDRimages/AlignmentAMDAPPSDK
URL/OpenCVwiththeOpenCLinstallation,AquickrecipetoinstallOpenCVwithOpenCL
AMDcontrollersURL/OpenCVwiththeOpenCLinstallation
AMDSystemMonitorURL,fordownloading/ChecktheGPUusage
arithmeticoperationsabout/Arithmeticoperations
![Page 296: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/296.jpg)
BbasicAPIconcepts
about/ThebasicAPIconceptsbasicdatatypes
about/BasicdatatypesBayer
about/Bayerexamplecode/Theexamplecode
BilateralTV-L1algorithmabout/Superresolutionparameters/Superresolution
BilateralTV-Lmethodabout/SuperresolutionURL/Superresolution
bitsperpixel(bpp)/High-dynamic-rangeimagesBLAS
URL/OpenCVwiththeOpenCLinstallation,AquickrecipetoinstallOpenCVwithOpenCL
BSDlicenseabout/AnintroductiontoOpenCV
bundleadjustment/Stitchingbuttons
about/Buttons
![Page 297: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/297.jpg)
CC++
OpenCVapplication,creatingwith/GeneralusageofthelibrarycalculateEdgesCPUexample
about/YourfirstGPU-basedprogramcode/Thecodeexplanation
calculateEdgesGPUexampleabout/YourfirstGPU-basedprogramcode/Thecodeexplanation
checkOpenCLexampleabout/CheckingyourOpenCLcode/Thecodeexplanation
CIEL*a*b*about/CIEL*a*b*examplecode/Theexamplecode
CIEL*u*v*about/CIEL*u*v*examplecode/Theexamplecode
CIEXYZabout/CIEXYZexamplecode/Theexamplecode
CMakesetting/GettingacompilerandsettingCMakeabout/GettingacompilerandsettingCMakeURL/GettingacompilerandsettingCMakeOpenCV,configuringwith/ConfiguringOpenCVwithCMakelibrary,installing/Compilingandinstallingthelibrarylibrary,compiling/Compilingandinstallingthelibrary
color-space-basedsegmentationabout/Color-space-basedsegmentationHSVsegmentation/HSVsegmentationYCrCbsegmentation/YCrCbsegmentation
colorspacesabout/Colorspacesconversion,withcvtColormethod/Conversionbetweencolorspaces(cvtColor)RGB/RGBgrayscale/GrayscaleCIEXYZ/CIEXYZYCrCb/YCrCbHSV/HSVHLS/HLSCIEL*a*b*/CIEL*a*b*CIEL*u*v*/CIEL*u*v*
![Page 298: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/298.jpg)
Bayer/Bayercolortransfer
about/Colortransferexamplecode/Theexamplecode
ColourImageComparisonexample,histogramsabout/Theexamplecode
ColourImageEqualizeHistexample,histogramsabout/Theexamplecodesourceimagewindow/Theexamplecodeequalizedcolorimagewindow/Theexamplecodehistogramofthreechannelswindow/TheexamplecodehistogramofRGBchannelfortheequalizedimagewindow/Theexamplecode
CommissionInternationaledeL’Éclairage(CIE)about/CIEXYZ
compilerkits,OpenCVC++applicationsMicrosoftVisualC(MSVC)/ToolstodevelopnewprojectsGNUGCC(GNUCompilerCollection)/Toolstodevelopnewprojects
ComputeUnifiedDeviceArchitecture(CUDA)about/AnintroductiontoOpenCV
cvtColormethodused,forcolorspacesconversion/Conversionbetweencolorspaces(cvtColor)srcargument/Conversionbetweencolorspaces(cvtColor)dstargument/Conversionbetweencolorspaces(cvtColor)codeargument/Conversionbetweencolorspaces(cvtColor)dstCnargument/Conversionbetweencolorspaces(cvtColor)
cylindricalprojection/Stitching
![Page 299: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/299.jpg)
Ddatapersistence
about/Datapersistencedecolorization
about/Decolorizationexample/Decolorization
denoisingabout/Denoisingreferencelink/Denoisingfunctions/Denoisingexamplecode/Theexamplecode
detectFacesexampleabout/Goingrealtimecode/Goingrealtime,Thecodeexplanation
digitalstabilizationsystemsabout/Videostabilization
![Page 300: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/300.jpg)
EestimatePiexample
about/Arithmeticoperationsexposurefusion,HDRimages/Exposurefusionextrapolationmethods
about/Geometricaltransformations
![Page 301: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/301.jpg)
FFarnebackopticalflowmethod
URL/SuperresolutionFFTAMD
URL/AquickrecipetoinstallOpenCVwithOpenCLfilestructure,OpenCV
headerfiles/ThestructureofOpenCVlibrarybinaries/ThestructureofOpenCVsamplebinaries/ThestructureofOpenCV
fourcccodeURL/Theexamplecode
functions,acceleratingabout/AcceleratingyourownfunctionscheckOpenCLexample/CheckingyourOpenCLcalculateEdgesCPUexample/YourfirstGPU-basedprogramcalculateEdgesGPUexample/YourfirstGPU-basedprogramdetectFacesexample/GoingrealtimeGPUprogramming,performance/Theperformance
functions,seamlessCloningexamplecolorChange/SeamlesscloningilluminationChange/SeamlesscloningtextureFlattening/Seamlesscloning
![Page 302: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/302.jpg)
GGaussianpyramids
about/Gaussianpyramidsfunctions/Gaussianpyramids
GDAL(GeographicDataAbstractionLibrary)about/Imagefile-supportedformats
geometricaltransformationsabout/Geometricaltransformationsextrapolationmethods/Geometricaltransformationsinterpolationmethods/Geometricaltransformationsaffinetransformation/Affinetransformationperspectivetransformation/Perspectivetransformation
GNUGCConlinedocumentation,URL/Generalusageofthelibrary
GNUtoolkit/GettingacompilerandsettingCMakeGPUusage
checking/ChecktheGPUusageGraphicProcessingUnit(GPU)
about/AnintroductiontoOpenCVgrayscale
about/Grayscaleexamplecode/Examplecode
GUI(GraphicalUserInterface)/ConfiguringOpenCVwithCMake
![Page 303: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/303.jpg)
HHaarfeature-basedclassifier/ThecodeexplanationHDRimages
about/High-dynamic-rangeimagescreating/CreatingHDRimagescreateHDRexample/Exampletonemapping/Tonemappingalignment/Alignmentexposurefusion/Exposurefusion
hdr_imagingtutorialURL,forfileprerequisites/Example
HighDynamicRange(HDR)/ThestructureofOpenCVhighdynamicrange(HDR)
about/AnintroductiontoOpenCVhistogramequalization
about/Histogramshistograms
about/HistogramsColourImageEqualizeHistexample/TheexamplecodeColourImageComparisonexample/Theexamplecode
HLSabout/HLSexamplecode/Theexamplecode
HSVabout/HSVhue/HSVsaturation/HSVvalue/HSVexamplecode/Theexamplecode
HSVsegmentationabout/HSVsegmentation
![Page 304: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/304.jpg)
IIDE(IntegratedDevelopmentEnvironment)/GettingacompilerandsettingCMakeimagecapturingprocess
about/Superresolutionsampling/Superresolutiongeometrictransformation/Superresolutionblur/Superresolutionsubsampling/Superresolution
imagefile-supportedformatsabout/Imagefile-supportedformats
imagefilesreading/Readingandwritingimagefiles,Readingimagefileswriting/Readingandwritingimagefiles,Writingimagefilesexamplecode/Theexamplecodeeventhandling,intointrinsicloop/Eventhandlingintotheintrinsicloop
imagefilteringabout/Imagefilteringsmoothing/Smoothingsharpening/Sharpeningimagepyramids/Workingwithimagepyramids
imageprocessingtimemeasuring/Measuringthetime
imagepyramidsabout/WorkingwithimagepyramidsLaplacianpyramids/Workingwithimagepyramids,LaplacianpyramidsGaussianpyramids/Gaussianpyramidsexamplecode/Theexamplecode
imagerotationabout/Imagerotationexamplecode/Theexamplecode
imagestitchingabout/StitchingURL/Stitchingregistration/Stitchingcalibration/Stitchingcompositing/StitchingstitchingAdvancedexample/Stitching
imshowfunctionabout/Theexamplecode
inpaintingabout/Inpaintingfunctions/Inpaintingreferencelink/Inpainting
![Page 305: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/305.jpg)
examplecode/TheexamplecodeIntegratedDevelopmentEnvironment(IDE/ToolstodevelopnewprojectsIntegratedPerformancePrimitives(IPP)
about/AnintroductiontoOpenCVIntelIntegratedPerformancePrimitives(IPP)/ConfiguringOpenCVwithCMakeinterpolationmethods
about/Geometricaltransformations
![Page 306: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/306.jpg)
Kkernel
about/Smoothing
![Page 307: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/307.jpg)
LLaplacianpyramids
about/Workingwithimagepyramids,LaplacianpyramidsLinux/CompilingandinstallingthelibraryLuminanceHDR/TonemappingLUTs
about/LUTsexamplecode/Theexamplecode
![Page 308: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/308.jpg)
MMake
onlinedocumentation,URL/Generalusageofthelibrarymapprojections
about/Stitchingrectilinear/Stitchingcylindrical/Stitchingspherical/Stitchingstereographic/Stitchingpanini/Stitching
mean-siftsegmentationreferencelink/Gaussianpyramids
mechanicalstabilizationsystemsabout/Videostabilization
MinGW(MinimalGNUGCC)/Toolstodevelopnewprojectsmipmap
about/Workingwithimagepyramidsmodules,OpenCV
core/ThestructureofOpenCVhighgui/ThestructureofOpenCVimgproc/ThestructureofOpenCVimgcodecs/ThestructureofOpenCVphoto/ThestructureofOpenCVstitching/ThestructureofOpenCVvideoio/ThestructureofOpenCVvideo/ThestructureofOpenCVfeatures2d/ThestructureofOpenCVobjdetect/ThestructureofOpenCV
morphologicaloperationsabout/Morphologicaloperationsfunctions/Morphologicaloperationsexamplecode/Theexamplecode
mouseinteractionabout/Mouseinteraction
![Page 309: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/309.jpg)
Nnon-photorealisticrendering
about/Non-photorealisticrenderingedgePreservingFiltereffect/Non-photorealisticrenderingdetailEnhanceeffect/Non-photorealisticrenderingstylizationeffect/Non-photorealisticrendering
![Page 310: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/310.jpg)
OOpenComputingLanguage(OpenCL)
about/AnintroductiontoOpenCVOpenCV
about/AnintroductiontoOpenCVURL,fordownloading/DownloadingandinstallingOpenCVdownloading/DownloadingandinstallingOpenCVinstalling/DownloadingandinstallingOpenCVURL,formainrepository/DownloadingandinstallingOpenCVURL,fortestdatarepository/DownloadingandinstallingOpenCVURL,forcontributionsrepository/DownloadingandinstallingOpenCVURL,fordocumentationsite/DownloadingandinstallingOpenCVURL,fordevelopmentrepository/DownloadingandinstallingOpenCVURL,fortutorials/DownloadingandinstallingOpenCVcompiler,obtaining/GettingacompilerandsettingCMakeconfiguring,withCMake/ConfiguringOpenCVwithCMakestructure/ThestructureofOpenCVreferencelink,formodules/ThestructureofOpenCVuserprojects,creatingwith/CreatinguserprojectswithOpenCV
OpenCV,withOpenCLinstallationprocess/AquickrecipetoinstallOpenCVwithOpenCL
OpenCVAPIURL/Writingimagefiles
OpenCVapplicationdeveloping,withC++/Generalusageofthelibrary
OpenCVC++applicationsprerequisites/Toolstodevelopnewprojects
OpenCVC++programcreating,withQtCreator/CreatinganOpenCVC++programwithQtCreator
operations,withimagesabout/Commonoperationswithimages
opticalflowmethodsbrox/Superresolutionpyrlk/Superresolutionfarneback/Superresolutiontvl1/Superresolutioncomparing/Superresolution
![Page 311: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/311.jpg)
Ppaniniprojection/Stitchingparameters,BilateralTV-L1algorithm
scale/Superresolutioniterations/Superresolutiontau/Superresolutionlamba/Superresolutionalpha/SuperresolutionbtvKernelSize/SuperresolutionblurKernelSize/SuperresolutionblurSigma/SuperresolutiontemporalAreaRadius/SuperresolutionopticalFlow/Superresolution
perspectivetransformationabout/Perspectivetransformationfunctions/Perspectivetransformationexamplecode/Theexamplecode
pfstools/Tonemappingpixel-levelaccess
about/Pixel-levelaccessprerequisites,OpenCVC++applications
OpenCVheaderfilesandlibrarybinaries/ToolstodevelopnewprojectsC++compiler/Toolstodevelopnewprojectsauxiliarylibraries/Toolstodevelopnewprojects
pyramidabout/Workingwithimagepyramids
![Page 312: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/312.jpg)
QQtbundle
URL,fordownloading/ToolstodevelopnewprojectsQtCreator
about/ToolstodevelopnewprojectsOpenCVC++program,creatingwith/CreatinganOpenCVC++programwithQtCreator
Qtframeworkabout/GettingacompilerandsettingCMakeURL/GettingacompilerandsettingCMake
QtprojectURL/CreatinganOpenCVC++programwithQtCreator
![Page 313: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/313.jpg)
RRANSACmethod
URL/VideostabilizationRapidEnvironmentEditortool
URL/GettingacompilerandsettingCMakerectilinearprojection/Stitchingreflection
about/Reflectionexamplecode/Theexamplecode
requisites,forinstallingOpenCVwithOpenCLabout/OpenCVwiththeOpenCLinstallationOpenCL-capableGPUorCPU/OpenCVwiththeOpenCLinstallationcompilers/OpenCVwiththeOpenCLinstallationAMDAPPSDK/OpenCVwiththeOpenCLinstallationOpenCLBLAS(BasicLinearAlgebraSubroutines)/OpenCVwiththeOpenCLinstallationOpenCLFFT(FastFourierTransform)/OpenCVwiththeOpenCLinstallationQtlibraries,forC++compiler/OpenCVwiththeOpenCLinstallation
RGBabout/RGBexamplecode/Theexamplecode
![Page 314: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/314.jpg)
Sscaling
about/Scalingexamplecode/Theexamplecode
seamlesscloningabout/Seamlesscloning
seamlessCloningexampleabout/Seamlesscloningfunctions/Seamlesscloning
sharpeningabout/Sharpeningfunctions/Sharpeningexamplecode/Theexamplecode
skewingabout/Skewingexamplecode/Theexamplecode
smoothingabout/Smoothingfunctions/Smoothingexamplecode/Theexamplecode
sphericalprojection/Stitchingstandardtemplatelibrary(STL)
about/ThebasicAPIconceptsstereographicprojection/Stitchingsticher/Stitchingsuperresmodule/Superresolutionsuperresolution
about/SuperresolutionURL,forexample/Superresolutionexample/Superresolution
![Page 315: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/315.jpg)
TThreadingBuildingBlocks(TBB)
about/AnintroductiontoOpenCVtonemapping,HDRimages/Tonemappingtrackbars
about/Trackbarstranslation
about/Translationexamplecode/Theexamplecode
TVL1(TotalVariationL1)about/Denoising
![Page 316: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/316.jpg)
UUnifiedMats(UMat)/Thecodeexplanationuser-interactionstools
about/User-interactionstoolstrackbars/Trackbarsmouseinteraction/Mouseinteractionbuttons/Buttonstext,drawing/Drawinganddisplayingtexttext,displaying/Drawinganddisplayingtext
userinterface(UI)/ThestructureofOpenCVuserprojects
creating,withOpenCV/CreatinguserprojectswithOpenCV
![Page 317: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/317.jpg)
Vvideofiles
writing/Readingandwritingvideofilesreading/ReadingandwritingvideofilesrecVideoexample/Theexamplecode
videostabilizationabout/Videostabilizationmechanicalstabilizationsystems/Videostabilizationdigitalstabilizationsystems/VideostabilizationvideoStabilizerexample/Videostabilization
videostabilizationalgorithmssteps/Videostabilization
![Page 318: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/318.jpg)
WWindows/Compilingandinstallingthelibrary
![Page 319: Learning Image Processing with OpenCV - DropPDFTools to develop new projects Creating an OpenCV C++ program with Qt Creator Reading and writing image files The basic API concepts Image](https://reader030.vdocuments.us/reader030/viewer/2022020120/5a8dc5037f8b9ac87a8d3fec/html5/thumbnails/319.jpg)
YYCrCb
about/YCrCbexamplecode/Theexamplecode
YCrCbsegmentationabout/YCrCbsegmentation