Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/shape/src/hist_cost.cpp
16337 views
1
/*M///////////////////////////////////////////////////////////////////////////////////////
2
//
3
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4
//
5
// By downloading, copying, installing or using the software you agree to this license.
6
// If you do not agree to this license, do not download, install,
7
// copy or use the software.
8
//
9
//
10
// Intel License Agreement
11
// For Open Source Computer Vision Library
12
//
13
// Copyright (C) 2000, Intel Corporation, all rights reserved.
14
// Third party copyrights are property of their respective owners.
15
//
16
// Redistribution and use in source and binary forms, with or without modification,
17
// are permitted provided that the following conditions are met:
18
//
19
// * Redistribution's of source code must retain the above copyright notice,
20
// this list of conditions and the following disclaimer.
21
//
22
// * Redistribution's in binary form must reproduce the above copyright notice,
23
// this list of conditions and the following disclaimer in the documentation
24
// and/or other materials provided with the distribution.
25
//
26
// * The name of Intel Corporation may not be used to endorse or promote products
27
// derived from this software without specific prior written permission.
28
//
29
// This software is provided by the copyright holders and contributors "as is" and
30
// any express or implied warranties, including, but not limited to, the implied
31
// warranties of merchantability and fitness for a particular purpose are disclaimed.
32
// In no event shall the Intel Corporation or contributors be liable for any direct,
33
// indirect, incidental, special, exemplary, or consequential damages
34
// (including, but not limited to, procurement of substitute goods or services;
35
// loss of use, data, or profits; or business interruption) however caused
36
// and on any theory of liability, whether in contract, strict liability,
37
// or tort (including negligence or otherwise) arising in any way out of
38
// the use of this software, even if advised of the possibility of such damage.
39
//
40
//M*/
41
42
#include "precomp.hpp"
43
44
namespace cv
45
{
46
47
/*! */
48
class NormHistogramCostExtractorImpl CV_FINAL : public NormHistogramCostExtractor
49
{
50
public:
51
/* Constructors */
52
NormHistogramCostExtractorImpl(int _flag, int _nDummies, float _defaultCost)
53
{
54
flag=_flag;
55
nDummies=_nDummies;
56
defaultCost=_defaultCost;
57
name_ = "HistogramCostExtractor.NOR";
58
}
59
60
/* Destructor */
61
~NormHistogramCostExtractorImpl() CV_OVERRIDE
62
{
63
}
64
65
//! the main operator
66
virtual void buildCostMatrix(InputArray descriptors1, InputArray descriptors2, OutputArray costMatrix) CV_OVERRIDE;
67
68
//! Setters/Getters
69
void setNDummies(int _nDummies) CV_OVERRIDE
70
{
71
nDummies=_nDummies;
72
}
73
74
int getNDummies() const CV_OVERRIDE
75
{
76
return nDummies;
77
}
78
79
void setDefaultCost(float _defaultCost) CV_OVERRIDE
80
{
81
defaultCost=_defaultCost;
82
}
83
84
float getDefaultCost() const CV_OVERRIDE
85
{
86
return defaultCost;
87
}
88
89
virtual void setNormFlag(int _flag) CV_OVERRIDE
90
{
91
flag=_flag;
92
}
93
94
virtual int getNormFlag() const CV_OVERRIDE
95
{
96
return flag;
97
}
98
99
//! write/read
100
virtual void write(FileStorage& fs) const CV_OVERRIDE
101
{
102
writeFormat(fs);
103
fs << "name" << name_
104
<< "flag" << flag
105
<< "dummies" << nDummies
106
<< "default" << defaultCost;
107
}
108
109
virtual void read(const FileNode& fn) CV_OVERRIDE
110
{
111
CV_Assert( (String)fn["name"] == name_ );
112
flag = (int)fn["flag"];
113
nDummies = (int)fn["dummies"];
114
defaultCost = (float)fn["default"];
115
}
116
117
private:
118
int flag;
119
int nDummies;
120
float defaultCost;
121
122
protected:
123
String name_;
124
};
125
126
void NormHistogramCostExtractorImpl::buildCostMatrix(InputArray _descriptors1, InputArray _descriptors2, OutputArray _costMatrix)
127
{
128
CV_INSTRUMENT_REGION();
129
130
// size of the costMatrix with dummies //
131
Mat descriptors1=_descriptors1.getMat();
132
Mat descriptors2=_descriptors2.getMat();
133
int costrows = std::max(descriptors1.rows, descriptors2.rows)+nDummies;
134
_costMatrix.create(costrows, costrows, CV_32F);
135
Mat costMatrix=_costMatrix.getMat();
136
137
138
// Obtain copies of the descriptors //
139
cv::Mat scd1 = descriptors1.clone();
140
cv::Mat scd2 = descriptors2.clone();
141
142
// row normalization //
143
for(int i=0; i<scd1.rows; i++)
144
{
145
scd1.row(i)/=(sum(scd1.row(i))[0]+FLT_EPSILON);
146
}
147
for(int i=0; i<scd2.rows; i++)
148
{
149
scd2.row(i)/=(sum(scd2.row(i))[0]+FLT_EPSILON);
150
}
151
152
// Compute the Cost Matrix //
153
for(int i=0; i<costrows; i++)
154
{
155
for(int j=0; j<costrows; j++)
156
{
157
if (i<scd1.rows && j<scd2.rows)
158
{
159
Mat columnDiff = scd1.row(i)-scd2.row(j);
160
costMatrix.at<float>(i,j)=(float)norm(columnDiff, flag);
161
}
162
else
163
{
164
costMatrix.at<float>(i,j)=defaultCost;
165
}
166
}
167
}
168
}
169
170
Ptr <HistogramCostExtractor> createNormHistogramCostExtractor(int flag, int nDummies, float defaultCost)
171
{
172
return Ptr <HistogramCostExtractor>( new NormHistogramCostExtractorImpl(flag, nDummies, defaultCost) );
173
}
174
175
/*! */
176
class EMDHistogramCostExtractorImpl CV_FINAL : public EMDHistogramCostExtractor
177
{
178
public:
179
/* Constructors */
180
EMDHistogramCostExtractorImpl(int _flag, int _nDummies, float _defaultCost)
181
{
182
flag=_flag;
183
nDummies=_nDummies;
184
defaultCost=_defaultCost;
185
name_ = "HistogramCostExtractor.EMD";
186
}
187
188
/* Destructor */
189
~EMDHistogramCostExtractorImpl() CV_OVERRIDE
190
{
191
}
192
193
//! the main operator
194
virtual void buildCostMatrix(InputArray descriptors1, InputArray descriptors2, OutputArray costMatrix) CV_OVERRIDE;
195
196
//! Setters/Getters
197
void setNDummies(int _nDummies) CV_OVERRIDE
198
{
199
nDummies=_nDummies;
200
}
201
202
int getNDummies() const CV_OVERRIDE
203
{
204
return nDummies;
205
}
206
207
void setDefaultCost(float _defaultCost) CV_OVERRIDE
208
{
209
defaultCost=_defaultCost;
210
}
211
212
float getDefaultCost() const CV_OVERRIDE
213
{
214
return defaultCost;
215
}
216
217
virtual void setNormFlag(int _flag) CV_OVERRIDE
218
{
219
flag=_flag;
220
}
221
222
virtual int getNormFlag() const CV_OVERRIDE
223
{
224
return flag;
225
}
226
227
//! write/read
228
virtual void write(FileStorage& fs) const CV_OVERRIDE
229
{
230
writeFormat(fs);
231
fs << "name" << name_
232
<< "flag" << flag
233
<< "dummies" << nDummies
234
<< "default" << defaultCost;
235
}
236
237
virtual void read(const FileNode& fn) CV_OVERRIDE
238
{
239
CV_Assert( (String)fn["name"] == name_ );
240
flag = (int)fn["flag"];
241
nDummies = (int)fn["dummies"];
242
defaultCost = (float)fn["default"];
243
}
244
245
private:
246
int flag;
247
int nDummies;
248
float defaultCost;
249
250
protected:
251
String name_;
252
};
253
254
void EMDHistogramCostExtractorImpl::buildCostMatrix(InputArray _descriptors1, InputArray _descriptors2, OutputArray _costMatrix)
255
{
256
CV_INSTRUMENT_REGION();
257
258
// size of the costMatrix with dummies //
259
Mat descriptors1=_descriptors1.getMat();
260
Mat descriptors2=_descriptors2.getMat();
261
int costrows = std::max(descriptors1.rows, descriptors2.rows)+nDummies;
262
_costMatrix.create(costrows, costrows, CV_32F);
263
Mat costMatrix=_costMatrix.getMat();
264
265
// Obtain copies of the descriptors //
266
cv::Mat scd1=descriptors1.clone();
267
cv::Mat scd2=descriptors2.clone();
268
269
// row normalization //
270
for(int i=0; i<scd1.rows; i++)
271
{
272
cv::Mat row = scd1.row(i);
273
scd1.row(i)/=(sum(row)[0]+FLT_EPSILON);
274
}
275
for(int i=0; i<scd2.rows; i++)
276
{
277
cv::Mat row = scd2.row(i);
278
scd2.row(i)/=(sum(row)[0]+FLT_EPSILON);
279
}
280
281
// Compute the Cost Matrix //
282
for(int i=0; i<costrows; i++)
283
{
284
for(int j=0; j<costrows; j++)
285
{
286
if (i<scd1.rows && j<scd2.rows)
287
{
288
cv::Mat sig1(scd1.cols,2,CV_32F), sig2(scd2.cols,2,CV_32F);
289
sig1.col(0)=scd1.row(i).t();
290
sig2.col(0)=scd2.row(j).t();
291
for (int k=0; k<sig1.rows; k++)
292
{
293
sig1.at<float>(k,1)=float(k);
294
}
295
for (int k=0; k<sig2.rows; k++)
296
{
297
sig2.at<float>(k,1)=float(k);
298
}
299
300
costMatrix.at<float>(i,j) = cv::EMD(sig1, sig2, flag);
301
}
302
else
303
{
304
costMatrix.at<float>(i,j) = defaultCost;
305
}
306
}
307
}
308
}
309
310
Ptr <HistogramCostExtractor> createEMDHistogramCostExtractor(int flag, int nDummies, float defaultCost)
311
{
312
return Ptr <HistogramCostExtractor>( new EMDHistogramCostExtractorImpl(flag, nDummies, defaultCost) );
313
}
314
315
/*! */
316
class ChiHistogramCostExtractorImpl CV_FINAL : public ChiHistogramCostExtractor
317
{
318
public:
319
/* Constructors */
320
ChiHistogramCostExtractorImpl(int _nDummies, float _defaultCost)
321
{
322
name_ = "HistogramCostExtractor.CHI";
323
nDummies=_nDummies;
324
defaultCost=_defaultCost;
325
}
326
327
/* Destructor */
328
~ChiHistogramCostExtractorImpl() CV_OVERRIDE
329
{
330
}
331
332
//! the main operator
333
virtual void buildCostMatrix(InputArray descriptors1, InputArray descriptors2, OutputArray costMatrix) CV_OVERRIDE;
334
335
//! setters / getters
336
void setNDummies(int _nDummies) CV_OVERRIDE
337
{
338
nDummies=_nDummies;
339
}
340
341
int getNDummies() const CV_OVERRIDE
342
{
343
return nDummies;
344
}
345
346
void setDefaultCost(float _defaultCost) CV_OVERRIDE
347
{
348
defaultCost=_defaultCost;
349
}
350
351
float getDefaultCost() const CV_OVERRIDE
352
{
353
return defaultCost;
354
}
355
356
//! write/read
357
virtual void write(FileStorage& fs) const CV_OVERRIDE
358
{
359
writeFormat(fs);
360
fs << "name" << name_
361
<< "dummies" << nDummies
362
<< "default" << defaultCost;
363
}
364
365
virtual void read(const FileNode& fn) CV_OVERRIDE
366
{
367
CV_Assert( (String)fn["name"] == name_ );
368
nDummies = (int)fn["dummies"];
369
defaultCost = (float)fn["default"];
370
}
371
372
protected:
373
String name_;
374
int nDummies;
375
float defaultCost;
376
};
377
378
void ChiHistogramCostExtractorImpl::buildCostMatrix(InputArray _descriptors1, InputArray _descriptors2, OutputArray _costMatrix)
379
{
380
CV_INSTRUMENT_REGION();
381
382
// size of the costMatrix with dummies //
383
Mat descriptors1=_descriptors1.getMat();
384
Mat descriptors2=_descriptors2.getMat();
385
int costrows = std::max(descriptors1.rows, descriptors2.rows)+nDummies;
386
_costMatrix.create(costrows, costrows, CV_32FC1);
387
Mat costMatrix=_costMatrix.getMat();
388
389
// Obtain copies of the descriptors //
390
cv::Mat scd1=descriptors1.clone();
391
cv::Mat scd2=descriptors2.clone();
392
393
// row normalization //
394
for(int i=0; i<scd1.rows; i++)
395
{
396
cv::Mat row = scd1.row(i);
397
scd1.row(i)/=(sum(row)[0]+FLT_EPSILON);
398
}
399
for(int i=0; i<scd2.rows; i++)
400
{
401
cv::Mat row = scd2.row(i);
402
scd2.row(i)/=(sum(row)[0]+FLT_EPSILON);
403
}
404
405
// Compute the Cost Matrix //
406
for(int i=0; i<costrows; i++)
407
{
408
for(int j=0; j<costrows; j++)
409
{
410
if (i<scd1.rows && j<scd2.rows)
411
{
412
float csum = 0;
413
for(int k=0; k<scd2.cols; k++)
414
{
415
float resta=scd1.at<float>(i,k)-scd2.at<float>(j,k);
416
float suma=scd1.at<float>(i,k)+scd2.at<float>(j,k);
417
csum += resta*resta/(FLT_EPSILON+suma);
418
}
419
costMatrix.at<float>(i,j)=csum/2;
420
}
421
else
422
{
423
costMatrix.at<float>(i,j)=defaultCost;
424
}
425
}
426
}
427
}
428
429
Ptr <HistogramCostExtractor> createChiHistogramCostExtractor(int nDummies, float defaultCost)
430
{
431
return Ptr <HistogramCostExtractor>( new ChiHistogramCostExtractorImpl(nDummies, defaultCost) );
432
}
433
434
/*! */
435
class EMDL1HistogramCostExtractorImpl CV_FINAL : public EMDL1HistogramCostExtractor
436
{
437
public:
438
/* Constructors */
439
EMDL1HistogramCostExtractorImpl(int _nDummies, float _defaultCost)
440
{
441
name_ = "HistogramCostExtractor.CHI";
442
nDummies=_nDummies;
443
defaultCost=_defaultCost;
444
}
445
446
/* Destructor */
447
~EMDL1HistogramCostExtractorImpl() CV_OVERRIDE
448
{
449
}
450
451
//! the main operator
452
virtual void buildCostMatrix(InputArray descriptors1, InputArray descriptors2, OutputArray costMatrix) CV_OVERRIDE;
453
454
//! setters / getters
455
void setNDummies(int _nDummies) CV_OVERRIDE
456
{
457
nDummies=_nDummies;
458
}
459
460
int getNDummies() const CV_OVERRIDE
461
{
462
return nDummies;
463
}
464
465
void setDefaultCost(float _defaultCost) CV_OVERRIDE
466
{
467
defaultCost=_defaultCost;
468
}
469
470
float getDefaultCost() const CV_OVERRIDE
471
{
472
return defaultCost;
473
}
474
475
//! write/read
476
virtual void write(FileStorage& fs) const CV_OVERRIDE
477
{
478
writeFormat(fs);
479
fs << "name" << name_
480
<< "dummies" << nDummies
481
<< "default" << defaultCost;
482
}
483
484
virtual void read(const FileNode& fn) CV_OVERRIDE
485
{
486
CV_Assert( (String)fn["name"] == name_ );
487
nDummies = (int)fn["dummies"];
488
defaultCost = (float)fn["default"];
489
}
490
491
protected:
492
String name_;
493
int nDummies;
494
float defaultCost;
495
};
496
497
void EMDL1HistogramCostExtractorImpl::buildCostMatrix(InputArray _descriptors1, InputArray _descriptors2, OutputArray _costMatrix)
498
{
499
CV_INSTRUMENT_REGION();
500
501
// size of the costMatrix with dummies //
502
Mat descriptors1=_descriptors1.getMat();
503
Mat descriptors2=_descriptors2.getMat();
504
int costrows = std::max(descriptors1.rows, descriptors2.rows)+nDummies;
505
_costMatrix.create(costrows, costrows, CV_32F);
506
Mat costMatrix=_costMatrix.getMat();
507
508
// Obtain copies of the descriptors //
509
cv::Mat scd1=descriptors1.clone();
510
cv::Mat scd2=descriptors2.clone();
511
512
// row normalization //
513
for(int i=0; i<scd1.rows; i++)
514
{
515
cv::Mat row = scd1.row(i);
516
scd1.row(i)/=(sum(row)[0]+FLT_EPSILON);
517
}
518
for(int i=0; i<scd2.rows; i++)
519
{
520
cv::Mat row = scd2.row(i);
521
scd2.row(i)/=(sum(row)[0]+FLT_EPSILON);
522
}
523
524
// Compute the Cost Matrix //
525
for(int i=0; i<costrows; i++)
526
{
527
for(int j=0; j<costrows; j++)
528
{
529
if (i<scd1.rows && j<scd2.rows)
530
{
531
cv::Mat sig1(scd1.cols,1,CV_32F), sig2(scd2.cols,1,CV_32F);
532
sig1.col(0)=scd1.row(i).t();
533
sig2.col(0)=scd2.row(j).t();
534
costMatrix.at<float>(i,j) = cv::EMDL1(sig1, sig2);
535
}
536
else
537
{
538
costMatrix.at<float>(i,j) = defaultCost;
539
}
540
}
541
}
542
}
543
544
Ptr <HistogramCostExtractor> createEMDL1HistogramCostExtractor(int nDummies, float defaultCost)
545
{
546
return Ptr <HistogramCostExtractor>( new EMDL1HistogramCostExtractorImpl(nDummies, defaultCost) );
547
}
548
549
} // cv
550
551