-
Notifications
You must be signed in to change notification settings - Fork 9
/
correlation.cpp
110 lines (103 loc) · 3.17 KB
/
correlation.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "correlation.h"
#include "fft_functions.h"
cv::Mat gaussianCorrelation(cv::Mat& x1, cv::Mat& x2, int h, int w, int channel, float sigma) {
cv::Mat xy = cv::Mat(cv::Size(w, h), CV_32F, cv::Scalar(0));
cv::Mat xy_temp;
cv::Mat x;
cv::Mat y;
float xx=0, yy=0;
float N = h * w;
for (int i = 0; i < channel; i++) {
x = x1.row(i).reshape(1, h); // Procedure do deal with cv::Mat multichannel bug
y = x2.row(i).reshape(1, h);
xx +=cv::norm(x)*cv::norm(x) ;
yy += cv::norm(y)*cv::norm(y) ;
cv::mulSpectrums(fftd(x), fftd(y), xy_temp, 0, true);
xy_temp = fftd(xy_temp, true);
//rearrange(xy_temp); //rearange or not? Doesn't matter
xy_temp.convertTo(xy_temp, CV_32F);
xy += xy_temp;
}
cv::Mat d;
cv::max(((xx + yy) - 2. * xy) / (w * h * channel), 0, d);
cv::Mat k;
cv::exp((-d / (sigma * sigma)), k);
return fftd(k);
//cv::Mat c = cv::Mat(cv::Size(w,h), CV_32F, cv::Scalar(0));
//cv::Mat caux;
//cv::Mat x1aux;
//cv::Mat x2aux;
//for (int i = 0; i < channel; i++) {
// x1aux = x1.row(i); // Procedure do deal with cv::Mat multichannel bug
// x1aux = x1aux.reshape(1, h);
// x2aux = x2.row(i).reshape(1, h);
// cv::mulSpectrums(fftd(x1aux), fftd(x2aux), caux, 0, true);
// caux = fftd(caux, true);
// rearrange(caux);
// caux.convertTo(caux, CV_32F);
// c = c + real(caux);
//}
//
//cv::Mat d;
//cv::max(((cv::sum(x1.mul(x1))[0] + cv::sum(x2.mul(x2))[0]) - 2. * c) / (h*w*channel), 0, d);
//cv::Mat k;
//cv::exp((-d / (sigma * sigma)), k);
//return fftd(k);
}
cv::Mat linearCorrelation(cv::Mat& x1, cv::Mat& x2, int h, int w, int channel) {
cv::Mat xy = cv::Mat(cv::Size(w, h), CV_32FC2, cv::Scalar(0));
cv::Mat xy_temp;
cv::Mat x;
cv::Mat y;
for (int i = 0; i < channel; i++) {
x = x1.row(i).reshape(1, h);;
y = x2.row(i).reshape(1, h);
cv::mulSpectrums(fftd(x), fftd(y), xy_temp, 0, true);
xy = xy + xy_temp;
}
xy.convertTo(xy, CV_32F);
return xy / (h*w*channel);
}
cv::Mat polynomialCorrelation(cv::Mat& x1, cv::Mat& x2, int h, int w, int channel) {
cv::Mat xy = cv::Mat(cv::Size(w, h), CV_32F, cv::Scalar(0));
cv::Mat xy_temp;
cv::Mat x;
cv::Mat y;
for (int i = 0; i < channel; i++) {
x = x1.row(i).reshape(1, h);;
y = x2.row(i).reshape(1, h);
cv::mulSpectrums(fftd(x), fftd(y), xy_temp, 0, true);
//rearrange(caux); //rearange or not?
//caux.convertTo(caux, CV_32F);
xy_temp = fftd(xy_temp, true);
xy_temp.convertTo(xy_temp, CV_32F);
xy = xy + xy_temp;
}
cv::Mat k;
cv::pow(xy / (h*w*channel) + 1, 9, k); //polynomal
return fftd(k);
}
cv::Mat phaseCorrelation(cv::Mat& x1, cv::Mat& x2, int h, int w, int channel) {
cv::Mat xy = cv::Mat(h, w, CV_32FC2, cv::Scalar(0));
cv::Mat xy_temp;
cv::Mat x;
cv::Mat y;
cv::Mat d;
cv::Mat d2;
for (int i = 0; i < channel; i++) {
x = x1.row(i).reshape(1, h);;
y = x2.row(i).reshape(1, h);
cv::mulSpectrums(fftd(y), fftd(x), xy_temp, 0, true);
cv::mulSpectrums(xy_temp, xy_temp, d, 0, true);
cv::sqrt(real(d), d);
d += 2.2204e-16;
//d = complexDivision(xy_temp, d);
vector<cv::Mat> planes = { d,d };
cv::merge(planes, d2);
cv::divide(xy_temp, d2, xy_temp);
//xy_temp = complexDivision(xy_temp, d2);
xy_temp.convertTo(xy_temp, CV_32F);
xy += xy_temp;
}
return xy;
}