From 5b3ac112fefe707c049df9c9f8bfd89a0a8248d6 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 7 Aug 2018 18:49:05 +0300 Subject: [PATCH 01/17] core: move const tables outside of dispatched code To avoid duplicates in binaries --- modules/core/src/mathfuncs.cpp | 379 +++++++++++++++++++++++ modules/core/src/mathfuncs.hpp | 15 + modules/core/src/mathfuncs_core.simd.hpp | 364 +--------------------- 3 files changed, 408 insertions(+), 350 deletions(-) create mode 100644 modules/core/src/mathfuncs.hpp diff --git a/modules/core/src/mathfuncs.cpp b/modules/core/src/mathfuncs.cpp index 9154db6bcb..5737e8d0b3 100644 --- a/modules/core/src/mathfuncs.cpp +++ b/modules/core/src/mathfuncs.cpp @@ -45,6 +45,7 @@ #include "opencl_kernels_core.hpp" #include #include +#include "mathfuncs.hpp" namespace cv { @@ -2023,4 +2024,382 @@ void cvSolvePoly(const CvMat* a, CvMat *r, int maxiter, int) } + +// Common constants for dispatched code +namespace cv { namespace details { + +#define EXPTAB_SCALE 6 +#define EXPTAB_MASK ((1 << EXPTAB_SCALE) - 1) + +#define EXPPOLY_32F_A0 .9670371139572337719125840413672004409288e-2 + +static const double CV_DECL_ALIGNED(64) expTab[EXPTAB_MASK + 1] = { + 1.0 * EXPPOLY_32F_A0, + 1.0108892860517004600204097905619 * EXPPOLY_32F_A0, + 1.0218971486541166782344801347833 * EXPPOLY_32F_A0, + 1.0330248790212284225001082839705 * EXPPOLY_32F_A0, + 1.0442737824274138403219664787399 * EXPPOLY_32F_A0, + 1.0556451783605571588083413251529 * EXPPOLY_32F_A0, + 1.0671404006768236181695211209928 * EXPPOLY_32F_A0, + 1.0787607977571197937406800374385 * EXPPOLY_32F_A0, + 1.0905077326652576592070106557607 * EXPPOLY_32F_A0, + 1.1023825833078409435564142094256 * EXPPOLY_32F_A0, + 1.1143867425958925363088129569196 * EXPPOLY_32F_A0, + 1.126521618608241899794798643787 * EXPPOLY_32F_A0, + 1.1387886347566916537038302838415 * EXPPOLY_32F_A0, + 1.151189229952982705817759635202 * EXPPOLY_32F_A0, + 1.1637248587775775138135735990922 * EXPPOLY_32F_A0, + 1.1763969916502812762846457284838 * EXPPOLY_32F_A0, + 1.1892071150027210667174999705605 * EXPPOLY_32F_A0, + 1.2021567314527031420963969574978 * EXPPOLY_32F_A0, + 1.2152473599804688781165202513388 * EXPPOLY_32F_A0, + 1.2284805361068700056940089577928 * EXPPOLY_32F_A0, + 1.2418578120734840485936774687266 * EXPPOLY_32F_A0, + 1.2553807570246910895793906574423 * EXPPOLY_32F_A0, + 1.2690509571917332225544190810323 * EXPPOLY_32F_A0, + 1.2828700160787782807266697810215 * EXPPOLY_32F_A0, + 1.2968395546510096659337541177925 * EXPPOLY_32F_A0, + 1.3109612115247643419229917863308 * EXPPOLY_32F_A0, + 1.3252366431597412946295370954987 * EXPPOLY_32F_A0, + 1.3396675240533030053600306697244 * EXPPOLY_32F_A0, + 1.3542555469368927282980147401407 * EXPPOLY_32F_A0, + 1.3690024229745906119296011329822 * EXPPOLY_32F_A0, + 1.3839098819638319548726595272652 * EXPPOLY_32F_A0, + 1.3989796725383111402095281367152 * EXPPOLY_32F_A0, + 1.4142135623730950488016887242097 * EXPPOLY_32F_A0, + 1.4296133383919700112350657782751 * EXPPOLY_32F_A0, + 1.4451808069770466200370062414717 * EXPPOLY_32F_A0, + 1.4609177941806469886513028903106 * EXPPOLY_32F_A0, + 1.476826145939499311386907480374 * EXPPOLY_32F_A0, + 1.4929077282912648492006435314867 * EXPPOLY_32F_A0, + 1.5091644275934227397660195510332 * EXPPOLY_32F_A0, + 1.5255981507445383068512536895169 * EXPPOLY_32F_A0, + 1.5422108254079408236122918620907 * EXPPOLY_32F_A0, + 1.5590044002378369670337280894749 * EXPPOLY_32F_A0, + 1.5759808451078864864552701601819 * EXPPOLY_32F_A0, + 1.5931421513422668979372486431191 * EXPPOLY_32F_A0, + 1.6104903319492543081795206673574 * EXPPOLY_32F_A0, + 1.628027421857347766848218522014 * EXPPOLY_32F_A0, + 1.6457554781539648445187567247258 * EXPPOLY_32F_A0, + 1.6636765803267364350463364569764 * EXPPOLY_32F_A0, + 1.6817928305074290860622509524664 * EXPPOLY_32F_A0, + 1.7001063537185234695013625734975 * EXPPOLY_32F_A0, + 1.7186192981224779156293443764563 * EXPPOLY_32F_A0, + 1.7373338352737062489942020818722 * EXPPOLY_32F_A0, + 1.7562521603732994831121606193753 * EXPPOLY_32F_A0, + 1.7753764925265212525505592001993 * EXPPOLY_32F_A0, + 1.7947090750031071864277032421278 * EXPPOLY_32F_A0, + 1.8142521755003987562498346003623 * EXPPOLY_32F_A0, + 1.8340080864093424634870831895883 * EXPPOLY_32F_A0, + 1.8539791250833855683924530703377 * EXPPOLY_32F_A0, + 1.8741676341102999013299989499544 * EXPPOLY_32F_A0, + 1.8945759815869656413402186534269 * EXPPOLY_32F_A0, + 1.9152065613971472938726112702958 * EXPPOLY_32F_A0, + 1.9360617934922944505980559045667 * EXPPOLY_32F_A0, + 1.9571441241754002690183222516269 * EXPPOLY_32F_A0, + 1.9784560263879509682582499181312 * EXPPOLY_32F_A0, +}; + +const double* getExpTab64f() +{ + return expTab; +} + +const float* getExpTab32f() +{ + static float CV_DECL_ALIGNED(64) expTab_f[EXPTAB_MASK+1]; + static volatile bool expTab_f_initialized = false; + if (!expTab_f_initialized) + { + for( int j = 0; j <= EXPTAB_MASK; j++ ) + expTab_f[j] = (float)expTab[j]; + expTab_f_initialized = true; + } + return expTab_f; +} + + + +#define LOGTAB_SCALE 8 +#define LOGTAB_MASK ((1 << LOGTAB_SCALE) - 1) + +static const double CV_DECL_ALIGNED(64) logTab[(LOGTAB_MASK+1)*2] = { + 0.0000000000000000000000000000000000000000, 1.000000000000000000000000000000000000000, + .00389864041565732288852075271279318258166, .9961089494163424124513618677042801556420, + .00778214044205494809292034119607706088573, .9922480620155038759689922480620155038760, + .01165061721997527263705585198749759001657, .9884169884169884169884169884169884169884, + .01550418653596525274396267235488267033361, .9846153846153846153846153846153846153846, + .01934296284313093139406447562578250654042, .9808429118773946360153256704980842911877, + .02316705928153437593630670221500622574241, .9770992366412213740458015267175572519084, + .02697658769820207233514075539915211265906, .9733840304182509505703422053231939163498, + .03077165866675368732785500469617545604706, .9696969696969696969696969696969696969697, + .03455238150665972812758397481047722976656, .9660377358490566037735849056603773584906, + .03831886430213659461285757856785494368522, .9624060150375939849624060150375939849624, + .04207121392068705056921373852674150839447, .9588014981273408239700374531835205992509, + .04580953603129420126371940114040626212953, .9552238805970149253731343283582089552239, + .04953393512227662748292900118940451648088, .9516728624535315985130111524163568773234, + .05324451451881227759255210685296333394944, .9481481481481481481481481481481481481481, + .05694137640013842427411105973078520037234, .9446494464944649446494464944649446494465, + .06062462181643483993820353816772694699466, .9411764705882352941176470588235294117647, + .06429435070539725460836422143984236754475, .9377289377289377289377289377289377289377, + .06795066190850773679699159401934593915938, .9343065693430656934306569343065693430657, + .07159365318700880442825962290953611955044, .9309090909090909090909090909090909090909, + .07522342123758751775142172846244648098944, .9275362318840579710144927536231884057971, + .07884006170777602129362549021607264876369, .9241877256317689530685920577617328519856, + .08244366921107458556772229485432035289706, .9208633093525179856115107913669064748201, + .08603433734180314373940490213499288074675, .9175627240143369175627240143369175627240, + .08961215868968712416897659522874164395031, .9142857142857142857142857142857142857143, + .09317722485418328259854092721070628613231, .9110320284697508896797153024911032028470, + .09672962645855109897752299730200320482256, .9078014184397163120567375886524822695035, + .10026945316367513738597949668474029749630, .9045936395759717314487632508833922261484, + .10379679368164355934833764649738441221420, .9014084507042253521126760563380281690141, + .10731173578908805021914218968959175981580, .8982456140350877192982456140350877192982, + .11081436634029011301105782649756292812530, .8951048951048951048951048951048951048951, + .11430477128005862852422325204315711744130, .8919860627177700348432055749128919860627, + .11778303565638344185817487641543266363440, .8888888888888888888888888888888888888889, + .12124924363286967987640707633545389398930, .8858131487889273356401384083044982698962, + .12470347850095722663787967121606925502420, .8827586206896551724137931034482758620690, + .12814582269193003360996385708858724683530, .8797250859106529209621993127147766323024, + .13157635778871926146571524895989568904040, .8767123287671232876712328767123287671233, + .13499516453750481925766280255629681050780, .8737201365187713310580204778156996587031, + .13840232285911913123754857224412262439730, .8707482993197278911564625850340136054422, + .14179791186025733629172407290752744302150, .8677966101694915254237288135593220338983, + .14518200984449788903951628071808954700830, .8648648648648648648648648648648648648649, + .14855469432313711530824207329715136438610, .8619528619528619528619528619528619528620, + .15191604202584196858794030049466527998450, .8590604026845637583892617449664429530201, + .15526612891112392955683674244937719777230, .8561872909698996655518394648829431438127, + .15860503017663857283636730244325008243330, .8533333333333333333333333333333333333333, + .16193282026931324346641360989451641216880, .8504983388704318936877076411960132890365, + .16524957289530714521497145597095368430010, .8476821192052980132450331125827814569536, + .16855536102980664403538924034364754334090, .8448844884488448844884488448844884488449, + .17185025692665920060697715143760433420540, .8421052631578947368421052631578947368421, + .17513433212784912385018287750426679849630, .8393442622950819672131147540983606557377, + .17840765747281828179637841458315961062910, .8366013071895424836601307189542483660131, + .18167030310763465639212199675966985523700, .8338762214983713355048859934853420195440, + .18492233849401198964024217730184318497780, .8311688311688311688311688311688311688312, + .18816383241818296356839823602058459073300, .8284789644012944983818770226537216828479, + .19139485299962943898322009772527962923050, .8258064516129032258064516129032258064516, + .19461546769967164038916962454095482826240, .8231511254019292604501607717041800643087, + .19782574332991986754137769821682013571260, .8205128205128205128205128205128205128205, + .20102574606059073203390141770796617493040, .8178913738019169329073482428115015974441, + .20421554142869088876999228432396193966280, .8152866242038216560509554140127388535032, + .20739519434607056602715147164417430758480, .8126984126984126984126984126984126984127, + .21056476910734961416338251183333341032260, .8101265822784810126582278481012658227848, + .21372432939771812687723695489694364368910, .8075709779179810725552050473186119873817, + .21687393830061435506806333251006435602900, .8050314465408805031446540880503144654088, + .22001365830528207823135744547471404075630, .8025078369905956112852664576802507836991, + .22314355131420973710199007200571941211830, .8000000000000000000000000000000000000000, + .22626367865045338145790765338460914790630, .7975077881619937694704049844236760124611, + .22937410106484582006380890106811420992010, .7950310559006211180124223602484472049689, + .23247487874309405442296849741978803649550, .7925696594427244582043343653250773993808, + .23556607131276688371634975283086532726890, .7901234567901234567901234567901234567901, + .23864773785017498464178231643018079921600, .7876923076923076923076923076923076923077, + .24171993688714515924331749374687206000090, .7852760736196319018404907975460122699387, + .24478272641769091566565919038112042471760, .7828746177370030581039755351681957186544, + .24783616390458124145723672882013488560910, .7804878048780487804878048780487804878049, + .25088030628580937353433455427875742316250, .7781155015197568389057750759878419452888, + .25391520998096339667426946107298135757450, .7757575757575757575757575757575757575758, + .25694093089750041913887912414793390780680, .7734138972809667673716012084592145015106, + .25995752443692604627401010475296061486000, .7710843373493975903614457831325301204819, + .26296504550088134477547896494797896593800, .7687687687687687687687687687687687687688, + .26596354849713793599974565040611196309330, .7664670658682634730538922155688622754491, + .26895308734550393836570947314612567424780, .7641791044776119402985074626865671641791, + .27193371548364175804834985683555714786050, .7619047619047619047619047619047619047619, + .27490548587279922676529508862586226314300, .7596439169139465875370919881305637982196, + .27786845100345625159121709657483734190480, .7573964497041420118343195266272189349112, + .28082266290088775395616949026589281857030, .7551622418879056047197640117994100294985, + .28376817313064456316240580235898960381750, .7529411764705882352941176470588235294118, + .28670503280395426282112225635501090437180, .7507331378299120234604105571847507331378, + .28963329258304265634293983566749375313530, .7485380116959064327485380116959064327485, + .29255300268637740579436012922087684273730, .7463556851311953352769679300291545189504, + .29546421289383584252163927885703742504130, .7441860465116279069767441860465116279070, + .29836697255179722709783618483925238251680, .7420289855072463768115942028985507246377, + .30126133057816173455023545102449133992200, .7398843930635838150289017341040462427746, + .30414733546729666446850615102448500692850, .7377521613832853025936599423631123919308, + .30702503529491181888388950937951449304830, .7356321839080459770114942528735632183908, + .30989447772286465854207904158101882785550, .7335243553008595988538681948424068767908, + .31275571000389684739317885942000430077330, .7314285714285714285714285714285714285714, + .31560877898630329552176476681779604405180, .7293447293447293447293447293447293447293, + .31845373111853458869546784626436419785030, .7272727272727272727272727272727272727273, + .32129061245373424782201254856772720813750, .7252124645892351274787535410764872521246, + .32411946865421192853773391107097268104550, .7231638418079096045197740112994350282486, + .32694034499585328257253991068864706903700, .7211267605633802816901408450704225352113, + .32975328637246797969240219572384376078850, .7191011235955056179775280898876404494382, + .33255833730007655635318997155991382896900, .7170868347338935574229691876750700280112, + .33535554192113781191153520921943709254280, .7150837988826815642458100558659217877095, + .33814494400871636381467055798566434532400, .7130919220055710306406685236768802228412, + .34092658697059319283795275623560883104800, .7111111111111111111111111111111111111111, + .34370051385331840121395430287520866841080, .7091412742382271468144044321329639889197, + .34646676734620857063262633346312213689100, .7071823204419889502762430939226519337017, + .34922538978528827602332285096053965389730, .7052341597796143250688705234159779614325, + .35197642315717814209818925519357435405250, .7032967032967032967032967032967032967033, + .35471990910292899856770532096561510115850, .7013698630136986301369863013698630136986, + .35745588892180374385176833129662554711100, .6994535519125683060109289617486338797814, + .36018440357500774995358483465679455548530, .6975476839237057220708446866485013623978, + .36290549368936841911903457003063522279280, .6956521739130434782608695652173913043478, + .36561919956096466943762379742111079394830, .6937669376693766937669376693766937669377, + .36832556115870762614150635272380895912650, .6918918918918918918918918918918918918919, + .37102461812787262962487488948681857436900, .6900269541778975741239892183288409703504, + .37371640979358405898480555151763837784530, .6881720430107526881720430107526881720430, + .37640097516425302659470730759494472295050, .6863270777479892761394101876675603217158, + .37907835293496944251145919224654790014030, .6844919786096256684491978609625668449198, + .38174858149084833769393299007788300514230, .6826666666666666666666666666666666666667, + .38441169891033200034513583887019194662580, .6808510638297872340425531914893617021277, + .38706774296844825844488013899535872042180, .6790450928381962864721485411140583554377, + .38971675114002518602873692543653305619950, .6772486772486772486772486772486772486772, + .39235876060286384303665840889152605086580, .6754617414248021108179419525065963060686, + .39499380824086893770896722344332374632350, .6736842105263157894736842105263157894737, + .39762193064713846624158577469643205404280, .6719160104986876640419947506561679790026, + .40024316412701266276741307592601515352730, .6701570680628272251308900523560209424084, + .40285754470108348090917615991202183067800, .6684073107049608355091383812010443864230, + .40546510810816432934799991016916465014230, .6666666666666666666666666666666666666667, + .40806588980822172674223224930756259709600, .6649350649350649350649350649350649350649, + .41065992498526837639616360320360399782650, .6632124352331606217616580310880829015544, + .41324724855021932601317757871584035456180, .6614987080103359173126614987080103359173, + .41582789514371093497757669865677598863850, .6597938144329896907216494845360824742268, + .41840189913888381489925905043492093682300, .6580976863753213367609254498714652956298, + .42096929464412963239894338585145305842150, .6564102564102564102564102564102564102564, + .42353011550580327293502591601281892508280, .6547314578005115089514066496163682864450, + .42608439531090003260516141381231136620050, .6530612244897959183673469387755102040816, + .42863216738969872610098832410585600882780, .6513994910941475826972010178117048346056, + .43117346481837132143866142541810404509300, .6497461928934010152284263959390862944162, + .43370832042155937902094819946796633303180, .6481012658227848101265822784810126582278, + .43623676677491801667585491486534010618930, .6464646464646464646464646464646464646465, + .43875883620762790027214350629947148263450, .6448362720403022670025188916876574307305, + .44127456080487520440058801796112675219780, .6432160804020100502512562814070351758794, + .44378397241030093089975139264424797147500, .6416040100250626566416040100250626566416, + .44628710262841947420398014401143882423650, .6400000000000000000000000000000000000000, + .44878398282700665555822183705458883196130, .6384039900249376558603491271820448877805, + .45127464413945855836729492693848442286250, .6368159203980099502487562189054726368159, + .45375911746712049854579618113348260521900, .6352357320099255583126550868486352357320, + .45623743348158757315857769754074979573500, .6336633663366336633663366336633663366337, + .45870962262697662081833982483658473938700, .6320987654320987654320987654320987654321, + .46117571512217014895185229761409573256980, .6305418719211822660098522167487684729064, + .46363574096303250549055974261136725544930, .6289926289926289926289926289926289926290, + .46608972992459918316399125615134835243230, .6274509803921568627450980392156862745098, + .46853771156323925639597405279346276074650, .6259168704156479217603911980440097799511, + .47097971521879100631480241645476780831830, .6243902439024390243902439024390243902439, + .47341577001667212165614273544633761048330, .6228710462287104622871046228710462287105, + .47584590486996386493601107758877333253630, .6213592233009708737864077669902912621359, + .47827014848147025860569669930555392056700, .6198547215496368038740920096852300242131, + .48068852934575190261057286988943815231330, .6183574879227053140096618357487922705314, + .48310107575113581113157579238759353756900, .6168674698795180722891566265060240963855, + .48550781578170076890899053978500887751580, .6153846153846153846153846153846153846154, + .48790877731923892879351001283794175833480, .6139088729016786570743405275779376498801, + .49030398804519381705802061333088204264650, .6124401913875598086124401913875598086124, + .49269347544257524607047571407747454941280, .6109785202863961813842482100238663484487, + .49507726679785146739476431321236304938800, .6095238095238095238095238095238095238095, + .49745538920281889838648226032091770321130, .6080760095011876484560570071258907363420, + .49982786955644931126130359189119189977650, .6066350710900473933649289099526066350711, + .50219473456671548383667413872899487614650, .6052009456264775413711583924349881796690, + .50455601075239520092452494282042607665050, .6037735849056603773584905660377358490566, + .50691172444485432801997148999362252652650, .6023529411764705882352941176470588235294, + .50926190178980790257412536448100581765150, .6009389671361502347417840375586854460094, + .51160656874906207391973111953120678663250, .5995316159250585480093676814988290398126, + .51394575110223428282552049495279788970950, .5981308411214953271028037383177570093458, + .51627947444845445623684554448118433356300, .5967365967365967365967365967365967365967, + .51860776420804555186805373523384332656850, .5953488372093023255813953488372093023256, + .52093064562418522900344441950437612831600, .5939675174013921113689095127610208816705, + .52324814376454775732838697877014055848100, .5925925925925925925925925925925925925926, + .52556028352292727401362526507000438869000, .5912240184757505773672055427251732101617, + .52786708962084227803046587723656557500350, .5898617511520737327188940092165898617512, + .53016858660912158374145519701414741575700, .5885057471264367816091954022988505747126, + .53246479886947173376654518506256863474850, .5871559633027522935779816513761467889908, + .53475575061602764748158733709715306758900, .5858123569794050343249427917620137299771, + .53704146589688361856929077475797384977350, .5844748858447488584474885844748858447489, + .53932196859560876944783558428753167390800, .5831435079726651480637813211845102505695, + .54159728243274429804188230264117009937750, .5818181818181818181818181818181818181818, + .54386743096728351609669971367111429572100, .5804988662131519274376417233560090702948, + .54613243759813556721383065450936555862450, .5791855203619909502262443438914027149321, + .54839232556557315767520321969641372561450, .5778781038374717832957110609480812641084, + .55064711795266219063194057525834068655950, .5765765765765765765765765765765765765766, + .55289683768667763352766542084282264113450, .5752808988764044943820224719101123595506, + .55514150754050151093110798683483153581600, .5739910313901345291479820627802690582960, + .55738115013400635344709144192165695130850, .5727069351230425055928411633109619686801, + .55961578793542265941596269840374588966350, .5714285714285714285714285714285714285714, + .56184544326269181269140062795486301183700, .5701559020044543429844097995545657015590, + .56407013828480290218436721261241473257550, .5688888888888888888888888888888888888889, + .56628989502311577464155334382667206227800, .5676274944567627494456762749445676274945, + .56850473535266865532378233183408156037350, .5663716814159292035398230088495575221239, + .57071468100347144680739575051120482385150, .5651214128035320088300220750551876379691, + .57291975356178548306473885531886480748650, .5638766519823788546255506607929515418502, + .57511997447138785144460371157038025558000, .5626373626373626373626373626373626373626, + .57731536503482350219940144597785547375700, .5614035087719298245614035087719298245614, + .57950594641464214795689713355386629700650, .5601750547045951859956236323851203501094, + .58169173963462239562716149521293118596100, .5589519650655021834061135371179039301310, + .58387276558098266665552955601015128195300, .5577342047930283224400871459694989106754, + .58604904500357812846544902640744112432000, .5565217391304347826086956521739130434783, + .58822059851708596855957011939608491957200, .5553145336225596529284164859002169197397, + .59038744660217634674381770309992134571100, .5541125541125541125541125541125541125541, + .59254960960667157898740242671919986605650, .5529157667386609071274298056155507559395, + .59470710774669277576265358220553025603300, .5517241379310344827586206896551724137931, + .59685996110779382384237123915227130055450, .5505376344086021505376344086021505376344, + .59900818964608337768851242799428291618800, .5493562231759656652360515021459227467811, + .60115181318933474940990890900138765573500, .5481798715203426124197002141327623126338, + .60329085143808425240052883964381180703650, .5470085470085470085470085470085470085470, + .60542532396671688843525771517306566238400, .5458422174840085287846481876332622601279, + .60755525022454170969155029524699784815300, .5446808510638297872340425531914893617021, + .60968064953685519036241657886421307921400, .5435244161358811040339702760084925690021, + .61180154110599282990534675263916142284850, .5423728813559322033898305084745762711864, + .61391794401237043121710712512140162289150, .5412262156448202959830866807610993657505, + .61602987721551394351138242200249806046500, .5400843881856540084388185654008438818565, + .61813735955507864705538167982012964785100, .5389473684210526315789473684210526315789, + .62024040975185745772080281312810257077200, .5378151260504201680672268907563025210084, + .62233904640877868441606324267922900617100, .5366876310272536687631027253668763102725, + .62443328801189346144440150965237990021700, .5355648535564853556485355648535564853556, + .62652315293135274476554741340805776417250, .5344467640918580375782881002087682672234, + .62860865942237409420556559780379757285100, .5333333333333333333333333333333333333333, + .63068982562619868570408243613201193511500, .5322245322245322245322245322245322245322, + .63276666957103777644277897707070223987100, .5311203319502074688796680497925311203320, + .63483920917301017716738442686619237065300, .5300207039337474120082815734989648033126, + .63690746223706917739093569252872839570050, .5289256198347107438016528925619834710744, + .63897144645792069983514238629140891134750, .5278350515463917525773195876288659793814, + .64103117942093124081992527862894348800200, .5267489711934156378600823045267489711934, + .64308667860302726193566513757104985415950, .5256673511293634496919917864476386036961, + .64513796137358470073053240412264131009600, .5245901639344262295081967213114754098361, + .64718504499530948859131740391603671014300, .5235173824130879345603271983640081799591, + .64922794662510974195157587018911726772800, .5224489795918367346938775510204081632653, + .65126668331495807251485530287027359008800, .5213849287169042769857433808553971486762, + .65330127201274557080523663898929953575150, .5203252032520325203252032520325203252033, + .65533172956312757406749369692988693714150, .5192697768762677484787018255578093306288, + .65735807270835999727154330685152672231200, .5182186234817813765182186234817813765182, + .65938031808912778153342060249997302889800, .5171717171717171717171717171717171717172, + .66139848224536490484126716182800009846700, .5161290322580645161290322580645161290323, + .66341258161706617713093692145776003599150, .5150905432595573440643863179074446680080, + .66542263254509037562201001492212526500250, .5140562248995983935742971887550200803213, + .66742865127195616370414654738851822912700, .5130260521042084168336673346693386773547, + .66943065394262923906154583164607174694550, .5120000000000000000000000000000000000000, + .67142865660530226534774556057527661323550, .5109780439121756487025948103792415169661, + .67342267521216669923234121597488410770900, .5099601593625498007968127490039840637450, + .67541272562017662384192817626171745359900, .5089463220675944333996023856858846918489, + .67739882359180603188519853574689477682100, .5079365079365079365079365079365079365079, + .67938098479579733801614338517538271844400, .5069306930693069306930693069306930693069, + .68135922480790300781450241629499942064300, .5059288537549407114624505928853754940711, + .68333355911162063645036823800182901322850, .5049309664694280078895463510848126232742, + .68530400309891936760919861626462079584600, .5039370078740157480314960629921259842520, + .68727057207096020619019327568821609020250, .5029469548133595284872298624754420432220, + .68923328123880889251040571252815425395950, .5019607843137254901960784313725490196078, + .69314718055994530941723212145818, 5.0e-01, +}; + +const double* getLogTab64f() +{ + return logTab; +} + +const float* getLogTab32f() +{ + static float CV_DECL_ALIGNED(64) logTab_f[(LOGTAB_MASK+1)*2]; + static volatile bool logTab_f_initialized = false; + if (!logTab_f_initialized) + { + for (int j = 0; j < (LOGTAB_MASK+1)*2; j++) + logTab_f[j] = (float)logTab[j]; + logTab_f_initialized = true; + } + return logTab_f; +} + +}} // namespace + /* End of file. */ diff --git a/modules/core/src/mathfuncs.hpp b/modules/core/src/mathfuncs.hpp new file mode 100644 index 0000000000..5ff4fb2900 --- /dev/null +++ b/modules/core/src/mathfuncs.hpp @@ -0,0 +1,15 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_SRC_MATHFUNCS_HPP +#define OPENCV_CORE_SRC_MATHFUNCS_HPP + +namespace cv { namespace details { +const double* getExpTab64f(); +const float* getExpTab32f(); +const double* getLogTab64f(); +const float* getLogTab32f(); +}} // namespace + +#endif // OPENCV_CORE_SRC_MATHFUNCS_HPP diff --git a/modules/core/src/mathfuncs_core.simd.hpp b/modules/core/src/mathfuncs_core.simd.hpp index b15810317e..154b7f213b 100644 --- a/modules/core/src/mathfuncs_core.simd.hpp +++ b/modules/core/src/mathfuncs_core.simd.hpp @@ -2,6 +2,8 @@ // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. +#include "mathfuncs.hpp" + namespace cv { namespace hal { CV_CPU_OPTIMIZATION_NAMESPACE_BEGIN @@ -409,76 +411,6 @@ void log64f(const double *src, double *dst, int n) #define EXPPOLY_32F_A0 .9670371139572337719125840413672004409288e-2 -static const double expTab[] = { - 1.0 * EXPPOLY_32F_A0, - 1.0108892860517004600204097905619 * EXPPOLY_32F_A0, - 1.0218971486541166782344801347833 * EXPPOLY_32F_A0, - 1.0330248790212284225001082839705 * EXPPOLY_32F_A0, - 1.0442737824274138403219664787399 * EXPPOLY_32F_A0, - 1.0556451783605571588083413251529 * EXPPOLY_32F_A0, - 1.0671404006768236181695211209928 * EXPPOLY_32F_A0, - 1.0787607977571197937406800374385 * EXPPOLY_32F_A0, - 1.0905077326652576592070106557607 * EXPPOLY_32F_A0, - 1.1023825833078409435564142094256 * EXPPOLY_32F_A0, - 1.1143867425958925363088129569196 * EXPPOLY_32F_A0, - 1.126521618608241899794798643787 * EXPPOLY_32F_A0, - 1.1387886347566916537038302838415 * EXPPOLY_32F_A0, - 1.151189229952982705817759635202 * EXPPOLY_32F_A0, - 1.1637248587775775138135735990922 * EXPPOLY_32F_A0, - 1.1763969916502812762846457284838 * EXPPOLY_32F_A0, - 1.1892071150027210667174999705605 * EXPPOLY_32F_A0, - 1.2021567314527031420963969574978 * EXPPOLY_32F_A0, - 1.2152473599804688781165202513388 * EXPPOLY_32F_A0, - 1.2284805361068700056940089577928 * EXPPOLY_32F_A0, - 1.2418578120734840485936774687266 * EXPPOLY_32F_A0, - 1.2553807570246910895793906574423 * EXPPOLY_32F_A0, - 1.2690509571917332225544190810323 * EXPPOLY_32F_A0, - 1.2828700160787782807266697810215 * EXPPOLY_32F_A0, - 1.2968395546510096659337541177925 * EXPPOLY_32F_A0, - 1.3109612115247643419229917863308 * EXPPOLY_32F_A0, - 1.3252366431597412946295370954987 * EXPPOLY_32F_A0, - 1.3396675240533030053600306697244 * EXPPOLY_32F_A0, - 1.3542555469368927282980147401407 * EXPPOLY_32F_A0, - 1.3690024229745906119296011329822 * EXPPOLY_32F_A0, - 1.3839098819638319548726595272652 * EXPPOLY_32F_A0, - 1.3989796725383111402095281367152 * EXPPOLY_32F_A0, - 1.4142135623730950488016887242097 * EXPPOLY_32F_A0, - 1.4296133383919700112350657782751 * EXPPOLY_32F_A0, - 1.4451808069770466200370062414717 * EXPPOLY_32F_A0, - 1.4609177941806469886513028903106 * EXPPOLY_32F_A0, - 1.476826145939499311386907480374 * EXPPOLY_32F_A0, - 1.4929077282912648492006435314867 * EXPPOLY_32F_A0, - 1.5091644275934227397660195510332 * EXPPOLY_32F_A0, - 1.5255981507445383068512536895169 * EXPPOLY_32F_A0, - 1.5422108254079408236122918620907 * EXPPOLY_32F_A0, - 1.5590044002378369670337280894749 * EXPPOLY_32F_A0, - 1.5759808451078864864552701601819 * EXPPOLY_32F_A0, - 1.5931421513422668979372486431191 * EXPPOLY_32F_A0, - 1.6104903319492543081795206673574 * EXPPOLY_32F_A0, - 1.628027421857347766848218522014 * EXPPOLY_32F_A0, - 1.6457554781539648445187567247258 * EXPPOLY_32F_A0, - 1.6636765803267364350463364569764 * EXPPOLY_32F_A0, - 1.6817928305074290860622509524664 * EXPPOLY_32F_A0, - 1.7001063537185234695013625734975 * EXPPOLY_32F_A0, - 1.7186192981224779156293443764563 * EXPPOLY_32F_A0, - 1.7373338352737062489942020818722 * EXPPOLY_32F_A0, - 1.7562521603732994831121606193753 * EXPPOLY_32F_A0, - 1.7753764925265212525505592001993 * EXPPOLY_32F_A0, - 1.7947090750031071864277032421278 * EXPPOLY_32F_A0, - 1.8142521755003987562498346003623 * EXPPOLY_32F_A0, - 1.8340080864093424634870831895883 * EXPPOLY_32F_A0, - 1.8539791250833855683924530703377 * EXPPOLY_32F_A0, - 1.8741676341102999013299989499544 * EXPPOLY_32F_A0, - 1.8945759815869656413402186534269 * EXPPOLY_32F_A0, - 1.9152065613971472938726112702958 * EXPPOLY_32F_A0, - 1.9360617934922944505980559045667 * EXPPOLY_32F_A0, - 1.9571441241754002690183222516269 * EXPPOLY_32F_A0, - 1.9784560263879509682582499181312 * EXPPOLY_32F_A0, -}; - -static float expTab_f[EXPTAB_MASK+1]; -static volatile bool extTab_f_initialized = false; - // the code below uses _mm_cast* intrinsics, which are not avialable on VS2005 #if (defined _MSC_VER && _MSC_VER < 1500) || \ (!defined __APPLE__ && defined __GNUC__ && __GNUC__*100 + __GNUC_MINOR__ < 402) @@ -494,14 +426,9 @@ void exp32f( const float *_x, float *y, int n ) { CV_INSTRUMENT_REGION() - if( !extTab_f_initialized ) - { - for( int j = 0; j <= EXPTAB_MASK; j++ ) - expTab_f[j] = (float)expTab[j]; - extTab_f_initialized = true; - } + const float* const expTab_f = cv::details::getExpTab32f(); - static const float + const float A4 = (float)(1.000000000000002438532970795181890933776 / EXPPOLY_32F_A0), A3 = (float)(.6931471805521448196800669615864773144641 / EXPPOLY_32F_A0), A2 = (float)(.2402265109513301490103372422686535526573 / EXPPOLY_32F_A0), @@ -612,7 +539,9 @@ void exp64f( const double *_x, double *y, int n ) { CV_INSTRUMENT_REGION() - static const double + const double* const expTab = cv::details::getExpTab64f(); + + const double A5 = .99999999999999999998285227504999 / EXPPOLY_32F_A0, A4 = .69314718055994546743029643825322 / EXPPOLY_32F_A0, A3 = .24022650695886477918181338054308 / EXPPOLY_32F_A0, @@ -737,268 +666,6 @@ void exp64f( const double *_x, double *y, int n ) #define LOGTAB_SCALE 8 #define LOGTAB_MASK ((1 << LOGTAB_SCALE) - 1) -static const double CV_DECL_ALIGNED(16) logTab[] = { - 0.0000000000000000000000000000000000000000, 1.000000000000000000000000000000000000000, - .00389864041565732288852075271279318258166, .9961089494163424124513618677042801556420, - .00778214044205494809292034119607706088573, .9922480620155038759689922480620155038760, - .01165061721997527263705585198749759001657, .9884169884169884169884169884169884169884, - .01550418653596525274396267235488267033361, .9846153846153846153846153846153846153846, - .01934296284313093139406447562578250654042, .9808429118773946360153256704980842911877, - .02316705928153437593630670221500622574241, .9770992366412213740458015267175572519084, - .02697658769820207233514075539915211265906, .9733840304182509505703422053231939163498, - .03077165866675368732785500469617545604706, .9696969696969696969696969696969696969697, - .03455238150665972812758397481047722976656, .9660377358490566037735849056603773584906, - .03831886430213659461285757856785494368522, .9624060150375939849624060150375939849624, - .04207121392068705056921373852674150839447, .9588014981273408239700374531835205992509, - .04580953603129420126371940114040626212953, .9552238805970149253731343283582089552239, - .04953393512227662748292900118940451648088, .9516728624535315985130111524163568773234, - .05324451451881227759255210685296333394944, .9481481481481481481481481481481481481481, - .05694137640013842427411105973078520037234, .9446494464944649446494464944649446494465, - .06062462181643483993820353816772694699466, .9411764705882352941176470588235294117647, - .06429435070539725460836422143984236754475, .9377289377289377289377289377289377289377, - .06795066190850773679699159401934593915938, .9343065693430656934306569343065693430657, - .07159365318700880442825962290953611955044, .9309090909090909090909090909090909090909, - .07522342123758751775142172846244648098944, .9275362318840579710144927536231884057971, - .07884006170777602129362549021607264876369, .9241877256317689530685920577617328519856, - .08244366921107458556772229485432035289706, .9208633093525179856115107913669064748201, - .08603433734180314373940490213499288074675, .9175627240143369175627240143369175627240, - .08961215868968712416897659522874164395031, .9142857142857142857142857142857142857143, - .09317722485418328259854092721070628613231, .9110320284697508896797153024911032028470, - .09672962645855109897752299730200320482256, .9078014184397163120567375886524822695035, - .10026945316367513738597949668474029749630, .9045936395759717314487632508833922261484, - .10379679368164355934833764649738441221420, .9014084507042253521126760563380281690141, - .10731173578908805021914218968959175981580, .8982456140350877192982456140350877192982, - .11081436634029011301105782649756292812530, .8951048951048951048951048951048951048951, - .11430477128005862852422325204315711744130, .8919860627177700348432055749128919860627, - .11778303565638344185817487641543266363440, .8888888888888888888888888888888888888889, - .12124924363286967987640707633545389398930, .8858131487889273356401384083044982698962, - .12470347850095722663787967121606925502420, .8827586206896551724137931034482758620690, - .12814582269193003360996385708858724683530, .8797250859106529209621993127147766323024, - .13157635778871926146571524895989568904040, .8767123287671232876712328767123287671233, - .13499516453750481925766280255629681050780, .8737201365187713310580204778156996587031, - .13840232285911913123754857224412262439730, .8707482993197278911564625850340136054422, - .14179791186025733629172407290752744302150, .8677966101694915254237288135593220338983, - .14518200984449788903951628071808954700830, .8648648648648648648648648648648648648649, - .14855469432313711530824207329715136438610, .8619528619528619528619528619528619528620, - .15191604202584196858794030049466527998450, .8590604026845637583892617449664429530201, - .15526612891112392955683674244937719777230, .8561872909698996655518394648829431438127, - .15860503017663857283636730244325008243330, .8533333333333333333333333333333333333333, - .16193282026931324346641360989451641216880, .8504983388704318936877076411960132890365, - .16524957289530714521497145597095368430010, .8476821192052980132450331125827814569536, - .16855536102980664403538924034364754334090, .8448844884488448844884488448844884488449, - .17185025692665920060697715143760433420540, .8421052631578947368421052631578947368421, - .17513433212784912385018287750426679849630, .8393442622950819672131147540983606557377, - .17840765747281828179637841458315961062910, .8366013071895424836601307189542483660131, - .18167030310763465639212199675966985523700, .8338762214983713355048859934853420195440, - .18492233849401198964024217730184318497780, .8311688311688311688311688311688311688312, - .18816383241818296356839823602058459073300, .8284789644012944983818770226537216828479, - .19139485299962943898322009772527962923050, .8258064516129032258064516129032258064516, - .19461546769967164038916962454095482826240, .8231511254019292604501607717041800643087, - .19782574332991986754137769821682013571260, .8205128205128205128205128205128205128205, - .20102574606059073203390141770796617493040, .8178913738019169329073482428115015974441, - .20421554142869088876999228432396193966280, .8152866242038216560509554140127388535032, - .20739519434607056602715147164417430758480, .8126984126984126984126984126984126984127, - .21056476910734961416338251183333341032260, .8101265822784810126582278481012658227848, - .21372432939771812687723695489694364368910, .8075709779179810725552050473186119873817, - .21687393830061435506806333251006435602900, .8050314465408805031446540880503144654088, - .22001365830528207823135744547471404075630, .8025078369905956112852664576802507836991, - .22314355131420973710199007200571941211830, .8000000000000000000000000000000000000000, - .22626367865045338145790765338460914790630, .7975077881619937694704049844236760124611, - .22937410106484582006380890106811420992010, .7950310559006211180124223602484472049689, - .23247487874309405442296849741978803649550, .7925696594427244582043343653250773993808, - .23556607131276688371634975283086532726890, .7901234567901234567901234567901234567901, - .23864773785017498464178231643018079921600, .7876923076923076923076923076923076923077, - .24171993688714515924331749374687206000090, .7852760736196319018404907975460122699387, - .24478272641769091566565919038112042471760, .7828746177370030581039755351681957186544, - .24783616390458124145723672882013488560910, .7804878048780487804878048780487804878049, - .25088030628580937353433455427875742316250, .7781155015197568389057750759878419452888, - .25391520998096339667426946107298135757450, .7757575757575757575757575757575757575758, - .25694093089750041913887912414793390780680, .7734138972809667673716012084592145015106, - .25995752443692604627401010475296061486000, .7710843373493975903614457831325301204819, - .26296504550088134477547896494797896593800, .7687687687687687687687687687687687687688, - .26596354849713793599974565040611196309330, .7664670658682634730538922155688622754491, - .26895308734550393836570947314612567424780, .7641791044776119402985074626865671641791, - .27193371548364175804834985683555714786050, .7619047619047619047619047619047619047619, - .27490548587279922676529508862586226314300, .7596439169139465875370919881305637982196, - .27786845100345625159121709657483734190480, .7573964497041420118343195266272189349112, - .28082266290088775395616949026589281857030, .7551622418879056047197640117994100294985, - .28376817313064456316240580235898960381750, .7529411764705882352941176470588235294118, - .28670503280395426282112225635501090437180, .7507331378299120234604105571847507331378, - .28963329258304265634293983566749375313530, .7485380116959064327485380116959064327485, - .29255300268637740579436012922087684273730, .7463556851311953352769679300291545189504, - .29546421289383584252163927885703742504130, .7441860465116279069767441860465116279070, - .29836697255179722709783618483925238251680, .7420289855072463768115942028985507246377, - .30126133057816173455023545102449133992200, .7398843930635838150289017341040462427746, - .30414733546729666446850615102448500692850, .7377521613832853025936599423631123919308, - .30702503529491181888388950937951449304830, .7356321839080459770114942528735632183908, - .30989447772286465854207904158101882785550, .7335243553008595988538681948424068767908, - .31275571000389684739317885942000430077330, .7314285714285714285714285714285714285714, - .31560877898630329552176476681779604405180, .7293447293447293447293447293447293447293, - .31845373111853458869546784626436419785030, .7272727272727272727272727272727272727273, - .32129061245373424782201254856772720813750, .7252124645892351274787535410764872521246, - .32411946865421192853773391107097268104550, .7231638418079096045197740112994350282486, - .32694034499585328257253991068864706903700, .7211267605633802816901408450704225352113, - .32975328637246797969240219572384376078850, .7191011235955056179775280898876404494382, - .33255833730007655635318997155991382896900, .7170868347338935574229691876750700280112, - .33535554192113781191153520921943709254280, .7150837988826815642458100558659217877095, - .33814494400871636381467055798566434532400, .7130919220055710306406685236768802228412, - .34092658697059319283795275623560883104800, .7111111111111111111111111111111111111111, - .34370051385331840121395430287520866841080, .7091412742382271468144044321329639889197, - .34646676734620857063262633346312213689100, .7071823204419889502762430939226519337017, - .34922538978528827602332285096053965389730, .7052341597796143250688705234159779614325, - .35197642315717814209818925519357435405250, .7032967032967032967032967032967032967033, - .35471990910292899856770532096561510115850, .7013698630136986301369863013698630136986, - .35745588892180374385176833129662554711100, .6994535519125683060109289617486338797814, - .36018440357500774995358483465679455548530, .6975476839237057220708446866485013623978, - .36290549368936841911903457003063522279280, .6956521739130434782608695652173913043478, - .36561919956096466943762379742111079394830, .6937669376693766937669376693766937669377, - .36832556115870762614150635272380895912650, .6918918918918918918918918918918918918919, - .37102461812787262962487488948681857436900, .6900269541778975741239892183288409703504, - .37371640979358405898480555151763837784530, .6881720430107526881720430107526881720430, - .37640097516425302659470730759494472295050, .6863270777479892761394101876675603217158, - .37907835293496944251145919224654790014030, .6844919786096256684491978609625668449198, - .38174858149084833769393299007788300514230, .6826666666666666666666666666666666666667, - .38441169891033200034513583887019194662580, .6808510638297872340425531914893617021277, - .38706774296844825844488013899535872042180, .6790450928381962864721485411140583554377, - .38971675114002518602873692543653305619950, .6772486772486772486772486772486772486772, - .39235876060286384303665840889152605086580, .6754617414248021108179419525065963060686, - .39499380824086893770896722344332374632350, .6736842105263157894736842105263157894737, - .39762193064713846624158577469643205404280, .6719160104986876640419947506561679790026, - .40024316412701266276741307592601515352730, .6701570680628272251308900523560209424084, - .40285754470108348090917615991202183067800, .6684073107049608355091383812010443864230, - .40546510810816432934799991016916465014230, .6666666666666666666666666666666666666667, - .40806588980822172674223224930756259709600, .6649350649350649350649350649350649350649, - .41065992498526837639616360320360399782650, .6632124352331606217616580310880829015544, - .41324724855021932601317757871584035456180, .6614987080103359173126614987080103359173, - .41582789514371093497757669865677598863850, .6597938144329896907216494845360824742268, - .41840189913888381489925905043492093682300, .6580976863753213367609254498714652956298, - .42096929464412963239894338585145305842150, .6564102564102564102564102564102564102564, - .42353011550580327293502591601281892508280, .6547314578005115089514066496163682864450, - .42608439531090003260516141381231136620050, .6530612244897959183673469387755102040816, - .42863216738969872610098832410585600882780, .6513994910941475826972010178117048346056, - .43117346481837132143866142541810404509300, .6497461928934010152284263959390862944162, - .43370832042155937902094819946796633303180, .6481012658227848101265822784810126582278, - .43623676677491801667585491486534010618930, .6464646464646464646464646464646464646465, - .43875883620762790027214350629947148263450, .6448362720403022670025188916876574307305, - .44127456080487520440058801796112675219780, .6432160804020100502512562814070351758794, - .44378397241030093089975139264424797147500, .6416040100250626566416040100250626566416, - .44628710262841947420398014401143882423650, .6400000000000000000000000000000000000000, - .44878398282700665555822183705458883196130, .6384039900249376558603491271820448877805, - .45127464413945855836729492693848442286250, .6368159203980099502487562189054726368159, - .45375911746712049854579618113348260521900, .6352357320099255583126550868486352357320, - .45623743348158757315857769754074979573500, .6336633663366336633663366336633663366337, - .45870962262697662081833982483658473938700, .6320987654320987654320987654320987654321, - .46117571512217014895185229761409573256980, .6305418719211822660098522167487684729064, - .46363574096303250549055974261136725544930, .6289926289926289926289926289926289926290, - .46608972992459918316399125615134835243230, .6274509803921568627450980392156862745098, - .46853771156323925639597405279346276074650, .6259168704156479217603911980440097799511, - .47097971521879100631480241645476780831830, .6243902439024390243902439024390243902439, - .47341577001667212165614273544633761048330, .6228710462287104622871046228710462287105, - .47584590486996386493601107758877333253630, .6213592233009708737864077669902912621359, - .47827014848147025860569669930555392056700, .6198547215496368038740920096852300242131, - .48068852934575190261057286988943815231330, .6183574879227053140096618357487922705314, - .48310107575113581113157579238759353756900, .6168674698795180722891566265060240963855, - .48550781578170076890899053978500887751580, .6153846153846153846153846153846153846154, - .48790877731923892879351001283794175833480, .6139088729016786570743405275779376498801, - .49030398804519381705802061333088204264650, .6124401913875598086124401913875598086124, - .49269347544257524607047571407747454941280, .6109785202863961813842482100238663484487, - .49507726679785146739476431321236304938800, .6095238095238095238095238095238095238095, - .49745538920281889838648226032091770321130, .6080760095011876484560570071258907363420, - .49982786955644931126130359189119189977650, .6066350710900473933649289099526066350711, - .50219473456671548383667413872899487614650, .6052009456264775413711583924349881796690, - .50455601075239520092452494282042607665050, .6037735849056603773584905660377358490566, - .50691172444485432801997148999362252652650, .6023529411764705882352941176470588235294, - .50926190178980790257412536448100581765150, .6009389671361502347417840375586854460094, - .51160656874906207391973111953120678663250, .5995316159250585480093676814988290398126, - .51394575110223428282552049495279788970950, .5981308411214953271028037383177570093458, - .51627947444845445623684554448118433356300, .5967365967365967365967365967365967365967, - .51860776420804555186805373523384332656850, .5953488372093023255813953488372093023256, - .52093064562418522900344441950437612831600, .5939675174013921113689095127610208816705, - .52324814376454775732838697877014055848100, .5925925925925925925925925925925925925926, - .52556028352292727401362526507000438869000, .5912240184757505773672055427251732101617, - .52786708962084227803046587723656557500350, .5898617511520737327188940092165898617512, - .53016858660912158374145519701414741575700, .5885057471264367816091954022988505747126, - .53246479886947173376654518506256863474850, .5871559633027522935779816513761467889908, - .53475575061602764748158733709715306758900, .5858123569794050343249427917620137299771, - .53704146589688361856929077475797384977350, .5844748858447488584474885844748858447489, - .53932196859560876944783558428753167390800, .5831435079726651480637813211845102505695, - .54159728243274429804188230264117009937750, .5818181818181818181818181818181818181818, - .54386743096728351609669971367111429572100, .5804988662131519274376417233560090702948, - .54613243759813556721383065450936555862450, .5791855203619909502262443438914027149321, - .54839232556557315767520321969641372561450, .5778781038374717832957110609480812641084, - .55064711795266219063194057525834068655950, .5765765765765765765765765765765765765766, - .55289683768667763352766542084282264113450, .5752808988764044943820224719101123595506, - .55514150754050151093110798683483153581600, .5739910313901345291479820627802690582960, - .55738115013400635344709144192165695130850, .5727069351230425055928411633109619686801, - .55961578793542265941596269840374588966350, .5714285714285714285714285714285714285714, - .56184544326269181269140062795486301183700, .5701559020044543429844097995545657015590, - .56407013828480290218436721261241473257550, .5688888888888888888888888888888888888889, - .56628989502311577464155334382667206227800, .5676274944567627494456762749445676274945, - .56850473535266865532378233183408156037350, .5663716814159292035398230088495575221239, - .57071468100347144680739575051120482385150, .5651214128035320088300220750551876379691, - .57291975356178548306473885531886480748650, .5638766519823788546255506607929515418502, - .57511997447138785144460371157038025558000, .5626373626373626373626373626373626373626, - .57731536503482350219940144597785547375700, .5614035087719298245614035087719298245614, - .57950594641464214795689713355386629700650, .5601750547045951859956236323851203501094, - .58169173963462239562716149521293118596100, .5589519650655021834061135371179039301310, - .58387276558098266665552955601015128195300, .5577342047930283224400871459694989106754, - .58604904500357812846544902640744112432000, .5565217391304347826086956521739130434783, - .58822059851708596855957011939608491957200, .5553145336225596529284164859002169197397, - .59038744660217634674381770309992134571100, .5541125541125541125541125541125541125541, - .59254960960667157898740242671919986605650, .5529157667386609071274298056155507559395, - .59470710774669277576265358220553025603300, .5517241379310344827586206896551724137931, - .59685996110779382384237123915227130055450, .5505376344086021505376344086021505376344, - .59900818964608337768851242799428291618800, .5493562231759656652360515021459227467811, - .60115181318933474940990890900138765573500, .5481798715203426124197002141327623126338, - .60329085143808425240052883964381180703650, .5470085470085470085470085470085470085470, - .60542532396671688843525771517306566238400, .5458422174840085287846481876332622601279, - .60755525022454170969155029524699784815300, .5446808510638297872340425531914893617021, - .60968064953685519036241657886421307921400, .5435244161358811040339702760084925690021, - .61180154110599282990534675263916142284850, .5423728813559322033898305084745762711864, - .61391794401237043121710712512140162289150, .5412262156448202959830866807610993657505, - .61602987721551394351138242200249806046500, .5400843881856540084388185654008438818565, - .61813735955507864705538167982012964785100, .5389473684210526315789473684210526315789, - .62024040975185745772080281312810257077200, .5378151260504201680672268907563025210084, - .62233904640877868441606324267922900617100, .5366876310272536687631027253668763102725, - .62443328801189346144440150965237990021700, .5355648535564853556485355648535564853556, - .62652315293135274476554741340805776417250, .5344467640918580375782881002087682672234, - .62860865942237409420556559780379757285100, .5333333333333333333333333333333333333333, - .63068982562619868570408243613201193511500, .5322245322245322245322245322245322245322, - .63276666957103777644277897707070223987100, .5311203319502074688796680497925311203320, - .63483920917301017716738442686619237065300, .5300207039337474120082815734989648033126, - .63690746223706917739093569252872839570050, .5289256198347107438016528925619834710744, - .63897144645792069983514238629140891134750, .5278350515463917525773195876288659793814, - .64103117942093124081992527862894348800200, .5267489711934156378600823045267489711934, - .64308667860302726193566513757104985415950, .5256673511293634496919917864476386036961, - .64513796137358470073053240412264131009600, .5245901639344262295081967213114754098361, - .64718504499530948859131740391603671014300, .5235173824130879345603271983640081799591, - .64922794662510974195157587018911726772800, .5224489795918367346938775510204081632653, - .65126668331495807251485530287027359008800, .5213849287169042769857433808553971486762, - .65330127201274557080523663898929953575150, .5203252032520325203252032520325203252033, - .65533172956312757406749369692988693714150, .5192697768762677484787018255578093306288, - .65735807270835999727154330685152672231200, .5182186234817813765182186234817813765182, - .65938031808912778153342060249997302889800, .5171717171717171717171717171717171717172, - .66139848224536490484126716182800009846700, .5161290322580645161290322580645161290323, - .66341258161706617713093692145776003599150, .5150905432595573440643863179074446680080, - .66542263254509037562201001492212526500250, .5140562248995983935742971887550200803213, - .66742865127195616370414654738851822912700, .5130260521042084168336673346693386773547, - .66943065394262923906154583164607174694550, .5120000000000000000000000000000000000000, - .67142865660530226534774556057527661323550, .5109780439121756487025948103792415169661, - .67342267521216669923234121597488410770900, .5099601593625498007968127490039840637450, - .67541272562017662384192817626171745359900, .5089463220675944333996023856858846918489, - .67739882359180603188519853574689477682100, .5079365079365079365079365079365079365079, - .67938098479579733801614338517538271844400, .5069306930693069306930693069306930693069, - .68135922480790300781450241629499942064300, .5059288537549407114624505928853754940711, - .68333355911162063645036823800182901322850, .5049309664694280078895463510848126232742, - .68530400309891936760919861626462079584600, .5039370078740157480314960629921259842520, - .68727057207096020619019327568821609020250, .5029469548133595284872298624754420432220, - .68923328123880889251040571252815425395950, .5019607843137254901960784313725490196078, - .69314718055994530941723212145818, 5.0e-01, -}; - -static float logTab_f[(LOGTAB_MASK+1)*2]; -static volatile bool logTab_f_initialized = false; - #define LOGTAB_TRANSLATE(tab, x, h) (((x) - 1.f)*tab[(h)+1]) static const double ln_2 = 0.69314718055994530941723212145818; @@ -1006,15 +673,10 @@ void log32f( const float *_x, float *y, int n ) { CV_INSTRUMENT_REGION() - if( !logTab_f_initialized ) - { - for( int j = 0; j < (LOGTAB_MASK+1)*2; j++ ) - logTab_f[j] = (float)logTab[j]; - logTab_f_initialized = true; - } + const float* const logTab_f = cv::details::getLogTab32f(); - static const int LOGTAB_MASK2_32F = (1 << (23 - LOGTAB_SCALE)) - 1; - static const float + const int LOGTAB_MASK2_32F = (1 << (23 - LOGTAB_SCALE)) - 1; + const float A0 = 0.3333333333333333333333333f, A1 = -0.5f, A2 = 1.f; @@ -1082,8 +744,10 @@ void log64f( const double *x, double *y, int n ) { CV_INSTRUMENT_REGION() - static const int64 LOGTAB_MASK2_64F = ((int64)1 << (52 - LOGTAB_SCALE)) - 1; - static const double + const double* const logTab = cv::details::getLogTab64f(); + + const int64 LOGTAB_MASK2_64F = ((int64)1 << (52 - LOGTAB_SCALE)) - 1; + const double A7 = 1.0, A6 = -0.5, A5 = 0.333333333333333314829616256247390992939472198486328125, From f056c0f13783f307130b276fe77b75d2349a5856 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Mon, 13 Aug 2018 16:46:04 +0300 Subject: [PATCH 02/17] UINT8 face detection network using Intel's Inference Engine backend --- modules/dnn/misc/quantize_face_detector.py | 19 ++++- .../dnn/src/layers/normalize_bbox_layer.cpp | 73 +++++++++++++++---- modules/dnn/src/tensorflow/tf_importer.cpp | 7 +- modules/dnn/test/test_tf_importer.cpp | 8 +- 4 files changed, 80 insertions(+), 27 deletions(-) diff --git a/modules/dnn/misc/quantize_face_detector.py b/modules/dnn/misc/quantize_face_detector.py index 8a8b88d181..6dae0266ee 100644 --- a/modules/dnn/misc/quantize_face_detector.py +++ b/modules/dnn/misc/quantize_face_detector.py @@ -104,8 +104,12 @@ def l2norm(x, name): inp = tf.placeholder(dtype, [1, 300, 300, 3], 'data') data_bn = batch_norm(inp, 'data_bn') data_scale = scale(data_bn, 'data_scale') -data_scale = tf.pad(data_scale, [[0, 0], [3, 3], [3, 3], [0, 0]]) + +# Instead of tf.pad we use tf.space_to_batch_nd layers which override convolution's padding strategy to explicit numbers +# data_scale = tf.pad(data_scale, [[0, 0], [3, 3], [3, 3], [0, 0]]) +data_scale = tf.space_to_batch_nd(data_scale, [1, 1], [[3, 3], [3, 3]], name='Pad') conv1_h = conv(data_scale, stride=2, pad='VALID', name='conv1_h') + conv1_bn_h = batch_norm(conv1_h, 'conv1_bn_h') conv1_scale_h = scale(conv1_bn_h, 'conv1_scale_h') conv1_relu = tf.nn.relu(conv1_scale_h) @@ -133,8 +137,11 @@ layer_128_1_sum = layer_128_1_conv2 + layer_128_1_conv_expand_h layer_256_1_bn1 = batch_norm(layer_128_1_sum, 'layer_256_1_bn1') layer_256_1_scale1 = scale(layer_256_1_bn1, 'layer_256_1_scale1') layer_256_1_relu1 = tf.nn.relu(layer_256_1_scale1) -layer_256_1_conv1 = tf.pad(layer_256_1_relu1, [[0, 0], [1, 1], [1, 1], [0, 0]]) + +# layer_256_1_conv1 = tf.pad(layer_256_1_relu1, [[0, 0], [1, 1], [1, 1], [0, 0]]) +layer_256_1_conv1 = tf.space_to_batch_nd(layer_256_1_relu1, [1, 1], [[1, 1], [1, 1]], name='Pad_1') layer_256_1_conv1 = conv(layer_256_1_conv1, stride=2, pad='VALID', name='layer_256_1_conv1') + layer_256_1_bn2 = batch_norm(layer_256_1_conv1, 'layer_256_1_bn2') layer_256_1_scale2 = scale(layer_256_1_bn2, 'layer_256_1_scale2') layer_256_1_relu2 = tf.nn.relu(layer_256_1_scale2) @@ -160,8 +167,11 @@ fc7 = tf.nn.relu(last_scale_h, name='last_relu') conv6_1_h = conv(fc7, 'conv6_1_h', activ=tf.nn.relu) conv6_2_h = conv(conv6_1_h, stride=2, name='conv6_2_h', activ=tf.nn.relu) conv7_1_h = conv(conv6_2_h, 'conv7_1_h', activ=tf.nn.relu) -conv7_2_h = tf.pad(conv7_1_h, [[0, 0], [1, 1], [1, 1], [0, 0]]) + +# conv7_2_h = tf.pad(conv7_1_h, [[0, 0], [1, 1], [1, 1], [0, 0]]) +conv7_2_h = tf.space_to_batch_nd(conv7_1_h, [1, 1], [[1, 1], [1, 1]], name='Pad_2') conv7_2_h = conv(conv7_2_h, stride=2, pad='VALID', name='conv7_2_h', activ=tf.nn.relu) + conv8_1_h = conv(conv7_2_h, pad='SAME', name='conv8_1_h', activ=tf.nn.relu) conv8_2_h = conv(conv8_1_h, pad='SAME', name='conv8_2_h', activ=tf.nn.relu) conv9_1_h = conv(conv8_2_h, 'conv9_1_h', activ=tf.nn.relu) @@ -201,6 +211,7 @@ with tf.Session() as sess: inputData = np.random.standard_normal([1, 3, 300, 300]).astype(np.float32) cvNet.setInput(inputData) + cvNet.setPreferableBackend(cv.dnn.DNN_BACKEND_OPENCV) outDNN = cvNet.forward(out_nodes) outTF = sess.run([mbox_loc, mbox_conf_flatten], feed_dict={inp: inputData.transpose(0, 2, 3, 1)}) @@ -254,7 +265,7 @@ for i in reversed(range(len(graph_def.node))): del graph_def.node[i] for attr in ['T', 'data_format', 'Tshape', 'N', 'Tidx', 'Tdim', 'use_cudnn_on_gpu', 'Index', 'Tperm', 'is_training', - 'Tpaddings']: + 'Tpaddings', 'Tblock_shape', 'Tcrops']: if attr in graph_def.node[i].attr: del graph_def.node[i].attr[attr] diff --git a/modules/dnn/src/layers/normalize_bbox_layer.cpp b/modules/dnn/src/layers/normalize_bbox_layer.cpp index 86a56915a2..70d9b7385a 100644 --- a/modules/dnn/src/layers/normalize_bbox_layer.cpp +++ b/modules/dnn/src/layers/normalize_bbox_layer.cpp @@ -63,9 +63,18 @@ public: virtual bool supportBackend(int backendId) CV_OVERRIDE { - return backendId == DNN_BACKEND_OPENCV || - backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() && - pnorm == 2 && !blobs.empty(); + if (backendId == DNN_BACKEND_INFERENCE_ENGINE) + { + if (pnorm != 2) + return false; + if (!blobs.empty()) + return true; + if (preferableTarget == DNN_TARGET_MYRIAD) + return !acrossSpatial; + return startAxis == 1 && (!acrossSpatial || endAxis > 1); + } + else + return backendId == DNN_BACKEND_OPENCV; } bool getMemoryShapes(const std::vector &inputs, @@ -80,6 +89,14 @@ public: return true; } + void finalize(const std::vector &inputs, std::vector &outputs) CV_OVERRIDE + { + CV_Assert(inputs.size() == 1); + endAxis = endAxis == -1 ? (inputs[0]->dims - 1) : endAxis; + startAxis = startAxis == -1 ? (inputs[0]->dims - 1) : startAxis; + acrossSpatial = (startAxis == 1 && endAxis == inputs[0]->dims - 1); + } + #ifdef HAVE_OPENCL bool forward_ocl(InputArrayOfArrays inputs_, OutputArrayOfArrays outputs_, OutputArrayOfArrays internals_) { @@ -240,24 +257,52 @@ public: } } - virtual Ptr initInfEngine(const std::vector >&) CV_OVERRIDE + virtual Ptr initInfEngine(const std::vector >& inputs) CV_OVERRIDE { #ifdef HAVE_INF_ENGINE + InferenceEngine::DataPtr input = infEngineDataNode(inputs[0]); + InferenceEngine::LayerParams lp; lp.name = name; - lp.type = "Normalize"; lp.precision = InferenceEngine::Precision::FP32; - std::shared_ptr ieLayer(new InferenceEngine::CNNLayer(lp)); - CV_Assert(!blobs.empty()); + if (input->dims.size() == 4) + { + const int numChannels = input->dims[2]; // NOTE: input->dims are reversed (whcn) - ieLayer->params["eps"] = format("%f", epsilon); - ieLayer->params["across_spatial"] = acrossSpatial ? "1" : "0"; - ieLayer->params["channel_shared"] = blobs[0].total() == 1 ? "1" : "0"; - - const size_t numChannels = blobs[0].total(); - ieLayer->blobs["weights"] = wrapToInfEngineBlob(blobs[0], {numChannels}, InferenceEngine::Layout::C); - return Ptr(new InfEngineBackendNode(ieLayer)); + lp.type = "Normalize"; + std::shared_ptr ieLayer(new InferenceEngine::CNNLayer(lp)); + if (blobs.empty()) + { + auto weights = InferenceEngine::make_shared_blob(InferenceEngine::Precision::FP32, + InferenceEngine::Layout::C, + {numChannels}); + weights->allocate(); + std::vector ones(numChannels, 1); + weights->set(ones); + ieLayer->blobs["weights"] = weights; + ieLayer->params["channel_shared"] = "0"; + } + else + { + CV_Assert(numChannels == blobs[0].total()); + ieLayer->blobs["weights"] = wrapToInfEngineBlob(blobs[0], {numChannels}, InferenceEngine::Layout::C); + ieLayer->params["channel_shared"] = blobs[0].total() == 1 ? "1" : "0"; + } + ieLayer->params["eps"] = format("%f", epsilon); + ieLayer->params["across_spatial"] = acrossSpatial ? "1" : "0"; + return Ptr(new InfEngineBackendNode(ieLayer)); + } + else + { + InferenceEngine::LayerParams lp; + lp.name = name; + lp.type = "GRN"; + lp.precision = InferenceEngine::Precision::FP32; + std::shared_ptr ieLayer(new InferenceEngine::CNNLayer(lp)); + ieLayer->params["bias"] = format("%f", epsilon); + return Ptr(new InfEngineBackendNode(ieLayer)); + } #endif // HAVE_INF_ENGINE return Ptr(); } diff --git a/modules/dnn/src/tensorflow/tf_importer.cpp b/modules/dnn/src/tensorflow/tf_importer.cpp index 66c03a777e..13df37102c 100644 --- a/modules/dnn/src/tensorflow/tf_importer.cpp +++ b/modules/dnn/src/tensorflow/tf_importer.cpp @@ -529,7 +529,8 @@ const tensorflow::TensorProto& TFImporter::getConstBlob(const tensorflow::NodeDe Pin kernel_inp = parsePin(layer.input(input_blob_index)); if (const_layers.find(kernel_inp.name) == const_layers.end()) - CV_Error(Error::StsError, "Const kernel input not found"); + CV_Error(Error::StsError, "Input [" + layer.input(input_blob_index) + + "] for node [" + layer.name() + "] not found"); if (kernel_inp.blobIndex != 0) CV_Error(Error::StsError, "Unsupported kernel input"); @@ -867,13 +868,13 @@ void TFImporter::populateNet(Net dstNet) layerParams.set("num_output", layerParams.blobs[0].size[0]); setStrides(layerParams, layer); - setPadding(layerParams, layer); + if (!layerParams.has("pad_w") && !layerParams.has("pad_h")) + setPadding(layerParams, layer); // The final node of dilated convolution subgraph. next_layers = getNextLayers(net, name, "BatchToSpaceND"); if (!next_layers.empty()) { - layerParams.set("pad_mode", ""); // We use padding values. CV_Assert(next_layers.size() == 1); ExcludeLayer(net, next_layers[0].second, 0, false); layers_to_ignore.insert(next_layers[0].first); diff --git a/modules/dnn/test/test_tf_importer.cpp b/modules/dnn/test/test_tf_importer.cpp index 63b43f1b72..f3ac5333b3 100644 --- a/modules/dnn/test/test_tf_importer.cpp +++ b/modules/dnn/test/test_tf_importer.cpp @@ -239,7 +239,7 @@ TEST_P(Test_TensorFlow_layers, l2_normalize) // TODO: fix it and add to l2_normalize TEST_P(Test_TensorFlow_layers, l2_normalize_3d) { - if (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD) + if (backend == DNN_BACKEND_INFERENCE_ENGINE && target != DNN_TARGET_CPU) throw SkipTestException(""); runTensorFlowNet("l2_normalize_3d"); } @@ -360,10 +360,6 @@ TEST_P(Test_TensorFlow_nets, MobileNet_v1_SSD_PPN) TEST_P(Test_TensorFlow_nets, opencv_face_detector_uint8) { checkBackend(); - if (backend == DNN_BACKEND_INFERENCE_ENGINE && - (target == DNN_TARGET_OPENCL || target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD)) - throw SkipTestException(""); - std::string proto = findDataFile("dnn/opencv_face_detector.pbtxt", false); std::string model = findDataFile("dnn/opencv_face_detector_uint8.pb", false); @@ -386,7 +382,7 @@ TEST_P(Test_TensorFlow_nets, opencv_face_detector_uint8) 0, 1, 0.97203469, 0.67965847, 0.06876482, 0.73999709, 0.1513494, 0, 1, 0.95097077, 0.51901293, 0.45863652, 0.5777427, 0.5347801); double scoreDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 4e-3 : 3.4e-3; - double iouDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.017 : 1e-2; + double iouDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.024 : 1e-2; normAssertDetections(ref, out, "", 0.9, scoreDiff, iouDiff); } From 22cb65ada9522b53ae3a77b71cda2e1644d10d56 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Tue, 14 Aug 2018 13:16:23 +0300 Subject: [PATCH 03/17] Update face detection network in samples --- .../face_detector/opencv_face_detector.pbtxt | 125 ++++++++++++++---- 1 file changed, 96 insertions(+), 29 deletions(-) diff --git a/samples/dnn/face_detector/opencv_face_detector.pbtxt b/samples/dnn/face_detector/opencv_face_detector.pbtxt index e537e006bc..5f498aad50 100644 --- a/samples/dnn/face_detector/opencv_face_detector.pbtxt +++ b/samples/dnn/face_detector/opencv_face_detector.pbtxt @@ -35,11 +35,55 @@ node { input: "data_scale/Mul" input: "data_scale/add" } +node { + name: "SpaceToBatchND/block_shape" + op: "Const" + attr { + key: "value" + value { + tensor { + dtype: DT_INT32 + tensor_shape { + dim { + size: 2 + } + } + int_val: 1 + int_val: 1 + } + } + } +} +node { + name: "SpaceToBatchND/paddings" + op: "Const" + attr { + key: "value" + value { + tensor { + dtype: DT_INT32 + tensor_shape { + dim { + size: 2 + } + dim { + size: 2 + } + } + int_val: 3 + int_val: 3 + int_val: 3 + int_val: 3 + } + } + } +} node { name: "Pad" - op: "Pad" + op: "SpaceToBatchND" input: "data_scale/BiasAdd" - input: "Pad/paddings" + input: "SpaceToBatchND/block_shape" + input: "SpaceToBatchND/paddings" } node { name: "conv1_h/Conv2D" @@ -81,10 +125,15 @@ node { input: "conv1_h/Conv2D" input: "conv1_h/bias" } +node { + name: "BatchToSpaceND" + op: "BatchToSpaceND" + input: "conv1_h/BiasAdd" +} node { name: "conv1_bn_h/FusedBatchNorm" op: "FusedBatchNorm" - input: "conv1_h/BiasAdd" + input: "BatchToSpaceND" input: "conv1_bn_h/gamma" input: "conv1_bn_h/beta" input: "conv1_bn_h/mean" @@ -439,10 +488,28 @@ node { input: "layer_256_1_scale1/BiasAdd" } node { - name: "Pad_1" - op: "Pad" - input: "Relu_4" - input: "Pad_1/paddings" + name: "SpaceToBatchND_1/paddings" + op: "Const" + attr { + key: "value" + value { + tensor { + dtype: DT_INT32 + tensor_shape { + dim { + size: 2 + } + dim { + size: 2 + } + } + int_val: 1 + int_val: 1 + int_val: 1 + int_val: 1 + } + } + } } node { name: "layer_256_1_conv_expand/Conv2D" @@ -580,6 +647,13 @@ node { op: "Flatten" input: "conv4_3_norm_mbox_conf/BiasAdd" } +node { + name: "Pad_1" + op: "SpaceToBatchND" + input: "Relu_4" + input: "SpaceToBatchND/block_shape" + input: "SpaceToBatchND_1/paddings" +} node { name: "layer_256_1_conv1/Conv2D" op: "Conv2D" @@ -620,10 +694,15 @@ node { input: "layer_256_1_conv1/Conv2D" input: "layer_256_1_conv1/Conv2D_bn_offset" } +node { + name: "BatchToSpaceND_1" + op: "BatchToSpaceND" + input: "layer_256_1_bn2/FusedBatchNorm" +} node { name: "layer_256_1_scale2/Mul" op: "Mul" - input: "layer_256_1_bn2/FusedBatchNorm" + input: "BatchToSpaceND_1" input: "layer_256_1_scale2/mul" } node { @@ -806,12 +885,6 @@ node { input: "Relu_7" input: "layer_512_1_conv2_h/convolution/SpaceToBatchND/block_shape" input: "layer_512_1_conv2_h/convolution/SpaceToBatchND/paddings" - attr { - key: "Tblock_shape" - value { - type: DT_INT32 - } - } } node { name: "layer_512_1_conv2_h/convolution" @@ -853,18 +926,6 @@ node { input: "layer_512_1_conv2_h/convolution" input: "layer_512_1_conv2_h/convolution/BatchToSpaceND/block_shape" input: "layer_512_1_conv2_h/convolution/BatchToSpaceND/crops" - attr { - key: "Tblock_shape" - value { - type: DT_INT32 - } - } - attr { - key: "Tcrops" - value { - type: DT_INT32 - } - } } node { name: "add_3" @@ -1041,9 +1102,10 @@ node { } node { name: "Pad_2" - op: "Pad" + op: "SpaceToBatchND" input: "conv7_1_h/Relu" - input: "Pad_2/paddings" + input: "SpaceToBatchND/block_shape" + input: "SpaceToBatchND_1/paddings" } node { name: "conv7_2_h/Conv2D" @@ -1085,10 +1147,15 @@ node { input: "conv7_2_h/Conv2D" input: "conv7_2_h/bias" } +node { + name: "BatchToSpaceND_2" + op: "BatchToSpaceND" + input: "conv7_2_h/BiasAdd" +} node { name: "conv7_2_h/Relu" op: "Relu" - input: "conv7_2_h/BiasAdd" + input: "BatchToSpaceND_2" } node { name: "conv8_1_h/Conv2D" From 1567a654759e307b8008321506b73671fa8070ea Mon Sep 17 00:00:00 2001 From: Hiro Kobayashi Date: Wed, 15 Aug 2018 16:57:36 +0900 Subject: [PATCH 04/17] Fix a typo in the tutorial --- doc/tutorials/tutorials.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tutorials/tutorials.markdown b/doc/tutorials/tutorials.markdown index 59bab9ad75..53f8bc2694 100644 --- a/doc/tutorials/tutorials.markdown +++ b/doc/tutorials/tutorials.markdown @@ -15,7 +15,7 @@ As always, we would be happy to hear your comments and receive your contribution - @subpage tutorial_table_of_content_core Here you will learn - the about the basic building blocks of this library. A must read for understanding how + about the basic building blocks of this library. A must read for understanding how to manipulate the images on a pixel level. - @subpage tutorial_table_of_content_imgproc From 860ae77ec97a6b246e9548e57b7b4a3a8fbb38c7 Mon Sep 17 00:00:00 2001 From: Suleyman TURKMEN Date: Mon, 6 Aug 2018 19:45:01 +0300 Subject: [PATCH 05/17] Update seamless_cloning --- modules/photo/src/seamless_cloning.cpp | 35 +++++---------- modules/photo/src/seamless_cloning.hpp | 1 - modules/photo/src/seamless_cloning_impl.cpp | 48 ++++++++------------- 3 files changed, 28 insertions(+), 56 deletions(-) diff --git a/modules/photo/src/seamless_cloning.cpp b/modules/photo/src/seamless_cloning.cpp index 16376def62..43753b0c11 100644 --- a/modules/photo/src/seamless_cloning.cpp +++ b/modules/photo/src/seamless_cloning.cpp @@ -62,12 +62,12 @@ void cv::seamlessClone(InputArray _src, InputArray _dst, InputArray _mask, Point int h = mask.size().height; int w = mask.size().width; - Mat gray = Mat(mask.size(),CV_8UC1); + Mat gray; if(mask.channels() == 3) cvtColor(mask, gray, COLOR_BGR2GRAY ); else - gray = mask; + mask.copyTo(gray); for(int i=0;i(0); const unsigned char * imgLinePtr = img.ptr(0); @@ -221,9 +215,7 @@ void Cloning::poissonSolver(const Mat &img, Mat &laplacianX , Mat &laplacianY, M const int w = img.cols; const int h = img.rows; - Mat lap = Mat(img.size(),CV_32FC1); - - lap = laplacianX + laplacianY; + Mat lap = laplacianX + laplacianY; Mat bound = img.clone(); @@ -264,19 +256,19 @@ void Cloning::initVariables(const Mat &destination, const Mat &binaryMask) void Cloning::computeDerivatives(const Mat& destination, const Mat &patch, const Mat &binaryMask) { - initVariables(destination,binaryMask); + initVariables(destination, binaryMask); - computeGradientX(destination,destinationGradientX); - computeGradientY(destination,destinationGradientY); + computeGradientX(destination, destinationGradientX); + computeGradientY(destination, destinationGradientY); - computeGradientX(patch,patchGradientX); - computeGradientY(patch,patchGradientY); + computeGradientX(patch, patchGradientX); + computeGradientY(patch, patchGradientY); Mat Kernel(Size(3, 3), CV_8UC1); Kernel.setTo(Scalar(1)); erode(binaryMask, binaryMask, Kernel, Point(-1,-1), 3); - binaryMask.convertTo(binaryMaskFloat,CV_32FC1,1.0/255.0); + binaryMask.convertTo(binaryMaskFloat, CV_32FC1, 1.0/255.0); } void Cloning::scalarProduct(Mat mat, float r, float g, float b) @@ -305,11 +297,8 @@ void Cloning::arrayProduct(const cv::Mat& lhs, const cv::Mat& rhs, cv::Mat& resu void Cloning::poisson(const Mat &destination) { - Mat laplacianX = Mat(destination.size(),CV_32FC3); - Mat laplacianY = Mat(destination.size(),CV_32FC3); - - laplacianX = destinationGradientX + patchGradientX; - laplacianY = destinationGradientY + patchGradientY; + Mat laplacianX = destinationGradientX + patchGradientX; + Mat laplacianY = destinationGradientY + patchGradientY; computeLaplacianX(laplacianX,laplacianX); computeLaplacianY(laplacianY,laplacianY); @@ -331,8 +320,8 @@ void Cloning::evaluate(const Mat &I, const Mat &wmask, const Mat &cloned) wmask.convertTo(binaryMaskFloatInverted,CV_32FC1,1.0/255.0); - arrayProduct(destinationGradientX,binaryMaskFloatInverted, destinationGradientX); - arrayProduct(destinationGradientY,binaryMaskFloatInverted, destinationGradientY); + arrayProduct(destinationGradientX, binaryMaskFloatInverted, destinationGradientX); + arrayProduct(destinationGradientY, binaryMaskFloatInverted, destinationGradientY); poisson(I); @@ -351,8 +340,8 @@ void Cloning::normalClone(const Mat &destination, const Mat &patch, const Mat &b switch(flag) { case NORMAL_CLONE: - arrayProduct(patchGradientX,binaryMaskFloat, patchGradientX); - arrayProduct(patchGradientY,binaryMaskFloat, patchGradientY); + arrayProduct(patchGradientX, binaryMaskFloat, patchGradientX); + arrayProduct(patchGradientY, binaryMaskFloat, patchGradientY); break; case MIXED_CLONE: @@ -392,7 +381,7 @@ void Cloning::normalClone(const Mat &destination, const Mat &patch, const Mat &b break; case MONOCHROME_TRANSFER: - Mat gray = Mat(patch.size(),CV_8UC1); + Mat gray; cvtColor(patch, gray, COLOR_BGR2GRAY ); computeGradientX(gray,patchGradientX); @@ -429,7 +418,7 @@ void Cloning::illuminationChange(Mat &I, Mat &mask, Mat &wmask, Mat &cloned, flo arrayProduct(patchGradientX,binaryMaskFloat, patchGradientX); arrayProduct(patchGradientY,binaryMaskFloat, patchGradientY); - Mat mag = Mat(I.size(),CV_32FC3); + Mat mag; magnitude(patchGradientX,patchGradientY,mag); Mat multX, multY, multx_temp, multy_temp; @@ -457,11 +446,10 @@ void Cloning::textureFlatten(Mat &I, Mat &mask, Mat &wmask, float low_threshold, { computeDerivatives(I,mask,wmask); - Mat out = Mat(mask.size(),CV_8UC1); + Mat out; Canny(mask,out,low_threshold,high_threshold,kernel_size); - Mat zeros(patchGradientX.size(), CV_32FC3); - zeros.setTo(0); + Mat zeros = Mat::zeros(patchGradientX.size(), CV_32FC3); Mat zerosMask = (out != 255); zeros.copyTo(patchGradientX, zerosMask); zeros.copyTo(patchGradientY, zerosMask); From f0c46a4c74518de8e7f5796705ee0a17b84bd638 Mon Sep 17 00:00:00 2001 From: Tomoaki Teshima Date: Thu, 16 Aug 2018 19:11:40 +0900 Subject: [PATCH 06/17] fix typo --- modules/calib3d/include/opencv2/calib3d.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/calib3d/include/opencv2/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d.hpp index fcd295da6f..142e8b3698 100644 --- a/modules/calib3d/include/opencv2/calib3d.hpp +++ b/modules/calib3d/include/opencv2/calib3d.hpp @@ -118,7 +118,7 @@ v = f_y*y'' + c_y tangential distortion coefficients. \f$s_1\f$, \f$s_2\f$, \f$s_3\f$, and \f$s_4\f$, are the thin prism distortion coefficients. Higher-order coefficients are not considered in OpenCV. -The next figure shows two common types of radial distortion: barrel distortion (typically \f$ k_1 > 0 \f$ and pincushion distortion (typically \f$ k_1 < 0 \f$). +The next figure shows two common types of radial distortion: barrel distortion (typically \f$ k_1 > 0 \f$) and pincushion distortion (typically \f$ k_1 < 0 \f$). ![](pics/distortion_examples.png) From 96f92c6705037a2dd3b84947bf4a62d84f889e4d Mon Sep 17 00:00:00 2001 From: Bahram Dahi Date: Wed, 15 Aug 2018 10:47:54 -0700 Subject: [PATCH 07/17] imgproc(tests): intersetion calculation of RotatedRect --- modules/imgproc/test/test_intersection.cpp | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/modules/imgproc/test/test_intersection.cpp b/modules/imgproc/test/test_intersection.cpp index 249950afea..e8ea21c47b 100644 --- a/modules/imgproc/test/test_intersection.cpp +++ b/modules/imgproc/test/test_intersection.cpp @@ -71,6 +71,8 @@ private: void test12(); void test13(); void test14(); + void test15(); + void test16(); }; static void compare(const std::vector& test, const std::vector& target) @@ -116,6 +118,8 @@ void CV_RotatedRectangleIntersectionTest::run(int) test12(); test13(); test14(); + test15(); + test16(); } void CV_RotatedRectangleIntersectionTest::test1() @@ -376,6 +380,40 @@ void CV_RotatedRectangleIntersectionTest::test14() } } +void CV_RotatedRectangleIntersectionTest::test15() +{ + RotatedRect r1( + Point2f(259.65081787109375, 51.58895492553711), + Size2f(5487.8779296875, 233.8921661376953), + -29.488616943359375); + RotatedRect r2( + Point2f(293.70465087890625, 112.10154724121094), + Size2f(5487.8896484375, 234.87368774414062), + -31.27001953125); + + std::vector intersections; + int interType = cv::rotatedRectangleIntersection(r1, r2, intersections); + EXPECT_TRUE(interType == INTERSECT_PARTIAL); + EXPECT_TRUE(intersections.size() == 8); +} + +void CV_RotatedRectangleIntersectionTest::test16() +{ + RotatedRect r1( + Point2f(239.78500366210938, 515.72021484375), + Size2f(70.23420715332031, 39.74684524536133), + -42.86162567138672); + RotatedRect r2( + Point2f(242.4205322265625, 510.1195373535156), + Size2f(66.85948944091797, 61.46455383300781), + -9.840961456298828); + + std::vector intersections; + int interType = cv::rotatedRectangleIntersection(r1, r2, intersections); + EXPECT_TRUE(interType == INTERSECT_PARTIAL); + EXPECT_TRUE(intersections.size() == 8); +} + TEST (Imgproc_RotatedRectangleIntersection, accuracy) { CV_RotatedRectangleIntersectionTest test; test.safe_run(); } }} // namespace From f89defad5d3976521a77dea2500b24438d7a7cbe Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 16 Aug 2018 14:31:29 +0300 Subject: [PATCH 08/17] imgproc: fix rotatedRectangleIntersection() --- modules/imgproc/src/intersection.cpp | 94 +++++++++++++++------- modules/imgproc/test/test_intersection.cpp | 14 ++-- 2 files changed, 73 insertions(+), 35 deletions(-) diff --git a/modules/imgproc/src/intersection.cpp b/modules/imgproc/src/intersection.cpp index 3e4a266b30..36e2073195 100644 --- a/modules/imgproc/src/intersection.cpp +++ b/modules/imgproc/src/intersection.cpp @@ -51,12 +51,13 @@ int rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& r { CV_INSTRUMENT_REGION() - const float samePointEps = 0.00001f; // used to test if two points are the same + // L2 metric + const float samePointEps = std::max(1e-16f, 1e-6f * (float)std::max(rect1.size.area(), rect2.size.area())); Point2f vec1[4], vec2[4]; Point2f pts1[4], pts2[4]; - std::vector intersection; + std::vector intersection; intersection.reserve(24); rect1.points(pts1); rect2.points(pts2); @@ -219,41 +220,80 @@ int rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& r } } - // Get rid of dupes and order points. - for( int i = 0; i < (int)intersection.size()-1; i++ ) + int N = (int)intersection.size(); + if (N == 0) { - float dx1 = intersection[i + 1].x - intersection[i].x; - float dy1 = intersection[i + 1].y - intersection[i].y; - for( size_t j = i+1; j < intersection.size(); j++ ) - { - float dx = intersection[j].x - intersection[i].x; - float dy = intersection[j].y - intersection[i].y; - double d2 = dx*dx + dy*dy; // can be a really small number, need double here + return INTERSECT_NONE; + } - if( d2 < samePointEps*samePointEps ) + // Get rid of duplicated points + int Nstride = N; + cv::AutoBuffer distPt(N * N); + cv::AutoBuffer ptDistRemap(N); + for (int i = 0; i < N; ++i) + { + const Point2f pt0 = intersection[i]; + ptDistRemap[i] = i; + for (int j = i + 1; j < N; ) + { + const Point2f pt1 = intersection[j]; + float d2 = normL2Sqr(pt1 - pt0); + if(d2 <= samePointEps) { - // Found a dupe, remove it - std::swap(intersection[j], intersection.back()); - intersection.pop_back(); - j--; // restart check + if (j < N - 1) + intersection[j] = intersection[N - 1]; + N--; + continue; } - else if (dx1 * dy - dy1 * dx < 0) + distPt[i*Nstride + j] = d2; + ++j; + } + } + while (N > 8) // we still have duplicate points after samePointEps threshold (eliminate closest points) + { + int minI = 0; + int minJ = 1; + float minD = distPt[1]; + for (int i = 0; i < N - 1; ++i) + { + float* pDist = distPt.data() + Nstride * ptDistRemap[i]; + for (int j = i + 1; j < N; ++j) + { + float d = pDist[ptDistRemap[j]]; + if (d < minD) + { + minD = d; + minI = i; + minJ = j; + } + } + } + CV_Assert(fabs(normL2Sqr(intersection[minI] - intersection[minJ]) - minD) < 1e-6); // ptDistRemap is not corrupted + // drop minJ point + if (minJ < N - 1) + { + intersection[minJ] = intersection[N - 1]; + ptDistRemap[minJ] = ptDistRemap[N - 1]; + } + N--; + } + + // order points + for (int i = 0; i < N - 1; ++i) + { + Point2f diffI = intersection[i + 1] - intersection[i]; + for (int j = i + 2; j < N; ++j) + { + Point2f diffJ = intersection[j] - intersection[i]; + if (diffI.cross(diffJ) < 0) { std::swap(intersection[i + 1], intersection[j]); - dx1 = dx; - dy1 = dy; + diffI = diffJ; } } } - if( intersection.empty() ) - { - return INTERSECT_NONE ; - } - - // If this check fails then it means we're getting dupes, increase samePointEps - CV_Assert( intersection.size() <= 8 ); - + intersection.resize(N); Mat(intersection).copyTo(intersectingRegion); return ret; diff --git a/modules/imgproc/test/test_intersection.cpp b/modules/imgproc/test/test_intersection.cpp index e8ea21c47b..0bb9b6ebf9 100644 --- a/modules/imgproc/test/test_intersection.cpp +++ b/modules/imgproc/test/test_intersection.cpp @@ -118,8 +118,6 @@ void CV_RotatedRectangleIntersectionTest::run(int) test12(); test13(); test14(); - test15(); - test16(); } void CV_RotatedRectangleIntersectionTest::test1() @@ -380,7 +378,7 @@ void CV_RotatedRectangleIntersectionTest::test14() } } -void CV_RotatedRectangleIntersectionTest::test15() +TEST(Imgproc_RotatedRectangleIntersection, regression_12221_1) { RotatedRect r1( Point2f(259.65081787109375, 51.58895492553711), @@ -393,11 +391,11 @@ void CV_RotatedRectangleIntersectionTest::test15() std::vector intersections; int interType = cv::rotatedRectangleIntersection(r1, r2, intersections); - EXPECT_TRUE(interType == INTERSECT_PARTIAL); - EXPECT_TRUE(intersections.size() == 8); + EXPECT_EQ(INTERSECT_PARTIAL, interType); + EXPECT_LE(intersections.size(), (size_t)8); } -void CV_RotatedRectangleIntersectionTest::test16() +TEST(Imgproc_RotatedRectangleIntersection, regression_12221_2) { RotatedRect r1( Point2f(239.78500366210938, 515.72021484375), @@ -410,8 +408,8 @@ void CV_RotatedRectangleIntersectionTest::test16() std::vector intersections; int interType = cv::rotatedRectangleIntersection(r1, r2, intersections); - EXPECT_TRUE(interType == INTERSECT_PARTIAL); - EXPECT_TRUE(intersections.size() == 8); + EXPECT_EQ(INTERSECT_PARTIAL, interType); + EXPECT_LE(intersections.size(), (size_t)8); } TEST (Imgproc_RotatedRectangleIntersection, accuracy) { CV_RotatedRectangleIntersectionTest test; test.safe_run(); } From 98c5ce9347566c25bf6ba9857b8c6513622283cd Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 16 Aug 2018 15:06:29 +0300 Subject: [PATCH 09/17] imgproc(test): refactor test_intersection.cpp don't use legacy test API --- modules/imgproc/test/test_intersection.cpp | 100 ++++++--------------- 1 file changed, 26 insertions(+), 74 deletions(-) diff --git a/modules/imgproc/test/test_intersection.cpp b/modules/imgproc/test/test_intersection.cpp index 0bb9b6ebf9..0e419c4702 100644 --- a/modules/imgproc/test/test_intersection.cpp +++ b/modules/imgproc/test/test_intersection.cpp @@ -49,31 +49,18 @@ namespace opencv_test { namespace { #define ACCURACY 0.00001 -class CV_RotatedRectangleIntersectionTest: public cvtest::ArrayTest -{ -public: +// See pics/intersection.png for the scenarios we are testing -protected: - void run (int); - -private: - void test1(); - void test2(); - void test3(); - void test4(); - void test5(); - void test6(); - void test7(); - void test8(); - void test9(); - void test10(); - void test11(); - void test12(); - void test13(); - void test14(); - void test15(); - void test16(); -}; +// Test the following scenarios: +// 1 - no intersection +// 2 - partial intersection, rectangle translated +// 3 - partial intersection, rectangle rotated 45 degree on the corner, forms a triangle intersection +// 4 - full intersection, rectangles of same size directly on top of each other +// 5 - partial intersection, rectangle on top rotated 45 degrees +// 6 - partial intersection, rectangle on top of different size +// 7 - full intersection, rectangle fully enclosed in the other +// 8 - partial intersection, rectangle corner just touching. point contact +// 9 - partial intersetion. rectangle side by side, line contact static void compare(const std::vector& test, const std::vector& target) { @@ -82,45 +69,12 @@ static void compare(const std::vector& test, const std::vector ASSERT_TRUE(target.size() < 4 || isContourConvex(target)); for( size_t i = 0; i < test.size(); i++ ) { - double dx = test[i].x - target[i].x; - double dy = test[i].y - target[i].y; - double r = sqrt(dx*dx + dy*dy); + double r = sqrt(normL2Sqr(test[i] - target[i])); ASSERT_LT(r, ACCURACY); } } -void CV_RotatedRectangleIntersectionTest::run(int) -{ - // See pics/intersection.png for the scenarios we are testing - - // Test the following scenarios: - // 1 - no intersection - // 2 - partial intersection, rectangle translated - // 3 - partial intersection, rectangle rotated 45 degree on the corner, forms a triangle intersection - // 4 - full intersection, rectangles of same size directly on top of each other - // 5 - partial intersection, rectangle on top rotated 45 degrees - // 6 - partial intersection, rectangle on top of different size - // 7 - full intersection, rectangle fully enclosed in the other - // 8 - partial intersection, rectangle corner just touching. point contact - // 9 - partial intersetion. rectangle side by side, line contact - - test1(); - test2(); - test3(); - test4(); - test5(); - test6(); - test7(); - test8(); - test9(); - test10(); - test11(); - test12(); - test13(); - test14(); -} - -void CV_RotatedRectangleIntersectionTest::test1() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_1) { // no intersection RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 12.0f); @@ -133,7 +87,7 @@ void CV_RotatedRectangleIntersectionTest::test1() CV_Assert(vertices.empty()); } -void CV_RotatedRectangleIntersectionTest::test2() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_2) { // partial intersection, rectangles translated RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 0.0f); @@ -152,7 +106,7 @@ void CV_RotatedRectangleIntersectionTest::test2() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test3() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_3) { // partial intersection, rectangles rotated 45 degree on the corner, forms a triangle intersection RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 0.0f); @@ -170,7 +124,7 @@ void CV_RotatedRectangleIntersectionTest::test3() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test4() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_4) { // full intersection, rectangles of same size directly on top of each other RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 0.0f); @@ -189,7 +143,7 @@ void CV_RotatedRectangleIntersectionTest::test4() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test5() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_5) { // partial intersection, rectangle on top rotated 45 degrees RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 0.0f); @@ -212,7 +166,7 @@ void CV_RotatedRectangleIntersectionTest::test5() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test6() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_6) { // 6 - partial intersection, rectangle on top of different size RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 0.0f); @@ -231,7 +185,7 @@ void CV_RotatedRectangleIntersectionTest::test6() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test7() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_7) { // full intersection, rectangle fully enclosed in the other RotatedRect rect1(Point2f(0, 0), Size2f(12.34f, 56.78f), 0.0f); @@ -250,7 +204,7 @@ void CV_RotatedRectangleIntersectionTest::test7() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test8() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_8) { // intersection by a single vertex RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 0.0f); @@ -263,7 +217,7 @@ void CV_RotatedRectangleIntersectionTest::test8() compare(vertices, vector(1, Point2f(1.0f, 1.0f))); } -void CV_RotatedRectangleIntersectionTest::test9() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_9) { // full intersection, rectangle fully enclosed in the other RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 0.0f); @@ -280,7 +234,7 @@ void CV_RotatedRectangleIntersectionTest::test9() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test10() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_10) { // three points of rect2 are inside rect1. RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 0.0f); @@ -300,7 +254,7 @@ void CV_RotatedRectangleIntersectionTest::test10() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test11() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_11) { RotatedRect rect1(Point2f(0, 0), Size2f(4, 2), 0.0f); RotatedRect rect2(Point2f(0, 0), Size2f(2, 2), -45.0f); @@ -320,7 +274,7 @@ void CV_RotatedRectangleIntersectionTest::test11() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test12() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_12) { RotatedRect rect1(Point2f(0, 0), Size2f(2, 2), 0.0f); RotatedRect rect2(Point2f(0, 1), Size2f(1, 1), 0.0f); @@ -338,7 +292,7 @@ void CV_RotatedRectangleIntersectionTest::test12() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test13() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_13) { RotatedRect rect1(Point2f(0, 0), Size2f(1, 3), 0.0f); RotatedRect rect2(Point2f(0, 1), Size2f(3, 1), 0.0f); @@ -356,7 +310,7 @@ void CV_RotatedRectangleIntersectionTest::test13() compare(vertices, targetVertices); } -void CV_RotatedRectangleIntersectionTest::test14() +TEST(Imgproc_RotatedRectangleIntersection, accuracy_14) { const int kNumTests = 100; const float kWidth = 5; @@ -412,6 +366,4 @@ TEST(Imgproc_RotatedRectangleIntersection, regression_12221_2) EXPECT_LE(intersections.size(), (size_t)8); } -TEST (Imgproc_RotatedRectangleIntersection, accuracy) { CV_RotatedRectangleIntersectionTest test; test.safe_run(); } - }} // namespace From f84eb3dde6acfec91d7c5cb0672ef4e7314d6f4d Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Thu, 16 Aug 2018 17:16:02 +0300 Subject: [PATCH 10/17] Fixed core headers installation in world builds --- modules/core/CMakeLists.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/core/CMakeLists.txt b/modules/core/CMakeLists.txt index 455afaf593..fa72e71658 100644 --- a/modules/core/CMakeLists.txt +++ b/modules/core/CMakeLists.txt @@ -33,9 +33,14 @@ if(CV_TRACE AND HAVE_ITT AND BUILD_ITT) add_definitions(-DOPENCV_WITH_ITT=1) endif() -file(GLOB lib_cuda_hdrs "include/opencv2/${name}/cuda/*.hpp" "include/opencv2/${name}/cuda/*.h") -file(GLOB lib_cuda_hdrs_detail "include/opencv2/${name}/cuda/detail/*.hpp" "include/opencv2/${name}/cuda/detail/*.h") -file(GLOB_RECURSE module_opencl_hdrs "include/opencv2/${name}/opencl/*") +file(GLOB lib_cuda_hdrs + "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/cuda/*.hpp" + "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/cuda/*.h") +file(GLOB lib_cuda_hdrs_detail + "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/cuda/detail/*.hpp" + "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/cuda/detail/*.h") +file(GLOB_RECURSE module_opencl_hdrs + "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/opencl/*") source_group("Include\\Cuda Headers" FILES ${lib_cuda_hdrs}) source_group("Include\\Cuda Headers\\Detail" FILES ${lib_cuda_hdrs_detail}) From b24fc6954d3b1f805b284fccf74a599f426c87cc Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 15 Aug 2018 19:32:58 +0300 Subject: [PATCH 11/17] core(perf): fix addScalar test keep the same type for passed Scalar values --- modules/core/perf/perf_arithm.cpp | 241 ++++++++++++++++++++++-------- 1 file changed, 180 insertions(+), 61 deletions(-) diff --git a/modules/core/perf/perf_arithm.cpp b/modules/core/perf/perf_arithm.cpp index 800b20d182..70e2f49210 100644 --- a/modules/core/perf/perf_arithm.cpp +++ b/modules/core/perf/perf_arithm.cpp @@ -4,11 +4,9 @@ namespace opencv_test { using namespace perf; -#define TYPICAL_MAT_SIZES_CORE_ARITHM szVGA, sz720p, sz1080p -#define TYPICAL_MAT_TYPES_CORE_ARITHM CV_8UC1, CV_8SC1, CV_16SC1, CV_16SC2, CV_16SC3, CV_16SC4, CV_8UC4, CV_32SC1, CV_32FC1 -#define TYPICAL_MATS_CORE_ARITHM testing::Combine( testing::Values( TYPICAL_MAT_SIZES_CORE_ARITHM ), testing::Values( TYPICAL_MAT_TYPES_CORE_ARITHM ) ) +typedef Size_MatType BinaryOpTest; -PERF_TEST_P(Size_MatType, min, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, min) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -20,10 +18,10 @@ PERF_TEST_P(Size_MatType, min, TYPICAL_MATS_CORE_ARITHM) TEST_CYCLE() cv::min(a, b, c); - SANITY_CHECK(c); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, minScalar, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, minScalarDouble) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -35,10 +33,34 @@ PERF_TEST_P(Size_MatType, minScalar, TYPICAL_MATS_CORE_ARITHM) TEST_CYCLE() cv::min(a, b, c); - SANITY_CHECK(c); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, max, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, minScalarSameType) +{ + Size sz = get<0>(GetParam()); + int type = get<1>(GetParam()); + cv::Mat a = Mat(sz, type); + cv::Scalar b; + cv::Mat c = Mat(sz, type); + + declare.in(a, b, WARMUP_RNG).out(c); + + if (CV_MAT_DEPTH(type) < CV_32S) + { + b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing + } + else if (CV_MAT_DEPTH(type) == CV_32S) + { + b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing + } + + TEST_CYCLE() cv::min(a, b, c); + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(BinaryOpTest, max) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -50,10 +72,10 @@ PERF_TEST_P(Size_MatType, max, TYPICAL_MATS_CORE_ARITHM) TEST_CYCLE() cv::max(a, b, c); - SANITY_CHECK(c); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, maxScalar, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, maxScalarDouble) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -65,34 +87,10 @@ PERF_TEST_P(Size_MatType, maxScalar, TYPICAL_MATS_CORE_ARITHM) TEST_CYCLE() cv::max(a, b, c); - SANITY_CHECK(c); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, absdiff, TYPICAL_MATS_CORE_ARITHM) -{ - Size sz = get<0>(GetParam()); - int type = get<1>(GetParam()); - cv::Mat a = Mat(sz, type); - cv::Mat b = Mat(sz, type); - cv::Mat c = Mat(sz, type); - - declare.in(a, b, WARMUP_RNG).out(c); - - double eps = 1e-8; - if (CV_MAT_DEPTH(type) == CV_32S) - { - //see ticket 1529: absdiff can be without saturation on 32S - a /= 2; - b /= 2; - eps = 1; - } - - TEST_CYCLE() cv::absdiff(a, b, c); - - SANITY_CHECK(c, eps); -} - -PERF_TEST_P(Size_MatType, absdiffScalar, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, maxScalarSameType) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -102,21 +100,91 @@ PERF_TEST_P(Size_MatType, absdiffScalar, TYPICAL_MATS_CORE_ARITHM) declare.in(a, b, WARMUP_RNG).out(c); - double eps = 1e-8; + if (CV_MAT_DEPTH(type) < CV_32S) + { + b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing + } + else if (CV_MAT_DEPTH(type) == CV_32S) + { + b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing + } + + TEST_CYCLE() cv::max(a, b, c); + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(BinaryOpTest, absdiff) +{ + Size sz = get<0>(GetParam()); + int type = get<1>(GetParam()); + cv::Mat a = Mat(sz, type); + cv::Mat b = Mat(sz, type); + cv::Mat c = Mat(sz, type); + + declare.in(a, b, WARMUP_RNG).out(c); + if (CV_MAT_DEPTH(type) == CV_32S) { //see ticket 1529: absdiff can be without saturation on 32S a /= 2; b /= 2; - eps = 1; } TEST_CYCLE() cv::absdiff(a, b, c); - SANITY_CHECK(c, eps); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, add, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, absdiffScalarDouble) +{ + Size sz = get<0>(GetParam()); + int type = get<1>(GetParam()); + cv::Mat a = Mat(sz, type); + cv::Scalar b; + cv::Mat c = Mat(sz, type); + + declare.in(a, b, WARMUP_RNG).out(c); + + if (CV_MAT_DEPTH(type) == CV_32S) + { + //see ticket 1529: absdiff can be without saturation on 32S + a /= 2; + b /= 2; + } + + TEST_CYCLE() cv::absdiff(a, b, c); + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(BinaryOpTest, absdiffScalarSameType) +{ + Size sz = get<0>(GetParam()); + int type = get<1>(GetParam()); + cv::Mat a = Mat(sz, type); + cv::Scalar b; + cv::Mat c = Mat(sz, type); + + declare.in(a, b, WARMUP_RNG).out(c); + + if (CV_MAT_DEPTH(type) < CV_32S) + { + b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing + } + else if (CV_MAT_DEPTH(type) == CV_32S) + { + //see ticket 1529: absdiff can be without saturation on 32S + a /= 2; + b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing + } + + TEST_CYCLE() cv::absdiff(a, b, c); + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(BinaryOpTest, add) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -127,21 +195,19 @@ PERF_TEST_P(Size_MatType, add, TYPICAL_MATS_CORE_ARITHM) declare.in(a, b, WARMUP_RNG).out(c); declare.time(50); - double eps = 1e-8; if (CV_MAT_DEPTH(type) == CV_32S) { //see ticket 1529: add can be without saturation on 32S a /= 2; b /= 2; - eps = 1; } TEST_CYCLE() cv::add(a, b, c); - SANITY_CHECK(c, eps); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, addScalar, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, addScalarDouble) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -151,21 +217,45 @@ PERF_TEST_P(Size_MatType, addScalar, TYPICAL_MATS_CORE_ARITHM) declare.in(a, b, WARMUP_RNG).out(c); - double eps = 1e-8; if (CV_MAT_DEPTH(type) == CV_32S) { //see ticket 1529: add can be without saturation on 32S a /= 2; b /= 2; - eps = 1; } TEST_CYCLE() cv::add(a, b, c); - SANITY_CHECK(c, eps); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, subtract, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, addScalarSameType) +{ + Size sz = get<0>(GetParam()); + int type = get<1>(GetParam()); + cv::Mat a = Mat(sz, type); + cv::Scalar b; + cv::Mat c = Mat(sz, type); + + declare.in(a, b, WARMUP_RNG).out(c); + + if (CV_MAT_DEPTH(type) < CV_32S) + { + b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing + } + else if (CV_MAT_DEPTH(type) == CV_32S) + { + //see ticket 1529: add can be without saturation on 32S + a /= 2; + b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing + } + + TEST_CYCLE() cv::add(a, b, c, noArray(), type); + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(BinaryOpTest, subtract) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -175,21 +265,19 @@ PERF_TEST_P(Size_MatType, subtract, TYPICAL_MATS_CORE_ARITHM) declare.in(a, b, WARMUP_RNG).out(c); - double eps = 1e-8; if (CV_MAT_DEPTH(type) == CV_32S) { //see ticket 1529: subtract can be without saturation on 32S a /= 2; b /= 2; - eps = 1; } TEST_CYCLE() cv::subtract(a, b, c); - SANITY_CHECK(c, eps); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, subtractScalar, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, subtractScalarDouble) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -199,21 +287,45 @@ PERF_TEST_P(Size_MatType, subtractScalar, TYPICAL_MATS_CORE_ARITHM) declare.in(a, b, WARMUP_RNG).out(c); - double eps = 1e-8; if (CV_MAT_DEPTH(type) == CV_32S) { //see ticket 1529: subtract can be without saturation on 32S a /= 2; b /= 2; - eps = 1; } TEST_CYCLE() cv::subtract(a, b, c); - SANITY_CHECK(c, eps); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, multiply, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, subtractScalarSameType) +{ + Size sz = get<0>(GetParam()); + int type = get<1>(GetParam()); + cv::Mat a = Mat(sz, type); + cv::Scalar b; + cv::Mat c = Mat(sz, type); + + declare.in(a, b, WARMUP_RNG).out(c); + + if (CV_MAT_DEPTH(type) < CV_32S) + { + b = Scalar(1, 0, 3, 4); // don't pass non-integer values for 8U/8S/16U/16S processing + } + else if (CV_MAT_DEPTH(type) == CV_32S) + { + //see ticket 1529: subtract can be without saturation on 32S + a /= 2; + b = Scalar(1, 0, -3, 4); // don't pass non-integer values for 32S processing + } + + TEST_CYCLE() cv::subtract(a, b, c, noArray(), type); + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(BinaryOpTest, multiply) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -229,10 +341,10 @@ PERF_TEST_P(Size_MatType, multiply, TYPICAL_MATS_CORE_ARITHM) TEST_CYCLE() cv::multiply(a, b, c); - SANITY_CHECK(c, 1e-8); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, multiplyScale, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, multiplyScale) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -250,10 +362,10 @@ PERF_TEST_P(Size_MatType, multiplyScale, TYPICAL_MATS_CORE_ARITHM) TEST_CYCLE() cv::multiply(a, b, c, scale); - SANITY_CHECK(c, 1e-8); + SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, divide, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, divide) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -267,7 +379,7 @@ PERF_TEST_P(Size_MatType, divide, TYPICAL_MATS_CORE_ARITHM) SANITY_CHECK_NOTHING(); } -PERF_TEST_P(Size_MatType, reciprocal, TYPICAL_MATS_CORE_ARITHM) +PERF_TEST_P_(BinaryOpTest, reciprocal) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -281,4 +393,11 @@ PERF_TEST_P(Size_MatType, reciprocal, TYPICAL_MATS_CORE_ARITHM) SANITY_CHECK_NOTHING(); } +INSTANTIATE_TEST_CASE_P(/*nothing*/ , BinaryOpTest, + testing::Combine( + testing::Values(szVGA, sz720p, sz1080p), + testing::Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_8SC1, CV_16SC1, CV_16SC2, CV_16SC3, CV_16SC4, CV_32SC1, CV_32FC1) + ) +); + } // namespace From c61bc3a0cbdc76598d04da6c8a412e7df1985f55 Mon Sep 17 00:00:00 2001 From: Suleyman TURKMEN Date: Thu, 2 Aug 2018 21:22:58 +0300 Subject: [PATCH 12/17] Update documentation and samples --- .../basic_linear_transform.markdown | 3 + .../discrete_fourier_transform.markdown | 2 +- .../file_input_output_with_xml_yml.markdown | 3 + .../how_to_scan_images.markdown | 3 + .../how_to_use_OpenCV_parallel_for_.markdown | 2 + .../how_to_use_ippa_conversion.markdown | 3 + .../interoperability_with_OpenCV_1.markdown | 3 + doc/tutorials/core/mat_operations.markdown | 3 + .../mat_the_basic_image_container.markdown | 2 + .../core/table_of_content_core.markdown | 18 --- .../basic_geometric_drawing.markdown | 61 +++++----- .../images/Drawing_1_Tutorial_Result_0.png | Bin .../erosion_dilatation.markdown | 3 + ...sian_median_blur_bilateral_filter.markdown | 1 + .../back_projection/back_projection.markdown | 3 + .../histogram_calculation.markdown | 3 + .../histogram_comparison.markdown | 3 + .../histogram_equalization.markdown | 3 + .../canny_detector/canny_detector.markdown | 3 + .../distance_transform.markdown | 3 + .../imgproc/imgtrans/remap/remap.markdown | 3 + .../imgtrans/warp_affine/warp_affine.markdown | 3 + .../opening_closing_hats.markdown | 3 + .../out_of_focus_deblur_filter.markdown | 2 + .../images/Drawing_2_Tutorial_Result_0.jpg | Bin .../images/Drawing_2_Tutorial_Result_2.jpg | Bin .../images/Drawing_2_Tutorial_Result_3.jpg | Bin .../images/Drawing_2_Tutorial_Result_5.jpg | Bin .../images/Drawing_2_Tutorial_Result_big.jpg | Bin .../random_generator_and_text.markdown | 3 + .../bounding_rects_circles.markdown | 3 + .../bounding_rotated_ellipses.markdown | 3 + .../find_contours/find_contours.markdown | 3 + .../shapedescriptors/hull/hull.markdown | 3 + .../shapedescriptors/moments/moments.markdown | 3 + .../point_polygon_test.markdown | 3 + .../imgproc/table_of_content_imgproc.markdown | 18 +++ .../imgproc/threshold/threshold.markdown | 3 + .../threshold_inRange.markdown | 3 + .../stitching/stitcher/stitcher.markdown | 12 +- modules/calib3d/include/opencv2/calib3d.hpp | 24 ++-- modules/core/include/opencv2/core.hpp | 111 ++++++++--------- modules/core/include/opencv2/core/mat.hpp | 2 +- .../core/include/opencv2/core/persistence.hpp | 4 +- modules/dnn/include/opencv2/dnn.hpp | 14 +++ modules/highgui/include/opencv2/highgui.hpp | 7 +- modules/imgproc/include/opencv2/imgproc.hpp | 115 +++++++++++------- .../objdetect/include/opencv2/objdetect.hpp | 8 +- modules/photo/include/opencv2/photo.hpp | 4 +- .../include/opencv2/shape/shape_distance.hpp | 2 +- .../stitching/include/opencv2/stitching.hpp | 8 ++ .../video/include/opencv2/video/tracking.hpp | 15 ++- modules/videoio/include/opencv2/videoio.hpp | 11 +- samples/cpp/connected_components.cpp | 38 ++---- samples/cpp/squares.cpp | 27 ++-- samples/cpp/stitching.cpp | 20 +-- samples/cpp/stitching_detailed.cpp | 42 ------- .../tutorial_code/ImgProc/Morphology_2.cpp | 2 +- .../basic_drawing}/Drawing_1.cpp | 0 .../basic_drawing}/Drawing_2.cpp | 0 .../BasicGeometricDrawing.java | 0 .../basic_geometric_drawing.py | 0 samples/tapi/squares.cpp | 21 ++-- 63 files changed, 365 insertions(+), 303 deletions(-) rename doc/tutorials/{core => imgproc}/basic_geometric_drawing/basic_geometric_drawing.markdown (70%) rename doc/tutorials/{core => imgproc}/basic_geometric_drawing/images/Drawing_1_Tutorial_Result_0.png (100%) rename doc/tutorials/{core => imgproc}/random_generator_and_text/images/Drawing_2_Tutorial_Result_0.jpg (100%) rename doc/tutorials/{core => imgproc}/random_generator_and_text/images/Drawing_2_Tutorial_Result_2.jpg (100%) rename doc/tutorials/{core => imgproc}/random_generator_and_text/images/Drawing_2_Tutorial_Result_3.jpg (100%) rename doc/tutorials/{core => imgproc}/random_generator_and_text/images/Drawing_2_Tutorial_Result_5.jpg (100%) rename doc/tutorials/{core => imgproc}/random_generator_and_text/images/Drawing_2_Tutorial_Result_big.jpg (100%) rename doc/tutorials/{core => imgproc}/random_generator_and_text/random_generator_and_text.markdown (98%) rename samples/cpp/tutorial_code/{core/Matrix => ImgProc/basic_drawing}/Drawing_1.cpp (100%) rename samples/cpp/tutorial_code/{core/Matrix => ImgProc/basic_drawing}/Drawing_2.cpp (100%) rename samples/java/tutorial_code/{core => ImgProc}/BasicGeometricDrawing/BasicGeometricDrawing.java (100%) rename samples/python/tutorial_code/{core => imgProc}/BasicGeometricDrawing/basic_geometric_drawing.py (100%) diff --git a/doc/tutorials/core/basic_linear_transform/basic_linear_transform.markdown b/doc/tutorials/core/basic_linear_transform/basic_linear_transform.markdown index d823b45548..803de71acb 100644 --- a/doc/tutorials/core/basic_linear_transform/basic_linear_transform.markdown +++ b/doc/tutorials/core/basic_linear_transform/basic_linear_transform.markdown @@ -1,6 +1,9 @@ Changing the contrast and brightness of an image! {#tutorial_basic_linear_transform} ================================================= +@prev_tutorial{tutorial_adding_images} +@next_tutorial{tutorial_discrete_fourier_transform} + Goal ---- diff --git a/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.markdown b/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.markdown index 7facd74ca9..ca485a9293 100644 --- a/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.markdown +++ b/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.markdown @@ -1,7 +1,7 @@ Discrete Fourier Transform {#tutorial_discrete_fourier_transform} ========================== -@prev_tutorial{tutorial_random_generator_and_text} +@prev_tutorial{tutorial_basic_linear_transform} @next_tutorial{tutorial_file_input_output_with_xml_yml} Goal diff --git a/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.markdown b/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.markdown index 5e46343373..7b91af75a3 100644 --- a/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.markdown +++ b/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.markdown @@ -1,6 +1,9 @@ File Input and Output using XML and YAML files {#tutorial_file_input_output_with_xml_yml} ============================================== +@prev_tutorial{tutorial_discrete_fourier_transform} +@next_tutorial{tutorial_interoperability_with_OpenCV_1} + Goal ---- diff --git a/doc/tutorials/core/how_to_scan_images/how_to_scan_images.markdown b/doc/tutorials/core/how_to_scan_images/how_to_scan_images.markdown index 658147eccf..a4b7af6375 100644 --- a/doc/tutorials/core/how_to_scan_images/how_to_scan_images.markdown +++ b/doc/tutorials/core/how_to_scan_images/how_to_scan_images.markdown @@ -1,6 +1,9 @@ How to scan images, lookup tables and time measurement with OpenCV {#tutorial_how_to_scan_images} ================================================================== +@prev_tutorial{tutorial_mat_the_basic_image_container} +@next_tutorial{tutorial_mat_mask_operations} + Goal ---- diff --git a/doc/tutorials/core/how_to_use_OpenCV_parallel_for_/how_to_use_OpenCV_parallel_for_.markdown b/doc/tutorials/core/how_to_use_OpenCV_parallel_for_/how_to_use_OpenCV_parallel_for_.markdown index c584a97c8a..3f5f556d35 100644 --- a/doc/tutorials/core/how_to_use_OpenCV_parallel_for_/how_to_use_OpenCV_parallel_for_.markdown +++ b/doc/tutorials/core/how_to_use_OpenCV_parallel_for_/how_to_use_OpenCV_parallel_for_.markdown @@ -1,6 +1,8 @@ How to use the OpenCV parallel_for_ to parallelize your code {#tutorial_how_to_use_OpenCV_parallel_for_} ================================================================== +@prev_tutorial{tutorial_how_to_use_ippa_conversion} + Goal ---- diff --git a/doc/tutorials/core/how_to_use_ippa_conversion/how_to_use_ippa_conversion.markdown b/doc/tutorials/core/how_to_use_ippa_conversion/how_to_use_ippa_conversion.markdown index 647b280cc7..e5e0e4a1eb 100644 --- a/doc/tutorials/core/how_to_use_ippa_conversion/how_to_use_ippa_conversion.markdown +++ b/doc/tutorials/core/how_to_use_ippa_conversion/how_to_use_ippa_conversion.markdown @@ -1,6 +1,9 @@ Intel® IPP Asynchronous C/C++ library in OpenCV {#tutorial_how_to_use_ippa_conversion} =============================================== +@prev_tutorial{tutorial_interoperability_with_OpenCV_1} +@next_tutorial{tutorial_how_to_use_OpenCV_parallel_for_} + Goal ---- diff --git a/doc/tutorials/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.markdown b/doc/tutorials/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.markdown index f98c93fbc5..0e2b45cea5 100644 --- a/doc/tutorials/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.markdown +++ b/doc/tutorials/core/interoperability_with_OpenCV_1/interoperability_with_OpenCV_1.markdown @@ -1,6 +1,9 @@ Interoperability with OpenCV 1 {#tutorial_interoperability_with_OpenCV_1} ============================== +@prev_tutorial{tutorial_file_input_output_with_xml_yml} +@next_tutorial{tutorial_how_to_use_ippa_conversion} + Goal ---- diff --git a/doc/tutorials/core/mat_operations.markdown b/doc/tutorials/core/mat_operations.markdown index c2e7d1ca6a..02c3ad44c5 100644 --- a/doc/tutorials/core/mat_operations.markdown +++ b/doc/tutorials/core/mat_operations.markdown @@ -1,6 +1,9 @@ Operations with images {#tutorial_mat_operations} ====================== +@prev_tutorial{tutorial_mat_mask_operations} +@next_tutorial{tutorial_adding_images} + Input/Output ------------ diff --git a/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.markdown b/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.markdown index a7c2337008..882b7a4a0b 100644 --- a/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.markdown +++ b/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.markdown @@ -1,6 +1,8 @@ Mat - The Basic Image Container {#tutorial_mat_the_basic_image_container} =============================== +@next_tutorial{tutorial_how_to_scan_images} + Goal ---- diff --git a/doc/tutorials/core/table_of_content_core.markdown b/doc/tutorials/core/table_of_content_core.markdown index 8db254944a..f3f5381ea9 100644 --- a/doc/tutorials/core/table_of_content_core.markdown +++ b/doc/tutorials/core/table_of_content_core.markdown @@ -62,24 +62,6 @@ understanding how to manipulate the images on a pixel level. We will learn how to change our image appearance! -- @subpage tutorial_basic_geometric_drawing - - *Languages:* C++, Java, Python - - *Compatibility:* \> OpenCV 2.0 - - *Author:* Ana Huamán - - We will learn how to draw simple geometry with OpenCV! - -- @subpage tutorial_random_generator_and_text - - *Compatibility:* \> OpenCV 2.0 - - *Author:* Ana Huamán - - We will draw some *fancy-looking* stuff using OpenCV! - - @subpage tutorial_discrete_fourier_transform *Languages:* C++, Java, Python diff --git a/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.markdown b/doc/tutorials/imgproc/basic_geometric_drawing/basic_geometric_drawing.markdown similarity index 70% rename from doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.markdown rename to doc/tutorials/imgproc/basic_geometric_drawing/basic_geometric_drawing.markdown index 02ec53cb3f..70543cf14f 100644 --- a/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.markdown +++ b/doc/tutorials/imgproc/basic_geometric_drawing/basic_geometric_drawing.markdown @@ -1,7 +1,6 @@ Basic Drawing {#tutorial_basic_geometric_drawing} ============= -@prev_tutorial{tutorial_basic_linear_transform} @next_tutorial{tutorial_random_generator_and_text} Goals @@ -82,20 +81,20 @@ Code @add_toggle_cpp - This code is in your OpenCV sample folder. Otherwise you can grab it from - [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp) - @include samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp + [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp) + @include samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp @end_toggle @add_toggle_java - This code is in your OpenCV sample folder. Otherwise you can grab it from - [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java) - @include samples/java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java + [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java) + @include samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java @end_toggle @add_toggle_python - This code is in your OpenCV sample folder. Otherwise you can grab it from - [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py) - @include samples/python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py + [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py) + @include samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py @end_toggle Explanation @@ -104,42 +103,42 @@ Explanation Since we plan to draw two examples (an atom and a rook), we have to create two images and two windows to display them. @add_toggle_cpp -@snippet cpp/tutorial_code/core/Matrix/Drawing_1.cpp create_images +@snippet cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp create_images @end_toggle @add_toggle_java -@snippet java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java create_images +@snippet java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java create_images @end_toggle @add_toggle_python -@snippet python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py create_images +@snippet python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py create_images @end_toggle We created functions to draw different geometric shapes. For instance, to draw the atom we used **MyEllipse** and **MyFilledCircle**: @add_toggle_cpp -@snippet cpp/tutorial_code/core/Matrix/Drawing_1.cpp draw_atom +@snippet cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp draw_atom @end_toggle @add_toggle_java -@snippet java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java draw_atom +@snippet java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java draw_atom @end_toggle @add_toggle_python -@snippet python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py draw_atom +@snippet python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py draw_atom @end_toggle And to draw the rook we employed **MyLine**, **rectangle** and a **MyPolygon**: @add_toggle_cpp -@snippet cpp/tutorial_code/core/Matrix/Drawing_1.cpp draw_rook +@snippet cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp draw_rook @end_toggle @add_toggle_java -@snippet java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java draw_rook +@snippet java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java draw_rook @end_toggle @add_toggle_python -@snippet python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py draw_rook +@snippet python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py draw_rook @end_toggle @@ -149,15 +148,15 @@ Let's check what is inside each of these functions:

