-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMueller.cpp
More file actions
102 lines (83 loc) · 2.86 KB
/
Mueller.cpp
File metadata and controls
102 lines (83 loc) · 2.86 KB
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
#include "Mueller.h"
Mueller::Mueller(vector<Mat> Images, int N, int angle)
{
this->matrix = muellerMatrix(Images, N, angle);
}
vector<vector<Mat>> Mueller::muellerMatrix(vector<Mat> Images, int N, int angle)
{
auto t_start = std::chrono::high_resolution_clock::now();
int h = Images[0].rows;
int w = Images[0].cols;
vector<vector<Mat>> matrix(3);
Mat coslight;
Mat coscamera;
Mat sinlight;
Mat sincamera;
Mat A;
A.create(N*N, 9, CV_32F);
double pi = 3.14159265359;
coslight.create(N * N, 1, CV_32F);
coscamera.create(N * N, 1, CV_32F);
sinlight.create(N * N, 1, CV_32F);
sincamera.create(N * N, 1, CV_32F);
int angleC = 0;
int angleL = 0;
for (int i = 0; i < N * N; i++) {
if (i % N == 0) angleC = 0;
else angleC = (i % N) * angle;
if (i % N == 0 && i != 0) angleL += angle;
coslight.at<float>(i, 0) = cos((angleL) * pi / 90);
coscamera.at<float>(i, 0) = cos((angleC) * pi / 90);
sinlight.at<float>(i, 0) = sin((angleL) * pi / 90);
sincamera.at<float>(i, 0) = sin((angleC) * pi / 90);
}
for (int i = 0; i < N * N; i++) {
A.at<float>(i, 0) = float(1.0);
A.at<float>(i, 1) = coslight.at<float>(i, 0);
A.at<float>(i, 2) = sinlight.at<float>(i, 0);
A.at<float>(i, 3) = coscamera.at<float>(i, 0);
A.at<float>(i, 4) = coscamera.at<float>(i, 0) * coslight.at<float>(i, 0);
A.at<float>(i, 5) = coscamera.at<float>(i, 0) * sinlight.at<float>(i, 0);
A.at<float>(i, 6) = sincamera.at<float>(i, 0);
A.at<float>(i, 7) = sincamera.at<float>(i, 0) * coslight.at<float>(i, 0);
A.at<float>(i, 8) = sincamera.at<float>(i, 0) * sinlight.at<float>(i, 0);
}
Mat At = Mat(9, N*N, A.t().type());
At = A.t();
Mat mult = Mat((At * A).size(), CV_32FC(9));
mult = At * A;
Mat P_inv;
P_inv.create(9, N*N, CV_32F);
invert(mult, P_inv, DECOMP_SVD);
Mat P_inv2;
P_inv2 = P_inv * At;
for (int z = 0; z < 9; z++) {
Mat m;
m.create(h, w, DataType<float>::type);
m = 0;
for (int k = 0; k < h; k++) {
for (int l = 0; l < w; l++) {
for (int i = 0; i < N * N; i++) {
m.at<float>(k, l) = m.at<float>(k, l) + Images[i].at<float>(k, l) * P_inv2.at<float>(z, i);
}
m.at<float>(k, l) = m.at<float>(k, l);
}
}
Mat S0_fin = Mat(h / 4, w / 4, DataType<double>::type);
resize(m, S0_fin, S0_fin.size());
Mat img_color = Mat(S0_fin.size(), CV_8UC3);
for (int k = 0; k < h / 4; k++) {
for (int l = 0; l < w / 4; l++) {
if(S0_fin.at<float>(k, l) > 0) img_color.at<Vec3b>(k, l)[0] = uchar(0);
else img_color.at<Vec3b>(k, l)[0] = uchar(120);
img_color.at<Vec3b>(k, l)[1] = uchar(abs(S0_fin.at<float>(k, l))*255);
img_color.at<Vec3b>(k, l)[2] = uchar(255);
}
}
cvtColor(img_color, img_color, 55);
matrix[floor(z/3)].push_back(img_color);
}
auto t_end = std::chrono::high_resolution_clock::now();
cout << "Mueller: " << std::chrono::duration<double, std::milli>(t_end - t_start).count() << " ms" << endl;
return matrix;
}