예제 #1
0
// 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");
}
예제 #2
0
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);
    }

}
예제 #4
0
// 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);
    }
}
예제 #5
0
// 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);

}