5
5
6
6
namespace SLS {
7
7
8
- ReconstructorCPU::~ReconstructorCPU () { delete projector_; }
9
- void ReconstructorCPU::initBuckets ()
10
- {
11
- size_t x, y;
12
- projector_->getSize (x, y);
13
- buckets_.resize (processors_.size ());
14
- for (auto &b : buckets_) b.resize (x * y);
15
- generateBuckets ();
16
- }
17
-
18
- void ReconstructorCPU::addImageProcessor (ImageProcessor *processor) { processors_.push_back (processor); }
19
- void ReconstructorCPU::generateBuckets ()
20
- {
21
- // Generating reconstruction bucket for each camera
22
- for (size_t camIdx = 0 ; camIdx < processors_.size (); camIdx++) {
23
- const auto &cam = processors_[camIdx];
24
- LOG::writeLog (" Generating reconstruction bucket for \" %s\" ... \n " ,
25
- cam->getName ().c_str ());
26
-
27
- cam->computeShadowsAndThresholds ();
28
-
29
- size_t x = 0 , y = 0 , xTimesY = 0 ;
30
- cam->getResolution (x, y);
31
- xTimesY = x * y;
32
-
33
- // For each camera pixel
34
- for (size_t i = 0 ; i < xTimesY; i++) {
35
- if (!cam->queryMask (i)) // No need to process if in shadow
36
- continue ;
37
-
38
- // First two frames are lit and dark frame
39
- // not considered
40
- cam->getNextFrame ();
41
- cam->getNextFrame (); // skip first two frames
42
-
43
- Dynamic_Bitset bits (projector_->getRequiredNumFrames ());
44
-
45
- bool discard = false ;
46
-
47
- // for each frame
48
- for (int bitIdx = projector_->getRequiredNumFrames () - 1 ;
49
- bitIdx >= 0 ; bitIdx--) {
50
- auto frame = cam->getNextFrame ();
51
- auto invFrame = cam->getNextFrame ();
52
- unsigned char pixel = frame.at <uchar>(i % y, i / y);
53
- unsigned char invPixel = invFrame.at <uchar>(i % y, i / y);
54
-
55
- // Not considering shadow mask. But the following test should be
56
- // more strict than shadow mask.
57
- if (invPixel > pixel &&
58
- invPixel - pixel >=
59
- ((ImageFileProcessor *)cam)->getWhiteThreshold (i)) {
60
- // No need to do anything since the array is initialized as
61
- // all zeros
62
- bits.clearBit ((size_t )bitIdx);
63
- continue ;
64
- }
65
- else if (pixel > invPixel &&
66
- pixel - invPixel >
67
- ((ImageFileProcessor *)cam)->getWhiteThreshold (i)) {
68
- bits.setBit ((size_t )bitIdx);
69
- }
70
- else {
71
- cam->clearMask (i);
72
- discard = true ;
73
- continue ;
74
- }
75
- } // end for each frame
76
-
77
- // if the pixel is valid, add to bucket.
78
- if (!discard) {
79
- auto vec2Idx = bits.to_uint_gray ();
80
- if (projector_->getWidth () > vec2Idx.x &&
81
- vec2Idx.y < projector_->getHeight ()) {
82
- buckets_[camIdx]
83
- [vec2Idx.x * projector_->getHeight () + vec2Idx.y ]
84
- .push_back (i);
85
- }
86
- }
87
- }
88
- }
89
- }
90
-
91
8
std::array<glm::vec3, 2 > ReconstructorCPU::intersectionOfBucket_ (
92
- size_t firstCameraIdx, size_t secondCameraIdx, size_t bucketIdx )
9
+ const Bucket& firstBucket, const Bucket& secondBucket )
93
10
{
94
- const std::vector<size_t > &firstBucket =
95
- buckets_[firstCameraIdx][bucketIdx];
96
- const std::vector<size_t > &secondBucket =
97
- buckets_[secondCameraIdx][bucketIdx];
98
11
// for each camera pixels in two buckets
99
12
size_t pointCount = 0 ;
100
13
glm::vec3 averagePosition (0.0 );
101
14
glm::vec3 averageColor (0.0 );
102
- for (const auto &cam0P : firstBucket)
103
- for (const auto &cam1P : secondBucket) {
15
+ for (const auto &ray0 : firstBucket)
16
+ for (const auto &ray1 : secondBucket) {
104
17
float dist = -1 .0f ;
105
- glm::vec4 midP =
106
- midPoint (processors_[firstCameraIdx]->getRay (cam0P),
107
- processors_[secondCameraIdx]->getRay (cam1P), dist);
18
+ glm::vec4 midP = midPoint (ray0, ray1, dist);
108
19
if (dist > 0.0 ) {
109
20
pointCount++;
110
21
averagePosition += glm::vec3 (midP);
111
- averageColor += (processors_[firstCameraIdx]->getColor (cam0P) +
112
- processors_[secondCameraIdx]->getColor (cam1P)) /
113
- 2 .0f ;
22
+ averageColor += (ray0.color + ray1.color ) / 2 .0f ;
114
23
}
115
24
}
116
25
if (pointCount != 0 )
@@ -121,88 +30,38 @@ std::array<glm::vec3, 2> ReconstructorCPU::intersectionOfBucket_(
121
30
}
122
31
123
32
std::array<glm::vec3, 2 > ReconstructorCPU::intersectionOfBucketMinDist_ (
124
- size_t firstCameraIdx, size_t secondCameraIdx, size_t bucketIdx )
33
+ const Bucket &firstBucket, const Bucket &secondBucket )
125
34
{
126
- const std::vector<size_t > &firstBucket =
127
- buckets_[firstCameraIdx][bucketIdx];
128
- const std::vector<size_t > &secondBucket =
129
- buckets_[secondCameraIdx][bucketIdx];
130
35
// for each camera pixels in two buckets
131
36
glm::vec3 minPosition (0.0 );
132
37
glm::vec3 minColor (0.0 );
133
38
float minDist = std::numeric_limits<float >::max ();
134
- for (const auto &cam0P : firstBucket)
135
- for (const auto &cam1P : secondBucket) {
39
+ for (const auto &ray0 : firstBucket)
40
+ for (const auto &ray1 : secondBucket) {
136
41
float dist = -1 .0f ;
137
- glm::vec4 midP =
138
- midPoint (processors_[firstCameraIdx]->getRay (cam0P),
139
- processors_[secondCameraIdx]->getRay (cam1P), dist);
42
+ glm::vec4 midP = midPoint (ray0, ray1, dist);
140
43
if (dist > 0.0 && dist < minDist) {
141
44
minDist = dist;
142
45
minPosition = glm::vec3 (midP);
143
- minColor = (processors_[firstCameraIdx]->getColor (cam0P) +
144
- processors_[secondCameraIdx]->getColor (cam1P)) /
145
- 2 .0f ;
46
+ minColor = (ray0.color + ray1.color / 2 .0f );
146
47
}
147
48
}
148
49
return std::array<glm::vec3, 2 >{minPosition, minColor};
149
50
}
150
- PointCloud ReconstructorCPU::reconstruct ()
51
+
52
+ PointCloud ReconstructorCPU::reconstruct (
53
+ const std::vector<Buckets>& multiBuckets)
151
54
{
152
55
PointCloud res;
153
- size_t x, y;
154
- // Assumes all of the cameras has the same resolution
155
- processors_[0 ]->getResolution (x, y);
156
- initBuckets ();
157
56
LOG::startTimer ();
158
- for (size_t i = 0 ; i < buckets_[0 ].size (); i++) {
159
- std::array<glm::vec3, 2 > point = intersectionOfBucket_ (0 , 1 , i);
57
+ for (size_t i = 0 ; i < multiBuckets[0 ].size (); i++) {
58
+ std::array<glm::vec3, 2 > point =
59
+ intersectionOfBucket_ (multiBuckets[0 ][i], multiBuckets[1 ][i]);
160
60
if (glm::all (glm::equal (point[0 ], glm::vec3 (0.0 ))) &&
161
61
glm::all (glm::equal (point[1 ], glm::vec3 (0.0 ))))
162
62
continue ;
163
63
else
164
64
res.pushPoint (point[0 ], point[1 ]);
165
-
166
- /*
167
- const auto &cam0bucket = buckets_[0][i];
168
- const auto &cam1bucket = buckets_[1][i];
169
- size_t minCam0Idx = 0;
170
- size_t minCam1Idx = 0;
171
-
172
- // When non of the buckets are empty
173
- if ((!cam0bucket.empty()) && (!cam1bucket.empty())) {
174
- float minDist = std::numeric_limits<float>::max();
175
- glm::vec4 minMidP(0.0f);
176
-
177
- float ptCount = 0.0;
178
- glm::vec4 midPointAvg(0.0f);
179
-
180
- for (const auto &cam0P : cam0bucket)
181
- for (const auto &cam1P : cam1bucket) {
182
- float dist = -1.0f;
183
-
184
- auto midP = midPoint(processors_[0]->getRay(cam0P),
185
- processors_[1]->getRay(cam1P), dist);
186
- if (dist > 0.0) // if dist is valid
187
- {
188
- ptCount += 1.0;
189
- midPointAvg += midP;
190
- if (dist < minDist) {
191
- minDist = dist;
192
- minMidP = midP;
193
- minCam0Idx = cam0P;
194
- minCam1Idx = cam1P;
195
- }
196
- }
197
- }
198
- midPointAvg = midPointAvg / ptCount;
199
- {
200
- auto color0 = processors_[0]->getColor(minCam0Idx);
201
- auto color1 = processors_[1]->getColor(minCam1Idx);
202
- res.pushPoint(glm::vec3(midPointAvg), (color0 + color1) / 2.0f);
203
- }
204
- }
205
- */
206
65
}
207
66
LOG::endTimer (" Finished reconstruction in " );
208
67
return res;
0 commit comments