Line 93... |
Line 93... |
93 |
}
|
93 |
}
|
94 |
|
94 |
|
95 |
// Algorithm
|
95 |
// Algorithm
|
96 |
AlgorithmGrayCode::AlgorithmGrayCode(unsigned int _screenCols, unsigned int _screenRows) : Algorithm(_screenCols, _screenRows){
|
96 |
AlgorithmGrayCode::AlgorithmGrayCode(unsigned int _screenCols, unsigned int _screenRows) : Algorithm(_screenCols, _screenRows){
|
97 |
|
97 |
|
98 |
Nbits = ceilf(log2f((float)screenCols));
|
98 |
Nbits = ceilf(log2f((float)screenCols)) - 1;
|
99 |
N = 2 + Nbits*2;
|
99 |
N = 2 + Nbits*2;
|
100 |
|
100 |
|
101 |
// all on pattern
|
101 |
// all on pattern
|
102 |
cv::Mat allOn(1, screenCols, CV_8UC3, cv::Scalar::all(255));
|
102 |
cv::Mat allOn(1, screenCols, CV_8UC3, cv::Scalar::all(255));
|
103 |
patterns.push_back(allOn);
|
103 |
patterns.push_back(allOn);
|
Line 114... |
Line 114... |
114 |
|
114 |
|
115 |
for(unsigned int j=0; j<screenCols; j++){
|
115 |
for(unsigned int j=0; j<screenCols; j++){
|
116 |
|
116 |
|
117 |
unsigned int jGray = binaryToGray(j);
|
117 |
unsigned int jGray = binaryToGray(j);
|
118 |
// Amplitude of channels
|
118 |
// Amplitude of channels
|
119 |
int bit = (int)getBit(jGray, Nbits-p);
|
119 |
int bit = (int)getBit(jGray, Nbits-p+1);
|
120 |
pattern.at<cv::Vec3b>(0,j) = cv::Vec3b(255.0*bit,255.0*bit,255.0*bit);
|
120 |
pattern.at<cv::Vec3b>(0,j) = cv::Vec3b(255.0*bit,255.0*bit,255.0*bit);
|
121 |
int invBit = bit^1;
|
121 |
int invBit = bit^1;
|
122 |
patternInv.at<cv::Vec3b>(0,j) = cv::Vec3b(255.0*invBit,255.0*invBit,255.0*invBit);
|
122 |
patternInv.at<cv::Vec3b>(0,j) = cv::Vec3b(255.0*invBit,255.0*invBit,255.0*invBit);
|
123 |
}
|
123 |
}
|
124 |
patterns.push_back(pattern);
|
124 |
patterns.push_back(pattern);
|
Line 265... |
Line 265... |
265 |
//cvtools::writeMat(frames0Rect[21], "frames0Rect_21.mat", "frames0Rect_21");
|
265 |
//cvtools::writeMat(frames0Rect[21], "frames0Rect_21.mat", "frames0Rect_21");
|
266 |
|
266 |
|
267 |
// occlusion masks
|
267 |
// occlusion masks
|
268 |
cv::Mat occlusion0Rect, occlusion1Rect;
|
268 |
cv::Mat occlusion0Rect, occlusion1Rect;
|
269 |
cv::subtract(frames0Rect[0], frames0Rect[1], occlusion0Rect);
|
269 |
cv::subtract(frames0Rect[0], frames0Rect[1], occlusion0Rect);
|
270 |
occlusion0Rect = (occlusion0Rect > 20) & (occlusion0Rect < 250);
|
270 |
occlusion0Rect = (occlusion0Rect > 10) & (occlusion0Rect < 250);
|
271 |
cv::subtract(frames1Rect[0], frames1Rect[1], occlusion1Rect);
|
271 |
cv::subtract(frames1Rect[0], frames1Rect[1], occlusion1Rect);
|
272 |
occlusion1Rect = (occlusion1Rect > 20) & (occlusion1Rect < 250);
|
272 |
occlusion1Rect = (occlusion1Rect > 10) & (occlusion1Rect < 250);
|
273 |
|
273 |
|
274 |
// erode occlusion masks
|
274 |
// erode occlusion masks
|
275 |
cv::Mat strel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2,2));
|
275 |
cv::Mat strel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2,2));
|
276 |
cv::erode(occlusion0Rect, occlusion0Rect, strel);
|
276 |
cv::erode(occlusion0Rect, occlusion0Rect, strel);
|
277 |
cv::erode(occlusion1Rect, occlusion1Rect, strel);
|
277 |
cv::erode(occlusion1Rect, occlusion1Rect, strel);
|
Line 292... |
Line 292... |
292 |
// cv::add(frames0Rect[i], E, frames0Rect[i], cv::noArray(), CV_16UC1);
|
292 |
// cv::add(frames0Rect[i], E, frames0Rect[i], cv::noArray(), CV_16UC1);
|
293 |
// cv::add(frames0Rect[i+1], E, frames0Rect[i+1], cv::noArray(), CV_16UC1);
|
293 |
// cv::add(frames0Rect[i+1], E, frames0Rect[i+1], cv::noArray(), CV_16UC1);
|
294 |
// }
|
294 |
// }
|
295 |
|
295 |
|
296 |
|
296 |
|
297 |
// correct for texture modulation and ambient
|
297 |
// // correct for texture modulation and ambient
|
298 |
cv::Mat A0 = frames0Rect[1];
|
298 |
// cv::Mat A0 = frames0Rect[1];
|
299 |
cv::Mat M0 = frames0Rect[0]-frames0Rect[1];
|
299 |
// cv::Mat M0 = frames0Rect[0]-frames0Rect[1];
|
300 |
//cvtools::writeMat(A0, "A0.mat", "A0");
|
300 |
////cvtools::writeMat(A0, "A0.mat", "A0");
|
301 |
//cvtools::writeMat(M0, "M0.mat", "M0");
|
301 |
////cvtools::writeMat(M0, "M0.mat", "M0");
|
302 |
//cvtools::writeMat(frames0Rect[20], "frames0Rect_20.mat", "frames0Rect_20");
|
302 |
////cvtools::writeMat(frames0Rect[20], "frames0Rect_20.mat", "frames0Rect_20");
|
303 |
//cvtools::writeMat(frames0Rect[21], "frames0Rect_21.mat", "frames0Rect_21");
|
303 |
////cvtools::writeMat(frames0Rect[21], "frames0Rect_21.mat", "frames0Rect_21");
|
304 |
cv::divide(256.0, M0, M0, CV_32F);
|
304 |
// cv::divide(256.0, M0, M0, CV_32F);
|
305 |
cv::Mat A1 = frames1Rect[1];
|
305 |
// cv::Mat A1 = frames1Rect[1];
|
306 |
cv::Mat M1 = frames1Rect[0]-frames1Rect[1];
|
306 |
// cv::Mat M1 = frames1Rect[0]-frames1Rect[1];
|
307 |
cv::divide(256.0, M1, M1, CV_32F);
|
307 |
// cv::divide(256.0, M1, M1, CV_32F);
|
308 |
|
308 |
|
309 |
for(int i=2; i<N; i++){
|
309 |
// for(int i=2; i<N; i++){
|
310 |
cv::multiply(frames0Rect[i]-A0, M0, frames0Rect[i], 1.0, CV_8UC1);
|
310 |
// cv::multiply(frames0Rect[i]-A0, M0, frames0Rect[i], 1.0, CV_8UC1);
|
311 |
cv::multiply(frames1Rect[i]-A1, M1, frames1Rect[i], 1.0, CV_8UC1);
|
311 |
// cv::multiply(frames1Rect[i]-A1, M1, frames1Rect[i], 1.0, CV_8UC1);
|
312 |
}
|
312 |
// }
|
313 |
|
313 |
|
314 |
//cvtools::writeMat(frames0Rect[22], "frames0Rect_22.mat", "frames0Rect_22");
|
314 |
//cvtools::writeMat(frames0Rect[22], "frames0Rect_22.mat", "frames0Rect_22");
|
315 |
//cvtools::writeMat(frames0Rect[23], "frames0Rect_23.mat", "frames0Rect_23");
|
315 |
//cvtools::writeMat(frames0Rect[23], "frames0Rect_23.mat", "frames0Rect_23");
|
316 |
|
316 |
|
317 |
//cvtools::writeMat(occlusion0Rect, "occlusion0Rect.mat", "occlusion0Rect");
|
317 |
//cvtools::writeMat(occlusion0Rect, "occlusion0Rect.mat", "occlusion0Rect");
|