MyLine

@add_toggle_cpp -@snippet cpp/tutorial_code/core/Matrix/Drawing_1.cpp my_line +@snippet cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp my_line @end_toggle @add_toggle_java -@snippet java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java my_line +@snippet java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java my_line @end_toggle @add_toggle_python -@snippet python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py my_line +@snippet python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py my_line @end_toggle - As we can see, **MyLine** just call the function **line()** , which does the following: @@ -170,15 +169,15 @@ Let's check what is inside each of these functions:

MyEllipse

@add_toggle_cpp -@snippet cpp/tutorial_code/core/Matrix/Drawing_1.cpp my_ellipse +@snippet cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp my_ellipse @end_toggle @add_toggle_java -@snippet java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java my_ellipse +@snippet java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java my_ellipse @end_toggle @add_toggle_python -@snippet python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py my_ellipse +@snippet python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py my_ellipse @end_toggle - From the code above, we can observe that the function **ellipse()** draws an ellipse such @@ -194,15 +193,15 @@ Let's check what is inside each of these functions:

MyFilledCircle

@add_toggle_cpp -@snippet cpp/tutorial_code/core/Matrix/Drawing_1.cpp my_filled_circle +@snippet cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp my_filled_circle @end_toggle @add_toggle_java -@snippet java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java my_filled_circle +@snippet java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java my_filled_circle @end_toggle @add_toggle_python -@snippet python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py my_filled_circle +@snippet python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py my_filled_circle @end_toggle - Similar to the ellipse function, we can observe that *circle* receives as arguments: @@ -215,15 +214,15 @@ Let's check what is inside each of these functions:

