// Encoder EncoderPhaseShiftMicro::EncoderPhaseShiftMicro(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir) : Encoder(_screenCols, _screenRows, _dir){ // Set N N = F+2; // Precompute encoded patterns const float pi = M_PI; // Main frequency encoding patterns for(unsigned int i=0; i<3; i++){ float phase = -2.0*pi/3.0 * i; float pitch = frequencies[0]; cv::Mat patternI(1,1,CV_8U); patternI = pstools::computePhaseVector(screenCols, phase, pitch); patternI = patternI.t(); patterns.push_back(patternI); } // Additional frequency patterns for(unsigned int i=1; i<F; i++){ float phase = 0.0; if(i%2) phase = pi; float pitch = frequencies[i]; cv::Mat patternI; patternI = pstools::computePhaseVector(screenCols, phase, pitch); patternI = patternI.t(); patterns.push_back(patternI); } cvtools::writeMat(patterns[8], "patterns8.mat"); }
EncoderPhaseShift2x3::EncoderPhaseShift2x3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir) : Encoder(_screenCols, _screenRows, _dir){ // Set N if(dir == CodecDirBoth) N = 12; else N = 6; // Precompute encoded patterns const float pi = M_PI; if(dir & CodecDirHorizontal){ // Horizontally encoding patterns for(unsigned int i=0; i<3; i++){ float phase = 2.0*pi/3.0 * i; float pitch = (float)screenCols/(float)nPhases; cv::Mat patternI(1,1,CV_8U); patternI = pstools::computePhaseVector(screenCols, phase, pitch); patternI = patternI.t(); patterns.push_back(patternI); } // Phase cue patterns for(unsigned int i=0; i<3; i++){ float phase = 2.0*pi/3.0 * i; float pitch = screenCols; cv::Mat patternI; patternI = pstools::computePhaseVector(screenCols, phase, pitch); patternI = patternI.t(); patterns.push_back(patternI); } } if(dir & CodecDirVertical){ // Precompute vertically encoding patterns for(unsigned int i=0; i<3; i++){ float phase = 2.0*pi/3.0 * i; float pitch = (float)screenRows/(float)nPhases; cv::Mat patternI; patternI = pstools::computePhaseVector(screenRows, phase, pitch); patterns.push_back(patternI); } // Precompute vertically phase cue patterns for(unsigned int i=0; i<3; i++){ float phase = 2.0*pi/3.0 * i; float pitch = screenRows; cv::Mat patternI; patternI = pstools::computePhaseVector(screenRows, phase, pitch); patterns.push_back(patternI); } } }
EncoderPhaseShiftDescatter::EncoderPhaseShiftDescatter(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir) : Encoder(_screenCols, _screenRows, _dir){ // Set N N = 6; // Precompute encoded patterns const float pi = M_PI; // Horizontally encoding patterns for(unsigned int i=0; i<3; i++){ float phase = 2.0*pi/3.0 * i; float pitch = (float)screenCols/(float)nPhases; cv::Mat patternI(screenRows,screenCols,CV_8UC3); for(unsigned int r=0; r<screenRows; r++){ for(unsigned int c=0; c<screenCols; c++){ float amp = 0.5 + 0.5*cos(2*pi*c/pitch - phase)*cos(2*pi*r/200 - phase); patternI.at<cv::Vec3b>(r, c) = cv::Vec3b(255.0*amp,255.0*amp,255.0*amp); } } patternI = patternI; patterns.push_back(patternI); } // Phase cue patterns for(unsigned int i=0; i<3; i++){ float phase = 2.0*pi/3.0 * i; float pitch = screenCols; cv::Mat patternI; patternI = pstools::computePhaseVector(screenCols, phase, pitch); patternI = patternI.t(); patterns.push_back(patternI); } }
// Encoder EncoderPhaseShift3::EncoderPhaseShift3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir) : Encoder(_screenCols, _screenRows, _dir){ // Set N N = 3; // Precompute encoded patterns const float pi = M_PI; for(unsigned int i=0; i<N; i++){ float phase = 2.0*pi/float(N) * i; float pitch = screenCols; // cv::Mat patternI = pstools::computePhaseVector(screenCols, phase, pitch); // Loop through vector cv::Mat phaseVector(screenCols, 1, CV_32F); for(int i=0; i<phaseVector.rows; i++){ // Amplitude of channels float amp = 0.5*(1+cos(2*pi*i/pitch - phase)); phaseVector.at<float>(i, 0) = amp; } phaseVector = phaseVector.t(); // Repeat pattern phaseVector = cv::repeat(phaseVector, screenRows, 1); // Add noise cv::Mat noise(phaseVector.size(), CV_32F); cv::randn(noise, 0.0, 0.05); phaseVector += noise; phaseVector.convertTo(phaseVector, CV_8U, 255.0); // Repeat texture cv::Mat patternI(screenRows, screenCols, CV_8UC3); cv::cvtColor(phaseVector, patternI, cv::COLOR_GRAY2RGB); patterns.push_back(patternI); } }
// Encoder EncoderFastRatio::EncoderFastRatio(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir) : Encoder(_screenCols, _screenRows, _dir){ // Set N N = 3; // Low cv::Mat patternI(1, 1, CV_8UC3); patternI.setTo(0.5*255); patterns.push_back(patternI.clone()); // High patternI.setTo(255); patterns.push_back(patternI); // Linear Phase patternI = cv::Mat(1, screenCols, CV_8UC3); for(int i=0; i<screenCols; i++){ // Amplitude of channels float amp = i*(255.0/(float)(screenCols-1)); patternI.at<cv::Vec3b>(0, i) = cv::Vec3b(amp, amp, amp); } patterns.push_back(patternI); }