MyPolygon

@add_toggle_cpp -@snippet cpp/tutorial_code/core/Matrix/Drawing_1.cpp my_polygon +@snippet cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp my_polygon @end_toggle @add_toggle_java -@snippet java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java my_polygon +@snippet java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java my_polygon @end_toggle @add_toggle_python -@snippet python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py my_polygon +@snippet python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py my_polygon @end_toggle - To draw a filled polygon we use the function **fillPoly()** . We note that: @@ -235,15 +234,15 @@ Let's check what is inside each of these functions:

rectangle

@add_toggle_cpp -@snippet cpp/tutorial_code/core/Matrix/Drawing_1.cpp rectangle +@snippet cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp rectangle @end_toggle @add_toggle_java -@snippet java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java rectangle +@snippet java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java rectangle @end_toggle @add_toggle_python -@snippet python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py rectangle +@snippet python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py rectangle @end_toggle - Finally we have the @ref cv::rectangle function (we did not create a special function for diff --git a/doc/tutorials/core/basic_geometric_drawing/images/Drawing_1_Tutorial_Result_0.png b/doc/tutorials/imgproc/basic_geometric_drawing/images/Drawing_1_Tutorial_Result_0.png similarity index 100% rename from doc/tutorials/core/basic_geometric_drawing/images/Drawing_1_Tutorial_Result_0.png rename to doc/tutorials/imgproc/basic_geometric_drawing/images/Drawing_1_Tutorial_Result_0.png diff --git a/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.markdown b/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.markdown index feca4e9aa6..ddb7d9e8f5 100644 --- a/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.markdown +++ b/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.markdown @@ -1,6 +1,9 @@ Eroding and Dilating {#tutorial_erosion_dilatation} ==================== +@prev_tutorial{tutorial_gausian_median_blur_bilateral_filter} +@next_tutorial{tutorial_opening_closing_hats} + Goal ---- diff --git a/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown b/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown index 332d894062..92dd1d5ed7 100644 --- a/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown +++ b/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.markdown @@ -1,6 +1,7 @@ Smoothing Images {#tutorial_gausian_median_blur_bilateral_filter} ================ +@prev_tutorial{tutorial_random_generator_and_text} @next_tutorial{tutorial_erosion_dilatation} Goal diff --git a/doc/tutorials/imgproc/histograms/back_projection/back_projection.markdown b/doc/tutorials/imgproc/histograms/back_projection/back_projection.markdown index a2a894a459..cae547bd95 100644 --- a/doc/tutorials/imgproc/histograms/back_projection/back_projection.markdown +++ b/doc/tutorials/imgproc/histograms/back_projection/back_projection.markdown @@ -1,6 +1,9 @@ Back Projection {#tutorial_back_projection} =============== +@prev_tutorial{tutorial_histogram_comparison} +@next_tutorial{tutorial_template_matching} + Goal ---- diff --git a/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.markdown b/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.markdown index 8410b9267b..471887c59a 100644 --- a/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.markdown +++ b/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.markdown @@ -1,6 +1,9 @@ Histogram Calculation {#tutorial_histogram_calculation} ===================== +@prev_tutorial{tutorial_histogram_equalization} +@next_tutorial{tutorial_histogram_comparison} + Goal ---- diff --git a/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.markdown b/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.markdown index 8577067372..d243511be8 100644 --- a/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.markdown +++ b/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.markdown @@ -1,6 +1,9 @@ Histogram Comparison {#tutorial_histogram_comparison} ==================== +@prev_tutorial{tutorial_histogram_calculation} +@next_tutorial{tutorial_back_projection} + Goal ---- diff --git a/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.markdown b/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.markdown index f5edd73ac7..2add8bade4 100644 --- a/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.markdown +++ b/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.markdown @@ -1,6 +1,9 @@ Histogram Equalization {#tutorial_histogram_equalization} ====================== +@prev_tutorial{tutorial_warp_affine} +@next_tutorial{tutorial_histogram_calculation} + Goal ---- diff --git a/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.markdown b/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.markdown index cebf43ce7b..5ef2b7e629 100644 --- a/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.markdown +++ b/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.markdown @@ -1,6 +1,9 @@ Canny Edge Detector {#tutorial_canny_detector} =================== +@prev_tutorial{tutorial_laplace_operator} +@next_tutorial{tutorial_hough_lines} + Goal ---- diff --git a/doc/tutorials/imgproc/imgtrans/distance_transformation/distance_transform.markdown b/doc/tutorials/imgproc/imgtrans/distance_transformation/distance_transform.markdown index ca1ec47258..18995b1e2d 100644 --- a/doc/tutorials/imgproc/imgtrans/distance_transformation/distance_transform.markdown +++ b/doc/tutorials/imgproc/imgtrans/distance_transformation/distance_transform.markdown @@ -1,6 +1,9 @@ Image Segmentation with Distance Transform and Watershed Algorithm {#tutorial_distance_transform} ============= +@prev_tutorial{tutorial_point_polygon_test} +@next_tutorial{tutorial_out_of_focus_deblur_filter} + Goal ---- diff --git a/doc/tutorials/imgproc/imgtrans/remap/remap.markdown b/doc/tutorials/imgproc/imgtrans/remap/remap.markdown index 53cba14516..ac2b879171 100644 --- a/doc/tutorials/imgproc/imgtrans/remap/remap.markdown +++ b/doc/tutorials/imgproc/imgtrans/remap/remap.markdown @@ -1,6 +1,9 @@ Remapping {#tutorial_remap} ========= +@prev_tutorial{tutorial_hough_circle} +@next_tutorial{tutorial_warp_affine} + Goal ---- diff --git a/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.markdown b/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.markdown index 3f25509dba..dab4e953fb 100644 --- a/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.markdown +++ b/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.markdown @@ -1,6 +1,9 @@ Affine Transformations {#tutorial_warp_affine} ====================== +@prev_tutorial{tutorial_remap} +@next_tutorial{tutorial_histogram_equalization} + Goal ---- diff --git a/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.markdown b/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.markdown index 328b8aa3a9..ab1ba87e1f 100644 --- a/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.markdown +++ b/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.markdown @@ -1,6 +1,9 @@ More Morphology Transformations {#tutorial_opening_closing_hats} =============================== +@prev_tutorial{tutorial_erosion_dilatation} +@next_tutorial{tutorial_hitOrMiss} + Goal ---- diff --git a/doc/tutorials/imgproc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.markdown b/doc/tutorials/imgproc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.markdown index abab071208..993442168d 100755 --- a/doc/tutorials/imgproc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.markdown +++ b/doc/tutorials/imgproc/out_of_focus_deblur_filter/out_of_focus_deblur_filter.markdown @@ -1,6 +1,8 @@ Out-of-focus Deblur Filter {#tutorial_out_of_focus_deblur_filter} ========================== +@prev_tutorial{tutorial_distance_transform} + Goal ---- diff --git a/doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_0.jpg b/doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_0.jpg similarity index 100% rename from doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_0.jpg rename to doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_0.jpg diff --git a/doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_2.jpg b/doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_2.jpg similarity index 100% rename from doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_2.jpg rename to doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_2.jpg diff --git a/doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_3.jpg b/doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_3.jpg similarity index 100% rename from doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_3.jpg rename to doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_3.jpg diff --git a/doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_5.jpg b/doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_5.jpg similarity index 100% rename from doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_5.jpg rename to doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_5.jpg diff --git a/doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_big.jpg b/doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_big.jpg similarity index 100% rename from doc/tutorials/core/random_generator_and_text/images/Drawing_2_Tutorial_Result_big.jpg rename to doc/tutorials/imgproc/random_generator_and_text/images/Drawing_2_Tutorial_Result_big.jpg diff --git a/doc/tutorials/core/random_generator_and_text/random_generator_and_text.markdown b/doc/tutorials/imgproc/random_generator_and_text/random_generator_and_text.markdown similarity index 98% rename from doc/tutorials/core/random_generator_and_text/random_generator_and_text.markdown rename to doc/tutorials/imgproc/random_generator_and_text/random_generator_and_text.markdown index b9d39756b0..d2f10214ea 100644 --- a/doc/tutorials/core/random_generator_and_text/random_generator_and_text.markdown +++ b/doc/tutorials/imgproc/random_generator_and_text/random_generator_and_text.markdown @@ -1,6 +1,9 @@ Random generator and text with OpenCV {#tutorial_random_generator_and_text} ===================================== +@prev_tutorial{tutorial_basic_geometric_drawing} +@next_tutorial{tutorial_gausian_median_blur_bilateral_filter} + Goals ----- diff --git a/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.markdown b/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.markdown index 99cc2c146e..48db64464b 100644 --- a/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.markdown +++ b/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.markdown @@ -1,6 +1,9 @@ Creating Bounding boxes and circles for contours {#tutorial_bounding_rects_circles} ================================================ +@prev_tutorial{tutorial_hull} +@next_tutorial{tutorial_bounding_rotated_ellipses} + Goal ---- diff --git a/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.markdown b/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.markdown index a482936d79..bf53f14a9b 100644 --- a/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.markdown +++ b/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.markdown @@ -1,6 +1,9 @@ Creating Bounding rotated boxes and ellipses for contours {#tutorial_bounding_rotated_ellipses} ========================================================= +@prev_tutorial{tutorial_bounding_rects_circles} +@next_tutorial{tutorial_moments} + Goal ---- diff --git a/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.markdown b/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.markdown index c1171bb2aa..340143a794 100644 --- a/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.markdown +++ b/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.markdown @@ -1,6 +1,9 @@ Finding contours in your image {#tutorial_find_contours} ============================== +@prev_tutorial{tutorial_template_matching} +@next_tutorial{tutorial_hull} + Goal ---- diff --git a/doc/tutorials/imgproc/shapedescriptors/hull/hull.markdown b/doc/tutorials/imgproc/shapedescriptors/hull/hull.markdown index 7d7fae1b7c..e1eda3565b 100644 --- a/doc/tutorials/imgproc/shapedescriptors/hull/hull.markdown +++ b/doc/tutorials/imgproc/shapedescriptors/hull/hull.markdown @@ -1,6 +1,9 @@ Convex Hull {#tutorial_hull} =========== +@prev_tutorial{tutorial_find_contours} +@next_tutorial{tutorial_bounding_rects_circles} + Goal ---- diff --git a/doc/tutorials/imgproc/shapedescriptors/moments/moments.markdown b/doc/tutorials/imgproc/shapedescriptors/moments/moments.markdown index de9e79ca86..2e3daba685 100644 --- a/doc/tutorials/imgproc/shapedescriptors/moments/moments.markdown +++ b/doc/tutorials/imgproc/shapedescriptors/moments/moments.markdown @@ -1,6 +1,9 @@ Image Moments {#tutorial_moments} ============= +@prev_tutorial{tutorial_bounding_rotated_ellipses} +@next_tutorial{tutorial_point_polygon_test} + Goal ---- diff --git a/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.markdown b/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.markdown index 4a42eea836..0ac2ab768a 100644 --- a/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.markdown +++ b/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.markdown @@ -1,6 +1,9 @@ Point Polygon Test {#tutorial_point_polygon_test} ================== +@prev_tutorial{tutorial_moments} +@next_tutorial{tutorial_distance_transform} + Goal ---- diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index 3d82c0cf53..e90df59bce 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -3,6 +3,24 @@ Image Processing (imgproc module) {#tutorial_table_of_content_imgproc} In this section you will learn about the image processing (manipulation) functions inside OpenCV. +- @subpage tutorial_basic_geometric_drawing + + *Languages:* C++, Java, Python + + *Compatibility:* \> OpenCV 2.0 + + *Author:* Ana Huamán + + We will learn how to draw simple geometry with OpenCV! + +- @subpage tutorial_random_generator_and_text + + *Compatibility:* \> OpenCV 2.0 + + *Author:* Ana Huamán + + We will draw some *fancy-looking* stuff using OpenCV! + - @subpage tutorial_gausian_median_blur_bilateral_filter *Languages:* C++, Java, Python diff --git a/doc/tutorials/imgproc/threshold/threshold.markdown b/doc/tutorials/imgproc/threshold/threshold.markdown index b4ee7b4623..b5a25e3aee 100644 --- a/doc/tutorials/imgproc/threshold/threshold.markdown +++ b/doc/tutorials/imgproc/threshold/threshold.markdown @@ -1,6 +1,9 @@ Basic Thresholding Operations {#tutorial_threshold} ============================= +@prev_tutorial{tutorial_pyramids} +@next_tutorial{tutorial_threshold_inRange} + Goal ---- diff --git a/doc/tutorials/imgproc/threshold_inRange/threshold_inRange.markdown b/doc/tutorials/imgproc/threshold_inRange/threshold_inRange.markdown index a0c70f0e0a..3b63b07231 100644 --- a/doc/tutorials/imgproc/threshold_inRange/threshold_inRange.markdown +++ b/doc/tutorials/imgproc/threshold_inRange/threshold_inRange.markdown @@ -1,6 +1,9 @@ Thresholding Operations using inRange {#tutorial_threshold_inRange} ===================================== +@prev_tutorial{tutorial_threshold} +@next_tutorial{tutorial_filter_2d} + Goal ---- diff --git a/doc/tutorials/stitching/stitcher/stitcher.markdown b/doc/tutorials/stitching/stitcher/stitcher.markdown index d34cac7048..f0e7731e51 100644 --- a/doc/tutorials/stitching/stitcher/stitcher.markdown +++ b/doc/tutorials/stitching/stitcher/stitcher.markdown @@ -24,17 +24,7 @@ Explanation The most important code part is: -@code{.cpp} -Mat pano; -Ptr stitcher = Stitcher::create(mode, try_use_gpu); -Stitcher::Status status = stitcher->stitch(imgs, pano); - -if (status != Stitcher::OK) -{ - cout << "Can't stitch images, error code = " << int(status) << endl; - return -1; -} -@endcode +@snippet cpp/stitching.cpp stitching A new instance of stitcher is created and the @ref cv::Stitcher::stitch will do all the hard work. diff --git a/modules/calib3d/include/opencv2/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d.hpp index fcd295da6f..61191fedc0 100644 --- a/modules/calib3d/include/opencv2/calib3d.hpp +++ b/modules/calib3d/include/opencv2/calib3d.hpp @@ -307,11 +307,11 @@ optimization procedures like calibrateCamera, stereoCalibrate, or solvePnP . */ CV_EXPORTS_W void Rodrigues( InputArray src, OutputArray dst, OutputArray jacobian = noArray() ); -/** @example pose_from_homography.cpp - An example program about pose estimation from coplanar points +/** @example samples/cpp/tutorial_code/features2D/Homography/pose_from_homography.cpp +An example program about pose estimation from coplanar points - Check @ref tutorial_homography "the corresponding tutorial" for more details - */ +Check @ref tutorial_homography "the corresponding tutorial" for more details +*/ /** @brief Finds a perspective transformation between two planes. @@ -526,11 +526,11 @@ CV_EXPORTS_W void projectPoints( InputArray objectPoints, OutputArray jacobian = noArray(), double aspectRatio = 0 ); -/** @example homography_from_camera_displacement.cpp - An example program about homography from the camera displacement +/** @example samples/cpp/tutorial_code/features2D/Homography/homography_from_camera_displacement.cpp +An example program about homography from the camera displacement - Check @ref tutorial_homography "the corresponding tutorial" for more details - */ +Check @ref tutorial_homography "the corresponding tutorial" for more details +*/ /** @brief Finds an object pose from 3D-2D point correspondences. @@ -1966,11 +1966,11 @@ CV_EXPORTS_W cv::Mat estimateAffinePartial2D(InputArray from, InputArray to, Out size_t maxIters = 2000, double confidence = 0.99, size_t refineIters = 10); -/** @example decompose_homography.cpp - An example program with homography decomposition. +/** @example samples/cpp/tutorial_code/features2D/Homography/decompose_homography.cpp +An example program with homography decomposition. - Check @ref tutorial_homography "the corresponding tutorial" for more details. - */ +Check @ref tutorial_homography "the corresponding tutorial" for more details. +*/ /** @brief Decompose a homography matrix to rotation(s), translation(s) and plane normal(s). diff --git a/modules/core/include/opencv2/core.hpp b/modules/core/include/opencv2/core.hpp index 21be7d7afd..4d8f3b56d2 100644 --- a/modules/core/include/opencv2/core.hpp +++ b/modules/core/include/opencv2/core.hpp @@ -273,9 +273,11 @@ of p and len. */ CV_EXPORTS_W int borderInterpolate(int p, int len, int borderType); -/** @example copyMakeBorder_demo.cpp -An example using copyMakeBorder function - */ +/** @example samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp +An example using copyMakeBorder function. +Check @ref tutorial_copyMakeBorder "the corresponding tutorial" for more details +*/ + /** @brief Forms a border around an image. The function copies the source image into the middle of the destination image. The areas to the @@ -474,9 +476,10 @@ The function can also be emulated with a matrix expression, for example: */ CV_EXPORTS_W void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst); -/** @example AddingImagesTrackbar.cpp +/** @example samples/cpp/tutorial_code/HighGUI/AddingImagesTrackbar.cpp +Check @ref tutorial_trackbar "the corresponding tutorial" for more details +*/ - */ /** @brief Calculates the weighted sum of two arrays. The function addWeighted calculates the weighted sum of two arrays as follows: @@ -2527,14 +2530,18 @@ public: Mat mean; //!< mean value subtracted before the projection and added after the back projection }; -/** @example pca.cpp - An example using %PCA for dimensionality reduction while maintaining an amount of variance - */ +/** @example samples/cpp/pca.cpp +An example using %PCA for dimensionality reduction while maintaining an amount of variance +*/ + +/** @example samples/cpp/tutorial_code/ml/introduction_to_pca/introduction_to_pca.cpp +Check @ref tutorial_introduction_to_pca "the corresponding tutorial" for more details +*/ /** - @brief Linear Discriminant Analysis - @todo document this class - */ +@brief Linear Discriminant Analysis +@todo document this class +*/ class CV_EXPORTS LDA { public: @@ -2850,7 +2857,7 @@ public: use explicit type cast operators, as in the a1 initialization above. @param a lower inclusive boundary of the returned random number. @param b upper non-inclusive boundary of the returned random number. - */ + */ int uniform(int a, int b); /** @overload */ float uniform(float a, float b); @@ -2912,7 +2919,7 @@ public: Inspired by http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c @todo document - */ +*/ class CV_EXPORTS RNG_MT19937 { public: @@ -2930,17 +2937,11 @@ public: unsigned operator ()(unsigned N); unsigned operator ()(); - /** @brief returns uniformly distributed integer random number from [a,b) range - -*/ + /** @brief returns uniformly distributed integer random number from [a,b) range*/ int uniform(int a, int b); - /** @brief returns uniformly distributed floating-point random number from [a,b) range - -*/ + /** @brief returns uniformly distributed floating-point random number from [a,b) range*/ float uniform(float a, float b); - /** @brief returns uniformly distributed double-precision floating-point random number from [a,b) range - -*/ + /** @brief returns uniformly distributed double-precision floating-point random number from [a,b) range*/ double uniform(double a, double b); private: @@ -2954,8 +2955,8 @@ private: //! @addtogroup core_cluster //! @{ -/** @example kmeans.cpp - An example on K-means clustering +/** @example samples/cpp/kmeans.cpp +An example on K-means clustering */ /** @brief Finds centers of clusters and groups input samples around the clusters. @@ -3067,7 +3068,7 @@ etc.). Here is example of SimpleBlobDetector use in your application via Algorithm interface: @snippet snippets/core_various.cpp Algorithm - */ +*/ class CV_EXPORTS_W Algorithm { public: @@ -3083,8 +3084,8 @@ public: virtual void write(FileStorage& fs) const { (void)fs; } /** @brief simplified API for language bindings - * @overload - */ + * @overload + */ CV_WRAP void write(const Ptr& fs, const String& name = String()) const; /** @brief Reads algorithm parameters from a file storage @@ -3092,20 +3093,20 @@ public: CV_WRAP virtual void read(const FileNode& fn) { (void)fn; } /** @brief Returns true if the Algorithm is empty (e.g. in the very beginning or after unsuccessful read - */ + */ CV_WRAP virtual bool empty() const { return false; } /** @brief Reads algorithm from the file node - This is static template method of Algorithm. It's usage is following (in the case of SVM): - @code - cv::FileStorage fsRead("example.xml", FileStorage::READ); - Ptr svm = Algorithm::read(fsRead.root()); - @endcode - In order to make this method work, the derived class must overwrite Algorithm::read(const - FileNode& fn) and also have static create() method without parameters - (or with all the optional parameters) - */ + This is static template method of Algorithm. It's usage is following (in the case of SVM): + @code + cv::FileStorage fsRead("example.xml", FileStorage::READ); + Ptr svm = Algorithm::read(fsRead.root()); + @endcode + In order to make this method work, the derived class must overwrite Algorithm::read(const + FileNode& fn) and also have static create() method without parameters + (or with all the optional parameters) + */ template static Ptr<_Tp> read(const FileNode& fn) { Ptr<_Tp> obj = _Tp::create(); @@ -3115,16 +3116,16 @@ public: /** @brief Loads algorithm from the file - @param filename Name of the file to read. - @param objname The optional name of the node to read (if empty, the first top-level node will be used) + @param filename Name of the file to read. + @param objname The optional name of the node to read (if empty, the first top-level node will be used) - This is static template method of Algorithm. It's usage is following (in the case of SVM): - @code - Ptr svm = Algorithm::load("my_svm_model.xml"); - @endcode - In order to make this method work, the derived class must overwrite Algorithm::read(const - FileNode& fn). - */ + This is static template method of Algorithm. It's usage is following (in the case of SVM): + @code + Ptr svm = Algorithm::load("my_svm_model.xml"); + @endcode + In order to make this method work, the derived class must overwrite Algorithm::read(const + FileNode& fn). + */ template static Ptr<_Tp> load(const String& filename, const String& objname=String()) { FileStorage fs(filename, FileStorage::READ); @@ -3138,14 +3139,14 @@ public: /** @brief Loads algorithm from a String - @param strModel The string variable containing the model you want to load. - @param objname The optional name of the node to read (if empty, the first top-level node will be used) + @param strModel The string variable containing the model you want to load. + @param objname The optional name of the node to read (if empty, the first top-level node will be used) - This is static template method of Algorithm. It's usage is following (in the case of SVM): - @code - Ptr svm = Algorithm::loadFromString(myStringModel); - @endcode - */ + This is static template method of Algorithm. It's usage is following (in the case of SVM): + @code + Ptr svm = Algorithm::loadFromString(myStringModel); + @endcode + */ template static Ptr<_Tp> loadFromString(const String& strModel, const String& objname=String()) { FileStorage fs(strModel, FileStorage::READ + FileStorage::MEMORY); @@ -3156,11 +3157,11 @@ public: } /** Saves the algorithm to a file. - In order to make this method work, the derived class must implement Algorithm::write(FileStorage& fs). */ + In order to make this method work, the derived class must implement Algorithm::write(FileStorage& fs). */ CV_WRAP virtual void save(const String& filename) const; /** Returns the algorithm string identifier. - This string is used as top level xml/yml node tag when the object is saved to a file or string. */ + This string is used as top level xml/yml node tag when the object is saved to a file or string. */ CV_WRAP virtual String getDefaultName() const; protected: diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index 550d963a29..a7d3021857 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -575,7 +575,7 @@ protected: MatStep& operator = (const MatStep&); }; -/** @example cout_mat.cpp +/** @example samples/cpp/cout_mat.cpp An example demonstrating the serial out capabilities of cv::Mat */ diff --git a/modules/core/include/opencv2/core/persistence.hpp b/modules/core/include/opencv2/core/persistence.hpp index 5103c7df8b..a82235b7c3 100644 --- a/modules/core/include/opencv2/core/persistence.hpp +++ b/modules/core/include/opencv2/core/persistence.hpp @@ -287,12 +287,12 @@ element is a structure of 2 integers, followed by a single-precision floating-po equivalent notations of the above specification are `iif`, `2i1f` and so forth. Other examples: `u` means that the array consists of bytes, and `2d` means the array consists of pairs of doubles. -@see @ref filestorage.cpp +@see @ref samples/cpp/filestorage.cpp */ //! @{ -/** @example filestorage.cpp +/** @example samples/cpp/filestorage.cpp A complete example using the FileStorage interface */ diff --git a/modules/dnn/include/opencv2/dnn.hpp b/modules/dnn/include/opencv2/dnn.hpp index af919005f6..97f2fe3ffd 100644 --- a/modules/dnn/include/opencv2/dnn.hpp +++ b/modules/dnn/include/opencv2/dnn.hpp @@ -59,6 +59,20 @@ A network training is in principle not supported. @} */ +/** @example samples/dnn/classification.cpp +Check @ref tutorial_dnn_googlenet "the corresponding tutorial" for more details +*/ +/** @example samples/dnn/colorization.cpp +*/ +/** @example samples/dnn/object_detection.cpp +Check @ref tutorial_dnn_yolo "the corresponding tutorial" for more details +*/ +/** @example samples/dnn/openpose.cpp +*/ +/** @example samples/dnn/segmentation.cpp +*/ +/** @example samples/dnn/text_detection.cpp +*/ #include #endif /* OPENCV_DNN_HPP */ diff --git a/modules/highgui/include/opencv2/highgui.hpp b/modules/highgui/include/opencv2/highgui.hpp index 06cfd80ac3..994a1d1efb 100644 --- a/modules/highgui/include/opencv2/highgui.hpp +++ b/modules/highgui/include/opencv2/highgui.hpp @@ -452,12 +452,13 @@ The function getWindowImageRect returns the client screen coordinates, width and */ CV_EXPORTS_W Rect getWindowImageRect(const String& winname); +/** @example samples/cpp/create_mask.cpp +This program demonstrates using mouse events and how to make and use a mask image (black and white) . +*/ /** @brief Sets mouse handler for the specified window @param winname Name of the window. -@param onMouse Mouse callback. See OpenCV samples, such as -, on how to specify and -use the callback. +@param onMouse Callback function for mouse events. See OpenCV samples on how to specify and use the callback. @param userdata The optional parameter passed to the callback. */ CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0); diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index a831d0e92b..f309278dd8 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -1191,7 +1191,7 @@ protected: //! @addtogroup imgproc_feature //! @{ -/** @example lsd_lines.cpp +/** @example samples/cpp/lsd_lines.cpp An example using the LineSegmentDetector \image html building_lsd.png "Sample output image" width=434 height=300 */ @@ -1349,11 +1349,12 @@ operation is shifted. */ CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1)); -/** @example Smoothing.cpp +/** @example samples/cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp Sample code for simple filters ![Sample screenshot](Smoothing_Tutorial_Result_Median_Filter.jpg) Check @ref tutorial_gausian_median_blur_bilateral_filter "the corresponding tutorial" for more details */ + /** @brief Blurs an image using the median filter. The function smoothes an image using the median filter with the \f$\texttt{ksize} \times @@ -1556,11 +1557,12 @@ CV_EXPORTS_W void sepFilter2D( InputArray src, OutputArray dst, int ddepth, Point anchor = Point(-1,-1), double delta = 0, int borderType = BORDER_DEFAULT ); -/** @example Sobel_Demo.cpp +/** @example samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp Sample code using Sobel and/or Scharr OpenCV functions to make a simple Edge Detector ![Sample screenshot](Sobel_Derivatives_Tutorial_Result.jpg) Check @ref tutorial_sobel_derivatives "the corresponding tutorial" for more details - */ +*/ + /** @brief Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator. In all cases except one, the \f$\texttt{ksize} \times \texttt{ksize}\f$ separable kernel is used to @@ -1656,8 +1658,8 @@ CV_EXPORTS_W void Scharr( InputArray src, OutputArray dst, int ddepth, int dx, int dy, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT ); -/** @example laplace.cpp - An example using Laplace transformations for edge detection +/** @example samples/cpp/laplace.cpp +An example using Laplace transformations for edge detection */ /** @brief Calculates the Laplacian of an image. @@ -1692,10 +1694,10 @@ CV_EXPORTS_W void Laplacian( InputArray src, OutputArray dst, int ddepth, //! @addtogroup imgproc_feature //! @{ -/** @example edge.cpp - This program demonstrates usage of the Canny edge detector +/** @example samples/cpp/edge.cpp +This program demonstrates usage of the Canny edge detector - Check @ref tutorial_canny_detector "the corresponding tutorial" for more details +Check @ref tutorial_canny_detector "the corresponding tutorial" for more details */ /** @brief Finds edges in an image using the Canny algorithm @cite Canny86 . @@ -1932,7 +1934,7 @@ CV_EXPORTS_W void goodFeaturesToTrack( InputArray image, OutputArray corners, InputArray mask, int blockSize, int gradientSize, bool useHarrisDetector = false, double k = 0.04 ); -/** @example houghlines.cpp +/** @example samples/cpp/tutorial_code/ImgTrans/houghlines.cpp An example using the Hough line detector ![Sample input image](Hough_Lines_Tutorial_Original_Image.jpg) ![Output image](Hough_Lines_Tutorial_Result.jpg) */ @@ -2021,7 +2023,7 @@ CV_EXPORTS_W void HoughLinesPointSet( InputArray _point, OutputArray _lines, int double min_rho, double max_rho, double rho_step, double min_theta, double max_theta, double theta_step ); -/** @example houghcircles.cpp +/** @example samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp An example using the Hough circle detector */ @@ -2069,7 +2071,7 @@ CV_EXPORTS_W void HoughCircles( InputArray image, OutputArray circles, //! @addtogroup imgproc_filter //! @{ -/** @example morphology2.cpp +/** @example samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp Advanced morphology Transformations sample code ![Sample screenshot](Morphology_2_Tutorial_Result.jpg) Check @ref tutorial_opening_closing_hats "the corresponding tutorial" for more details @@ -2102,11 +2104,12 @@ CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() ); -/** @example Morphology_1.cpp +/** @example samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp Erosion and Dilation sample code ![Sample Screenshot-Erosion](Morphology_1_Tutorial_Erosion_Result.jpg)![Sample Screenshot-Dilation](Morphology_1_Tutorial_Dilation_Result.jpg) Check @ref tutorial_erosion_dilatation "the corresponding tutorial" for more details - */ +*/ + /** @brief Dilates an image by using a specific structuring element. The function dilates the source image using the specified structuring element that determines the @@ -2236,9 +2239,10 @@ CV_EXPORTS_W void warpAffine( InputArray src, OutputArray dst, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar()); -/** @example warpPerspective_demo.cpp +/** @example samples/cpp/warpPerspective_demo.cpp An example program shows using cv::findHomography and cv::warpPerspective for image warping - */ +*/ + /** @brief Applies a perspective transformation to an image. The function warpPerspective transforms the source image using the specified matrix: @@ -2434,7 +2438,7 @@ source image. The center must be inside the image. CV_EXPORTS_W void getRectSubPix( InputArray image, Size patchSize, Point2f center, OutputArray patch, int patchType = -1 ); -/** @example polar_transforms.cpp +/** @example samples/cpp/polar_transforms.cpp An example using the cv::linearPolar and cv::logPolar operations */ @@ -2869,9 +2873,10 @@ CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst, //! @addtogroup imgproc_filter //! @{ -/** @example Pyramids.cpp +/** @example samples/cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp An example using pyrDown and pyrUp functions - */ +*/ + /** @brief Blurs an image and downsamples it. By default, size of the output image is computed as `Size((src.cols+1)/2, (src.rows+1)/2)`, but in @@ -3120,7 +3125,7 @@ CV_EXPORTS_AS(undistortPointsIter) void undistortPoints( InputArray src, OutputA //! @addtogroup imgproc_hist //! @{ -/** @example demhist.cpp +/** @example samples/cpp/demhist.cpp An example for creating histograms of an image */ @@ -3317,9 +3322,9 @@ CV_EXPORTS_AS(EMD) float wrapperEMD( InputArray signature1, InputArray signature //! @} imgproc_hist -/** @example watershed.cpp +/** @example samples/cpp/watershed.cpp An example using the watershed algorithm - */ +*/ /** @brief Performs a marker-based image segmentation using the watershed algorithm. @@ -3397,10 +3402,10 @@ CV_EXPORTS_W void pyrMeanShiftFiltering( InputArray src, OutputArray dst, //! @addtogroup imgproc_misc //! @{ -/** @example grabcut.cpp +/** @example samples/cpp/grabcut.cpp An example using the GrabCut algorithm ![Sample Screenshot](grabcut_output1.jpg) - */ +*/ /** @brief Runs the GrabCut algorithm. @@ -3424,11 +3429,10 @@ CV_EXPORTS_W void grabCut( InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode = GC_EVAL ); -/** @example distrans.cpp -An example on using the distance transform\ +/** @example samples/cpp/distrans.cpp +An example on using the distance transform */ - /** @brief Calculates the distance to the closest zero pixel for each pixel of the source image. The function cv::distanceTransform calculates the approximate or precise distance from every binary @@ -3500,8 +3504,8 @@ the first variant of the function and distanceType == #DIST_L1. CV_EXPORTS_W void distanceTransform( InputArray src, OutputArray dst, int distanceType, int maskSize, int dstType=CV_32F); -/** @example ffilldemo.cpp - An example using the FloodFill technique +/** @example samples/cpp/ffilldemo.cpp +An example using the FloodFill technique */ /** @overload @@ -3701,9 +3705,10 @@ enum TemplateMatchModes { TM_CCOEFF_NORMED = 5 //!< \f[R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x',y+y')) }{ \sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2} }\f] }; -/** @example MatchTemplate_Demo.cpp +/** @example samples/cpp/tutorial_code/Histograms_Matching/MatchTemplate_Demo.cpp An example using Template Matching algorithm - */ +*/ + /** @brief Compares a template against overlapped image regions. The function slides through image , compares the overlapped patches of size \f$w \times h\f$ against @@ -3735,6 +3740,10 @@ CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ, //! @addtogroup imgproc_shape //! @{ +/** @example samples/cpp/connected_components.cpp +This program demonstrates connected components and use of the trackbar +*/ + /** @brief computes the connected components labeled image of boolean image image with 4 or 8 way connectivity - returns N, the total number of labels [0, N-1] where 0 @@ -3842,6 +3851,16 @@ CV_EXPORTS_W void findContours( InputOutputArray image, OutputArrayOfArrays cont CV_EXPORTS void findContours( InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset = Point()); +/** @example samples/cpp/squares.cpp +A program using pyramid scaling, Canny, contours and contour simplification to find +squares in a list of images (pic1-6.png). Returns sequence of squares detected on the image. +*/ + +/** @example samples/tapi/squares.cpp +A program using pyramid scaling, Canny, contours and contour simplification to find +squares in the input image. +*/ + /** @brief Approximates a polygonal curve(s) with the specified precision. The function cv::approxPolyDP approximates a curve or a polygon with another curve/polygon with less @@ -3940,8 +3959,8 @@ The function finds the minimal enclosing circle of a 2D point set using an itera CV_EXPORTS_W void minEnclosingCircle( InputArray points, CV_OUT Point2f& center, CV_OUT float& radius ); -/** @example minarea.cpp - */ +/** @example samples/cpp/minarea.cpp +*/ /** @brief Finds a triangle of minimum area enclosing a 2D point set and returns its area. @@ -3976,7 +3995,7 @@ The function compares two shapes. All three implemented methods use the Hu invar CV_EXPORTS_W double matchShapes( InputArray contour1, InputArray contour2, int method, double parameter ); -/** @example convexhull.cpp +/** @example samples/cpp/convexhull.cpp An example using the convexHull functionality */ @@ -4036,8 +4055,8 @@ CV_EXPORTS_W bool isContourConvex( InputArray contour ); CV_EXPORTS_W float intersectConvexConvex( InputArray _p1, InputArray _p2, OutputArray _p12, bool handleNested = true ); -/** @example fitellipse.cpp - An example using the fitEllipse technique +/** @example samples/cpp/fitellipse.cpp +An example using the fitEllipse technique */ /** @brief Fits an ellipse around a set of 2D points. @@ -4253,9 +4272,10 @@ enum ColormapTypes COLORMAP_PARULA = 12 //!< ![parula](pics/colormaps/colorscale_parula.jpg) }; -/** @example falsecolor.cpp +/** @example samples/cpp/falsecolor.cpp An example using applyColorMap function */ + /** @brief Applies a GNU Octave/MATLAB equivalent colormap on a given image. @param src The source image, grayscale or colored of type CV_8UC1 or CV_8UC3. @@ -4342,9 +4362,10 @@ CV_EXPORTS void rectangle(CV_IN_OUT Mat& img, Rect rec, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); -/** @example Drawing_2.cpp +/** @example samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_2.cpp An example using drawing functions - */ +*/ + /** @brief Draws a circle. The function cv::circle draws a simple or filled circle with a given center and radius. @@ -4468,9 +4489,11 @@ CV_EXPORTS void fillPoly(Mat& img, const Point** pts, const Scalar& color, int lineType = LINE_8, int shift = 0, Point offset = Point() ); -/** @example Drawing_1.cpp +/** @example samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp An example using drawing functions - */ +Check @ref tutorial_random_generator_and_text "the corresponding tutorial" for more details +*/ + /** @brief Fills the area bounded by one or more polygons. The function cv::fillPoly fills an area bounded by several polygonal contours. The function can fill @@ -4510,14 +4533,14 @@ CV_EXPORTS_W void polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0 ); -/** @example contours2.cpp - An example program illustrates the use of cv::findContours and cv::drawContours - \image html WindowsQtContoursOutput.png "Screenshot of the program" +/** @example samples/cpp/contours2.cpp +An example program illustrates the use of cv::findContours and cv::drawContours +\image html WindowsQtContoursOutput.png "Screenshot of the program" */ -/** @example segment_objects.cpp +/** @example samples/cpp/segment_objects.cpp An example using drawContours to clean up a background segmentation result - */ +*/ /** @brief Draws contours outlines or filled contours. diff --git a/modules/objdetect/include/opencv2/objdetect.hpp b/modules/objdetect/include/opencv2/objdetect.hpp index bd8bbf05ff..fa9b8bb466 100644 --- a/modules/objdetect/include/opencv2/objdetect.hpp +++ b/modules/objdetect/include/opencv2/objdetect.hpp @@ -215,7 +215,7 @@ public: virtual Ptr getMaskGenerator() = 0; }; -/** @example facedetect.cpp +/** @example samples/cpp/facedetect.cpp This program demonstrates usage of the Cascade classifier class \image html Cascade_Classifier_Tutorial_Result_Haar.jpg "Sample screenshot" width=321 height=254 */ @@ -443,7 +443,7 @@ public: */ CV_WRAP double getWinSigma() const; - /**@example peopledetect.cpp + /**@example samples/cpp/peopledetect.cpp */ /**@brief Sets coefficients for the linear SVM classifier. @param _svmdetector coefficients for the linear SVM classifier. @@ -478,7 +478,7 @@ public: */ virtual void copyTo(HOGDescriptor& c) const; - /**@example train_HOG.cpp + /**@example samples/cpp/train_HOG.cpp */ /** @brief Computes HOG descriptors of given image. @param img Matrix of the type CV_8U containing an image where HOG features will be calculated. @@ -575,7 +575,7 @@ public: */ CV_WRAP static std::vector getDefaultPeopleDetector(); - /**@example hog.cpp + /**@example samples/tapi/hog.cpp */ /** @brief Returns coefficients of the classifier trained for people detection (for 48x96 windows). */ diff --git a/modules/photo/include/opencv2/photo.hpp b/modules/photo/include/opencv2/photo.hpp index 8cd1971899..4fdeef90fa 100644 --- a/modules/photo/include/opencv2/photo.hpp +++ b/modules/photo/include/opencv2/photo.hpp @@ -730,7 +730,7 @@ CV_EXPORTS_W void decolor( InputArray src, OutputArray grayscale, OutputArray co //! @addtogroup photo_clone //! @{ -/** @example cloning_demo.cpp +/** @example samples/cpp/tutorial_code/photo/seamless_cloning/cloning_demo.cpp An example using seamlessClone function */ /** @brief Image editing tasks concern either global changes (color/intensity corrections, filters, @@ -836,7 +836,7 @@ CV_EXPORTS_W void edgePreservingFilter(InputArray src, OutputArray dst, int flag CV_EXPORTS_W void detailEnhance(InputArray src, OutputArray dst, float sigma_s = 10, float sigma_r = 0.15f); -/** @example npr_demo.cpp +/** @example samples/cpp/tutorial_code/photo/non_photorealistic_rendering/npr_demo.cpp An example using non-photorealistic line drawing functions */ /** @brief Pencil-like non-photorealistic line drawing diff --git a/modules/shape/include/opencv2/shape/shape_distance.hpp b/modules/shape/include/opencv2/shape/shape_distance.hpp index 3a778f0525..725b56ac95 100644 --- a/modules/shape/include/opencv2/shape/shape_distance.hpp +++ b/modules/shape/include/opencv2/shape/shape_distance.hpp @@ -53,7 +53,7 @@ namespace cv //! @addtogroup shape //! @{ -/** @example shape_example.cpp +/** @example samples/cpp/shape_example.cpp An example using shape distance algorithm */ /** @brief Abstract base class for shape distance algorithms. diff --git a/modules/stitching/include/opencv2/stitching.hpp b/modules/stitching/include/opencv2/stitching.hpp index 8b1bcc1a8c..07e1b5f73a 100644 --- a/modules/stitching/include/opencv2/stitching.hpp +++ b/modules/stitching/include/opencv2/stitching.hpp @@ -109,6 +109,14 @@ namespace cv { //! @addtogroup stitching //! @{ +/** @example samples/cpp/stitching.cpp +A basic example on image stitching +*/ + +/** @example samples/cpp/stitching_detailed.cpp +A detailed example on image stitching +*/ + /** @brief High level image stitcher. It's possible to use this class without being aware of the entire stitching pipeline. However, to diff --git a/modules/video/include/opencv2/video/tracking.hpp b/modules/video/include/opencv2/video/tracking.hpp index 8e01d1645e..e757b0fa91 100644 --- a/modules/video/include/opencv2/video/tracking.hpp +++ b/modules/video/include/opencv2/video/tracking.hpp @@ -78,9 +78,10 @@ See the OpenCV sample camshiftdemo.c that tracks colored objects. */ CV_EXPORTS_W RotatedRect CamShift( InputArray probImage, CV_IN_OUT Rect& window, TermCriteria criteria ); -/** @example camshiftdemo.cpp +/** @example samples/cpp/camshiftdemo.cpp An example using the mean-shift tracking algorithm */ + /** @brief Finds an object on a back projection image. @param probImage Back projection of the object histogram. See calcBackProject for details. @@ -123,9 +124,10 @@ CV_EXPORTS_W int buildOpticalFlowPyramid( InputArray img, OutputArrayOfArrays py int derivBorder = BORDER_CONSTANT, bool tryReuseInputImage = true ); -/** @example lkdemo.cpp +/** @example samples/cpp/lkdemo.cpp An example using the Lucas-Kanade optical flow algorithm - */ +*/ + /** @brief Calculates an optical flow for a sparse feature set using the iterative Lucas-Kanade method with pyramids. @@ -263,9 +265,9 @@ enum MOTION_HOMOGRAPHY = 3 }; -/** @example image_alignment.cpp +/** @example samples/cpp/image_alignment.cpp An example using the image alignment ECC algorithm - */ +*/ /** @brief Finds the geometric transform (warp) between two images in terms of the ECC criterion @cite EP08 . @@ -322,9 +324,10 @@ CV_EXPORTS_W double findTransformECC( InputArray templateImage, InputArray input TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 50, 0.001), InputArray inputMask = noArray()); -/** @example kalman.cpp +/** @example samples/cpp/kalman.cpp An example using the standard Kalman filter */ + /** @brief Kalman filter class. The class implements a standard Kalman filter , diff --git a/modules/videoio/include/opencv2/videoio.hpp b/modules/videoio/include/opencv2/videoio.hpp index 2628609040..bb4e3986c8 100644 --- a/modules/videoio/include/opencv2/videoio.hpp +++ b/modules/videoio/include/opencv2/videoio.hpp @@ -815,13 +815,18 @@ protected: class IVideoWriter; -/** @example videowriter_basic.cpp +/** @example samples/cpp/tutorial_code/videoio/video-write/video-write.cpp +Check @ref tutorial_video_write "the corresponding tutorial" for more details +*/ + +/** @example samples/cpp/videowriter_basic.cpp An example using VideoCapture and VideoWriter class - */ +*/ + /** @brief Video writer class. The class provides C++ API for writing video files or image sequences. - */ +*/ class CV_EXPORTS_W VideoWriter { public: diff --git a/samples/cpp/connected_components.cpp b/samples/cpp/connected_components.cpp index 6c978f1535..711b0a97c8 100644 --- a/samples/cpp/connected_components.cpp +++ b/samples/cpp/connected_components.cpp @@ -1,3 +1,4 @@ + #include #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" @@ -32,44 +33,29 @@ static void on_trackbar(int, void*) imshow( "Connected Components", dst ); } -static void help() -{ - cout << "\n This program demonstrates connected components and use of the trackbar\n" - "Usage: \n" - " ./connected_components \n" - "The image is converted to grayscale and displayed, another image has a trackbar\n" - "that controls thresholding and thereby the extracted contours which are drawn in color\n"; -} - -const char* keys = -{ - "{help h||}{@image|../data/stuff.jpg|image for converting to a grayscale}" -}; - int main( int argc, const char** argv ) { - CommandLineParser parser(argc, argv, keys); - if (parser.has("help")) - { - help(); - return 0; - } - string inputImage = parser.get(0); - img = imread(inputImage.c_str(), 0); + CommandLineParser parser(argc, argv, "{@image|../data/stuff.jpg|image for converting to a grayscale}"); + parser.about("\nThis program demonstrates connected components and use of the trackbar\n"); + parser.printMessage(); + cout << "\nThe image is converted to grayscale and displayed, another image has a trackbar\n" + "that controls thresholding and thereby the extracted contours which are drawn in color\n"; + + String inputImage = parser.get(0); + img = imread(inputImage, IMREAD_GRAYSCALE); if(img.empty()) { cout << "Could not read input image file: " << inputImage << endl; - return -1; + return EXIT_FAILURE; } - namedWindow( "Image", 1 ); imshow( "Image", img ); - namedWindow( "Connected Components", 1 ); + namedWindow( "Connected Components", WINDOW_AUTOSIZE); createTrackbar( "Threshold", "Connected Components", &threshval, 255, on_trackbar ); on_trackbar(threshval, 0); waitKey(0); - return 0; + return EXIT_SUCCESS; } diff --git a/samples/cpp/squares.cpp b/samples/cpp/squares.cpp index dfa3c61e85..480fe0a029 100644 --- a/samples/cpp/squares.cpp +++ b/samples/cpp/squares.cpp @@ -1,3 +1,4 @@ + // The "Square Detector" program. // It loads several images sequentially and tries to find squares in // each image @@ -8,22 +9,18 @@ #include "opencv2/highgui.hpp" #include -#include -#include using namespace cv; using namespace std; -static void help() +static void help(const char* programName) { cout << - "\nA program using pyramid scaling, Canny, contours, contour simpification and\n" - "memory storage (it's got it all folks) to find\n" - "squares in a list of images pic1-6.png\n" + "\nA program using pyramid scaling, Canny, contours and contour simplification\n" + "to find squares in a list of images (pic1-6.png)\n" "Returns sequence of squares detected on the image.\n" - "the sequence is stored in the specified memory storage\n" "Call:\n" - "./squares [file_name (optional)]\n" + "./" << programName << " [file_name (optional)]\n" "Using OpenCV version " << CV_VERSION << "\n" << endl; } @@ -44,7 +41,6 @@ static double angle( Point pt1, Point pt2, Point pt0 ) } // returns sequence of squares detected on the image. -// the sequence is stored in the specified memory storage static void findSquares( const Mat& image, vector >& squares ) { squares.clear(); @@ -93,7 +89,7 @@ static void findSquares( const Mat& image, vector >& squares ) { // approximate contour with accuracy proportional // to the contour perimeter - approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true); + approxPolyDP(contours[i], approx, arcLength(contours[i], true)*0.02, true); // square contours should have 4 vertices after approximation // relatively large area (to filter out noisy contours) @@ -102,8 +98,8 @@ static void findSquares( const Mat& image, vector >& squares ) // area may be positive or negative - in accordance with the // contour orientation if( approx.size() == 4 && - fabs(contourArea(Mat(approx))) > 1000 && - isContourConvex(Mat(approx)) ) + fabs(contourArea(approx)) > 1000 && + isContourConvex(approx) ) { double maxCosine = 0; @@ -144,7 +140,7 @@ int main(int argc, char** argv) { static const char* names[] = { "../data/pic1.png", "../data/pic2.png", "../data/pic3.png", "../data/pic4.png", "../data/pic5.png", "../data/pic6.png", 0 }; - help(); + help(argv[0]); if( argc > 1) { @@ -152,12 +148,11 @@ int main(int argc, char** argv) names[1] = "0"; } - namedWindow( wndname, 1 ); vector > squares; for( int i = 0; names[i] != 0; i++ ) { - Mat image = imread(names[i], 1); + Mat image = imread(names[i], IMREAD_COLOR); if( image.empty() ) { cout << "Couldn't load " << names[i] << endl; @@ -167,7 +162,7 @@ int main(int argc, char** argv) findSquares(image, squares); drawSquares(image, squares); - char c = (char)waitKey(); + int c = waitKey(); if( c == 27 ) break; } diff --git a/samples/cpp/stitching.cpp b/samples/cpp/stitching.cpp index 153fe55e8f..dd8c151dd3 100644 --- a/samples/cpp/stitching.cpp +++ b/samples/cpp/stitching.cpp @@ -20,8 +20,9 @@ int parseCmdArgs(int argc, char** argv); int main(int argc, char* argv[]) { int retval = parseCmdArgs(argc, argv); - if (retval) return -1; + if (retval) return EXIT_FAILURE; + //![stitching] Mat pano; Ptr stitcher = Stitcher::create(mode, try_use_gpu); Stitcher::Status status = stitcher->stitch(imgs, pano); @@ -29,12 +30,13 @@ int main(int argc, char* argv[]) if (status != Stitcher::OK) { cout << "Can't stitch images, error code = " << int(status) << endl; - return -1; + return EXIT_FAILURE; } + //![stitching] imwrite(result_name, pano); cout << "stitching completed successfully\n" << result_name << " saved!"; - return 0; + return EXIT_SUCCESS; } @@ -63,7 +65,7 @@ int parseCmdArgs(int argc, char** argv) if (argc == 1) { printUsage(argv); - return -1; + return EXIT_FAILURE; } for (int i = 1; i < argc; ++i) @@ -71,7 +73,7 @@ int parseCmdArgs(int argc, char** argv) if (string(argv[i]) == "--help" || string(argv[i]) == "/?") { printUsage(argv); - return -1; + return EXIT_FAILURE; } else if (string(argv[i]) == "--try_use_gpu") { @@ -82,7 +84,7 @@ int parseCmdArgs(int argc, char** argv) else { cout << "Bad --try_use_gpu flag value\n"; - return -1; + return EXIT_FAILURE; } i++; } @@ -104,7 +106,7 @@ int parseCmdArgs(int argc, char** argv) else { cout << "Bad --mode flag value\n"; - return -1; + return EXIT_FAILURE; } i++; } @@ -114,7 +116,7 @@ int parseCmdArgs(int argc, char** argv) if (img.empty()) { cout << "Can't read image '" << argv[i] << "'\n"; - return -1; + return EXIT_FAILURE; } if (divide_images) @@ -130,5 +132,5 @@ int parseCmdArgs(int argc, char** argv) imgs.push_back(img); } } - return 0; + return EXIT_SUCCESS; } diff --git a/samples/cpp/stitching_detailed.cpp b/samples/cpp/stitching_detailed.cpp index 2ff4e7b16b..27b6e024f8 100644 --- a/samples/cpp/stitching_detailed.cpp +++ b/samples/cpp/stitching_detailed.cpp @@ -1,45 +1,3 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -// -//M*/ #include #include diff --git a/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp b/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp index 3619753162..ce71a3b118 100644 --- a/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp +++ b/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp @@ -33,7 +33,7 @@ void Morphology_Operations( int, void* ); int main( int argc, char** argv ) { //![load] - CommandLineParser parser( argc, argv, "{@input | ../data/LinuxLogo.jpg | input image}" ); + CommandLineParser parser( argc, argv, "{@input | ../data/baboon.jpg | input image}" ); src = imread( parser.get( "@input" ), IMREAD_COLOR ); if (src.empty()) { diff --git a/samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp b/samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp similarity index 100% rename from samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp rename to samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp diff --git a/samples/cpp/tutorial_code/core/Matrix/Drawing_2.cpp b/samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_2.cpp similarity index 100% rename from samples/cpp/tutorial_code/core/Matrix/Drawing_2.cpp rename to samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_2.cpp diff --git a/samples/java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java b/samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java similarity index 100% rename from samples/java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java rename to samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java diff --git a/samples/python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py b/samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py similarity index 100% rename from samples/python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py rename to samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py diff --git a/samples/tapi/squares.cpp b/samples/tapi/squares.cpp index 8300b9c872..42a40c3f6f 100644 --- a/samples/tapi/squares.cpp +++ b/samples/tapi/squares.cpp @@ -1,6 +1,3 @@ -// The "Square Detector" program. -// It loads several images sequentially and tries to find squares in -// each image #include "opencv2/core.hpp" #include "opencv2/core/ocl.hpp" @@ -9,7 +6,6 @@ #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include -#include using namespace cv; using namespace std; @@ -31,7 +27,6 @@ static double angle( Point pt1, Point pt2, Point pt0 ) // returns sequence of squares detected on the image. -// the sequence is stored in the specified memory storage static void findSquares( const UMat& image, vector >& squares ) { squares.clear(); @@ -66,7 +61,7 @@ static void findSquares( const UMat& image, vector >& squares ) { // apply threshold if l!=0: // tgray(x,y) = gray(x,y) < (l+1)*255/N ? 255 : 0 - cv::threshold(gray0, gray, (l+1)*255/N, 255, THRESH_BINARY); + threshold(gray0, gray, (l+1)*255/N, 255, THRESH_BINARY); } // find contours and store them all as a list @@ -80,7 +75,7 @@ static void findSquares( const UMat& image, vector >& squares ) // approximate contour with accuracy proportional // to the contour perimeter - approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true); + approxPolyDP(contours[i], approx, arcLength(contours[i], true)*0.02, true); // square contours should have 4 vertices after approximation // relatively large area (to filter out noisy contours) @@ -89,8 +84,8 @@ static void findSquares( const UMat& image, vector >& squares ) // area may be positive or negative - in accordance with the // contour orientation if( approx.size() == 4 && - fabs(contourArea(Mat(approx))) > 1000 && - isContourConvex(Mat(approx)) ) + fabs(contourArea(approx)) > 1000 && + isContourConvex(approx) ) { double maxCosine = 0; @@ -150,7 +145,7 @@ int main(int argc, char** argv) if(cmd.has("help")) { - cout << "Usage : squares [options]" << endl; + cout << "Usage : " << argv[0] << " [options]" << endl; cout << "Available options:" << endl; cmd.printMessage(); return EXIT_SUCCESS; @@ -158,7 +153,7 @@ int main(int argc, char** argv) if (cmd.has("cpu_mode")) { ocl::setUseOpenCL(false); - std::cout << "OpenCL was disabled" << std::endl; + cout << "OpenCL was disabled" << endl; } string inputName = cmd.get("i"); @@ -185,11 +180,11 @@ int main(int argc, char** argv) do { - int64 t_start = cv::getTickCount(); + int64 t_start = getTickCount(); findSquares(image, squares); t_cpp += cv::getTickCount() - t_start; - t_start = cv::getTickCount(); + t_start = getTickCount(); cout << "run loop: " << j << endl; } From 7ee69740e88e793640bfa19464e34a3fcc6b435d Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 17 Aug 2018 16:42:11 +0300 Subject: [PATCH 13/17] ml(test): test different samples layout of TrainData --- modules/ml/test/test_mltests2.cpp | 63 +++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/modules/ml/test/test_mltests2.cpp b/modules/ml/test/test_mltests2.cpp index b8c909001e..616a527bfe 100644 --- a/modules/ml/test/test_mltests2.cpp +++ b/modules/ml/test/test_mltests2.cpp @@ -721,5 +721,68 @@ void CV_MLBaseTest::load( const char* filename ) CV_Error( CV_StsNotImplemented, "invalid stat model name"); } + + +TEST(TrainDataGet, layout_ROW_SAMPLE) // Details: #12236 +{ + cv::Mat test = cv::Mat::ones(150, 30, CV_32FC1) * 2; + test.col(3) += Scalar::all(3); + cv::Mat labels = cv::Mat::ones(150, 3, CV_32SC1) * 5; + labels.col(1) += 1; + cv::Ptr train_data = cv::ml::TrainData::create(test, cv::ml::ROW_SAMPLE, labels); + train_data->setTrainTestSplitRatio(0.9); + + Mat tidx = train_data->getTestSampleIdx(); + EXPECT_EQ((size_t)15, tidx.total()); + + Mat tresp = train_data->getTestResponses(); + EXPECT_EQ(15, tresp.rows); + EXPECT_EQ(labels.cols, tresp.cols); + EXPECT_EQ(5, tresp.at(0, 0)) << tresp; + EXPECT_EQ(6, tresp.at(0, 1)) << tresp; + EXPECT_EQ(6, tresp.at(14, 1)) << tresp; + EXPECT_EQ(5, tresp.at(14, 2)) << tresp; + + Mat tsamples = train_data->getTestSamples(); + EXPECT_EQ(15, tsamples.rows); + EXPECT_EQ(test.cols, tsamples.cols); + EXPECT_EQ(2, tsamples.at(0, 0)) << tsamples; + EXPECT_EQ(5, tsamples.at(0, 3)) << tsamples; + EXPECT_EQ(2, tsamples.at(14, test.cols - 1)) << tsamples; + EXPECT_EQ(5, tsamples.at(14, 3)) << tsamples; +} + +TEST(TrainDataGet, layout_COL_SAMPLE) // Details: #12236 +{ + cv::Mat test = cv::Mat::ones(30, 150, CV_32FC1) * 3; + test.row(3) += Scalar::all(3); + cv::Mat labels = cv::Mat::ones(3, 150, CV_32SC1) * 5; + labels.row(1) += 1; + cv::Ptr train_data = cv::ml::TrainData::create(test, cv::ml::COL_SAMPLE, labels); + train_data->setTrainTestSplitRatio(0.9); + + Mat tidx = train_data->getTestSampleIdx(); + EXPECT_EQ((size_t)15, tidx.total()); + + Mat tresp = train_data->getTestResponses(); // always row-based, transposed + EXPECT_EQ(15, tresp.rows); + EXPECT_EQ(labels.rows, tresp.cols); + EXPECT_EQ(5, tresp.at(0, 0)) << tresp; + EXPECT_EQ(6, tresp.at(0, 1)) << tresp; + EXPECT_EQ(6, tresp.at(14, 1)) << tresp; + EXPECT_EQ(5, tresp.at(14, 2)) << tresp; + + + Mat tsamples = train_data->getTestSamples(); + EXPECT_EQ(15, tsamples.cols); + EXPECT_EQ(test.rows, tsamples.rows); + EXPECT_EQ(3, tsamples.at(0, 0)) << tsamples; + EXPECT_EQ(6, tsamples.at(3, 0)) << tsamples; + EXPECT_EQ(6, tsamples.at(3, 14)) << tsamples; + EXPECT_EQ(3, tsamples.at(test.rows - 1, 14)) << tsamples; +} + + + } // namespace /* End of file. */ From 6e84abc746757c6de75e7c5a303b7c68f721575f Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 17 Aug 2018 16:45:31 +0300 Subject: [PATCH 14/17] ml: don't use "getSubVector()" with 2D matrix It is designed for 1D vectors only --- modules/ml/include/opencv2/ml.hpp | 13 +++- modules/ml/src/data.cpp | 112 +++++++++++++++--------------- 2 files changed, 67 insertions(+), 58 deletions(-) diff --git a/modules/ml/include/opencv2/ml.hpp b/modules/ml/include/opencv2/ml.hpp index 31e7427735..f2ca78fe91 100644 --- a/modules/ml/include/opencv2/ml.hpp +++ b/modules/ml/include/opencv2/ml.hpp @@ -239,7 +239,18 @@ public: /** @brief Returns vector of symbolic names captured in loadFromCSV() */ CV_WRAP void getNames(std::vector& names) const; - CV_WRAP static Mat getSubVector(const Mat& vec, const Mat& idx); + /** @brief Extract from 1D vector elements specified by passed indexes. + @param vec input vector (supported types: CV_32S, CV_32F, CV_64F) + @param idx 1D index vector + */ + static CV_WRAP Mat getSubVector(const Mat& vec, const Mat& idx); + + /** @brief Extract from matrix rows/cols specified by passed indexes. + @param matrix input matrix (supported types: CV_32S, CV_32F, CV_64F) + @param idx 1D index vector + @param layout specifies to extract rows (cv::ml::ROW_SAMPLES) or to extract columns (cv::ml::COL_SAMPLES) + */ + static CV_WRAP Mat getSubMatrix(const Mat& matrix, const Mat& idx, int layout); /** @brief Reads the dataset from a .csv file and returns the ready-to-use training data. diff --git a/modules/ml/src/data.cpp b/modules/ml/src/data.cpp index 852d5c6a5b..a5dd101f1d 100644 --- a/modules/ml/src/data.cpp +++ b/modules/ml/src/data.cpp @@ -43,6 +43,8 @@ #include #include +#include + namespace cv { namespace ml { static const float MISSED_VAL = TrainData::missingValue(); @@ -54,69 +56,65 @@ Mat TrainData::getTestSamples() const { Mat idx = getTestSampleIdx(); Mat samples = getSamples(); - return idx.empty() ? Mat() : getSubVector(samples, idx); + return idx.empty() ? Mat() : getSubMatrix(samples, idx, getLayout()); } Mat TrainData::getSubVector(const Mat& vec, const Mat& idx) { - if( idx.empty() ) - return vec; - int i, j, n = idx.checkVector(1, CV_32S); - int type = vec.type(); - CV_Assert( type == CV_32S || type == CV_32F || type == CV_64F ); - int dims = 1, m; + if (!(vec.cols == 1 || vec.rows == 1)) + CV_LOG_WARNING(NULL, "'getSubVector(const Mat& vec, const Mat& idx)' call with non-1D input is deprecated. It is not designed to work with 2D matrixes (especially with 'cv::ml::COL_SAMPLE' layout)."); + return getSubMatrix(vec, idx, vec.rows == 1 ? cv::ml::COL_SAMPLE : cv::ml::ROW_SAMPLE); +} - if( vec.cols == 1 || vec.rows == 1 ) +template +Mat getSubMatrixImpl(const Mat& m, const Mat& idx, int layout) +{ + int nidx = idx.checkVector(1, CV_32S); + int dims = m.cols, nsamples = m.rows; + + Mat subm; + if (layout == COL_SAMPLE) { - dims = 1; - m = vec.cols + vec.rows - 1; + std::swap(dims, nsamples); + subm.create(dims, nidx, m.type()); } else { - dims = vec.cols; - m = vec.rows; + subm.create(nidx, dims, m.type()); } - Mat subvec; + for (int i = 0; i < nidx; i++) + { + int k = idx.at(i); CV_CheckGE(k, 0, "Bad idx"); CV_CheckLT(k, nsamples, "Bad idx or layout"); + if (dims == 1) + { + subm.at(i) = m.at(k); // at() has "transparent" access for 1D col-based / row-based vectors. + } + else if (layout == COL_SAMPLE) + { + for (int j = 0; j < dims; j++) + subm.at(j, i) = m.at(j, k); + } + else + { + for (int j = 0; j < dims; j++) + subm.at(i, j) = m.at(k, j); + } + } + return subm; +} - if( vec.cols == m ) - subvec.create(dims, n, type); - else - subvec.create(n, dims, type); - if( type == CV_32S ) - for( i = 0; i < n; i++ ) - { - int k = idx.at(i); - CV_Assert( 0 <= k && k < m ); - if( dims == 1 ) - subvec.at(i) = vec.at(k); - else - for( j = 0; j < dims; j++ ) - subvec.at(i, j) = vec.at(k, j); - } - else if( type == CV_32F ) - for( i = 0; i < n; i++ ) - { - int k = idx.at(i); - CV_Assert( 0 <= k && k < m ); - if( dims == 1 ) - subvec.at(i) = vec.at(k); - else - for( j = 0; j < dims; j++ ) - subvec.at(i, j) = vec.at(k, j); - } - else - for( i = 0; i < n; i++ ) - { - int k = idx.at(i); - CV_Assert( 0 <= k && k < m ); - if( dims == 1 ) - subvec.at(i) = vec.at(k); - else - for( j = 0; j < dims; j++ ) - subvec.at(i, j) = vec.at(k, j); - } - return subvec; +Mat TrainData::getSubMatrix(const Mat& m, const Mat& idx, int layout) +{ + if (idx.empty()) + return m; + int type = m.type(); + CV_CheckType(type, type == CV_32S || type == CV_32F || type == CV_64F, ""); + if (type == CV_32S || type == CV_32F) // 32-bit + return getSubMatrixImpl(m, idx, layout); + if (type == CV_64F) // 64-bit + return getSubMatrixImpl(m, idx, layout); + CV_Error(Error::StsInternal, ""); } class TrainDataImpl CV_FINAL : public TrainData @@ -172,30 +170,30 @@ public: } Mat getTrainSampleWeights() const CV_OVERRIDE { - return getSubVector(sampleWeights, getTrainSampleIdx()); + return getSubVector(sampleWeights, getTrainSampleIdx()); // 1D-vector } Mat getTestSampleWeights() const CV_OVERRIDE { Mat idx = getTestSampleIdx(); - return idx.empty() ? Mat() : getSubVector(sampleWeights, idx); + return idx.empty() ? Mat() : getSubVector(sampleWeights, idx); // 1D-vector } Mat getTrainResponses() const CV_OVERRIDE { - return getSubVector(responses, getTrainSampleIdx()); + return getSubMatrix(responses, getTrainSampleIdx(), cv::ml::ROW_SAMPLE); // col-based responses are transposed in setData() } Mat getTrainNormCatResponses() const CV_OVERRIDE { - return getSubVector(normCatResponses, getTrainSampleIdx()); + return getSubMatrix(normCatResponses, getTrainSampleIdx(), cv::ml::ROW_SAMPLE); // like 'responses' } Mat getTestResponses() const CV_OVERRIDE { Mat idx = getTestSampleIdx(); - return idx.empty() ? Mat() : getSubVector(responses, idx); + return idx.empty() ? Mat() : getSubMatrix(responses, idx, cv::ml::ROW_SAMPLE); // col-based responses are transposed in setData() } Mat getTestNormCatResponses() const CV_OVERRIDE { Mat idx = getTestSampleIdx(); - return idx.empty() ? Mat() : getSubVector(normCatResponses, idx); + return idx.empty() ? Mat() : getSubMatrix(normCatResponses, idx, cv::ml::ROW_SAMPLE); // like 'responses' } Mat getNormCatResponses() const CV_OVERRIDE { return normCatResponses; } Mat getClassLabels() const CV_OVERRIDE { return classLabels; } From cecc19381f958857acbc889dd23a6d883ccec3d4 Mon Sep 17 00:00:00 2001 From: Kuang Fangjun Date: Mon, 20 Aug 2018 15:49:35 +0800 Subject: [PATCH 15/17] fix an error in the formula for cv::cornerSubPix --- modules/imgproc/include/opencv2/imgproc.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index ba1ae660ea..414c55dcc6 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -1853,7 +1853,7 @@ where \f${DI_{p_i}}\f$ is an image gradient at one of the points \f$p_i\f$ in a value of \f$q\f$ is to be found so that \f$\epsilon_i\f$ is minimized. A system of equations may be set up with \f$\epsilon_i\f$ set to zero: -\f[\sum _i(DI_{p_i} \cdot {DI_{p_i}}^T) - \sum _i(DI_{p_i} \cdot {DI_{p_i}}^T \cdot p_i)\f] +\f[\sum _i(DI_{p_i} \cdot {DI_{p_i}}^T) \cdot q - \sum _i(DI_{p_i} \cdot {DI_{p_i}}^T \cdot p_i)\f] where the gradients are summed within a neighborhood ("search window") of \f$q\f$ . Calling the first gradient term \f$G\f$ and the second gradient term \f$b\f$ gives: From ab8ba047a5e4028619628f8b57f876e763585b5e Mon Sep 17 00:00:00 2001 From: Kuang Fangjun Date: Mon, 20 Aug 2018 15:52:18 +0800 Subject: [PATCH 16/17] fix a typo. --- modules/imgproc/include/opencv2/imgproc.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index ba1ae660ea..c4e0844e47 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -1867,7 +1867,7 @@ until the center stays within a set threshold. @param corners Initial coordinates of the input corners and refined coordinates provided for output. @param winSize Half of the side length of the search window. For example, if winSize=Size(5,5) , -then a \f$5*2+1 \times 5*2+1 = 11 \times 11\f$ search window is used. +then a \f$(5*2+1) \times (5*2+1) = 11 \times 11\f$ search window is used. @param zeroZone Half of the size of the dead region in the middle of the search zone over which the summation in the formula below is not done. It is used sometimes to avoid possible singularities of the autocorrelation matrix. The value of (-1,-1) indicates that there is no such From 378cf2ab6328af81e14c7b9b8af37a8933c0088e Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Mon, 20 Aug 2018 17:16:54 +0300 Subject: [PATCH 17/17] fixed filename slash processing --- modules/core/src/trace.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/core/src/trace.cpp b/modules/core/src/trace.cpp index dc15bd31d2..f72a909b01 100644 --- a/modules/core/src/trace.cpp +++ b/modules/core/src/trace.cpp @@ -801,10 +801,12 @@ TraceStorage* TraceManagerThreadLocal::getStorage() const const char* pos = strrchr(filepath.c_str(), '/'); // extract filename #ifdef _WIN32 if (!pos) - strrchr(filepath.c_str(), '\\'); + pos = strrchr(filepath.c_str(), '\\'); #endif if (!pos) pos = filepath.c_str(); + else + pos += 1; // fix to skip extra slash in filename beginning msg.printf("#thread file: %s\n", pos); global->put(msg); storage.reset(new AsyncTraceStorage(filepath));