Subversion Repositories seema-scanner

Rev

Rev 185 | Rev 192 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 185 Rev 190
Line 18... Line 18...
18
    #define M_PI 3.14159265358979323846
18
    #define M_PI 3.14159265358979323846
19
#endif
19
#endif
20
 
20
 
21
static unsigned int nStepsPrimary = 16; // number of shifts/steps in primary
21
static unsigned int nStepsPrimary = 16; // number of shifts/steps in primary
22
static unsigned int nStepsSecondary = 8; // number of shifts/steps in secondary
22
static unsigned int nStepsSecondary = 8; // number of shifts/steps in secondary
23
static float nPeriodsPrimary = 48; // primary period
23
static float nPeriodsPrimary = 40; // primary period
24
 
24
 
25
AlgorithmPhaseShiftTwoFreq::AlgorithmPhaseShiftTwoFreq(unsigned int _screenCols, unsigned int _screenRows) : Algorithm(_screenCols, _screenRows){
25
AlgorithmPhaseShiftTwoFreq::AlgorithmPhaseShiftTwoFreq(unsigned int _screenCols, unsigned int _screenRows) : Algorithm(_screenCols, _screenRows){
26
 
26
 
27
    // Set N
27
    // Set N
28
    N = 2+nStepsPrimary+nStepsSecondary;
28
    N = 2+nStepsPrimary+nStepsSecondary;
29
 
29
 
30
    // Determine the secondary (wider) period
30
    // Determine the secondary (wider) period to fulfill the heterodyne condition
31
    float nPeriodsSecondary = (screenCols*nPeriodsPrimary)/(screenCols-nPeriodsPrimary);
31
    float nPeriodsSecondary = nPeriodsPrimary + 1;
32
 
32
 
33
    // all on pattern
33
    // all on pattern
34
    cv::Mat allOn(1, screenCols, CV_8UC3, cv::Scalar::all(255));
34
    cv::Mat allOn(1, screenCols, CV_8UC3, cv::Scalar::all(255));
35
    patterns.push_back(allOn);
35
    patterns.push_back(allOn);
36
 
36
 
Line 42... Line 42...
42
    const float pi = M_PI;
42
    const float pi = M_PI;
43
 
43
 
44
    // Primary encoding patterns
44
    // Primary encoding patterns
45
    for(unsigned int i=0; i<nStepsPrimary; i++){
45
    for(unsigned int i=0; i<nStepsPrimary; i++){
46
        float phase = 2.0*pi/nStepsPrimary * i;
46
        float phase = 2.0*pi/nStepsPrimary * i;
47
        float pitch = nPeriodsPrimary;
47
        float pitch = screenCols/nPeriodsPrimary;
48
        cv::Mat patternI(1,1,CV_8U);
48
        cv::Mat patternI(1,1,CV_8U);
49
        patternI = computePhaseVector(screenCols, phase, pitch);
49
        patternI = computePhaseVector(screenCols, phase, pitch);
50
        patterns.push_back(patternI.t());
50
        patterns.push_back(patternI.t());
51
    }
51
    }
52
 
52
 
53
    // Secondary encoding patterns
53
    // Secondary encoding patterns
54
    for(unsigned int i=0; i<nStepsSecondary; i++){
54
    for(unsigned int i=0; i<nStepsSecondary; i++){
55
        float phase = 2.0*pi/nStepsSecondary * i;
55
        float phase = 2.0*pi/nStepsSecondary * i;
56
        float pitch = nPeriodsSecondary;
56
        float pitch = screenCols/nPeriodsSecondary;
57
        cv::Mat patternI(1,1,CV_8U);
57
        cv::Mat patternI(1,1,CV_8U);
58
        patternI = computePhaseVector(screenCols, phase, pitch);
58
        patternI = computePhaseVector(screenCols, phase, pitch);
59
        patterns.push_back(patternI.t());
59
        patterns.push_back(patternI.t());
60
    }
60
    }
61
 
61
 
Line 114... Line 114...
114
 
114
 
115
    std::vector<cv::Mat> F0Secondary = getDFTComponents(frames0Secondary);
115
    std::vector<cv::Mat> F0Secondary = getDFTComponents(frames0Secondary);
116
    cv::Mat up0Secondary;
116
    cv::Mat up0Secondary;
117
    cv::phase(F0Secondary[2], -F0Secondary[3], up0Secondary);
117
    cv::phase(F0Secondary[2], -F0Secondary[3], up0Secondary);
118
 
118
 
119
    cv::Mat up0Equivalent = up0Primary - up0Secondary;
119
    cv::Mat up0Equivalent = up0Secondary - up0Primary;
120
    up0Equivalent = cvtools::modulo(up0Equivalent, 2.0*pi);
120
    up0Equivalent = cvtools::modulo(up0Equivalent, 2.0*pi);
121
    cv::Mat up0 = unwrapWithCue(up0Primary, up0Equivalent, (float)screenCols/nPeriodsPrimary);
121
    cv::Mat up0 = unwrapWithCue(up0Primary, up0Equivalent, nPeriodsPrimary);
122
    up0 *= screenCols/(2.0*pi);
122
    up0 *= screenCols/(2.0*pi);
123
    cv::Mat amplitude0;
123
    cv::Mat amplitude0;
124
    cv::magnitude(F0Primary[2], -F0Primary[3], amplitude0);
124
    cv::magnitude(F0Primary[2], -F0Primary[3], amplitude0);
125
 
125
 
126
    // Collected signal energy at higher frequencies
126
    // Collected signal energy at higher frequencies
Line 158... Line 158...
158
 
158
 
159
    std::vector<cv::Mat> F1Secondary = getDFTComponents(frames1Secondary);
159
    std::vector<cv::Mat> F1Secondary = getDFTComponents(frames1Secondary);
160
    cv::Mat up1Secondary;
160
    cv::Mat up1Secondary;
161
    cv::phase(F1Secondary[2], -F1Secondary[3], up1Secondary);
161
    cv::phase(F1Secondary[2], -F1Secondary[3], up1Secondary);
162
 
162
 
163
    cv::Mat up1Equivalent = up1Primary - up1Secondary;
163
    cv::Mat up1Equivalent = up1Secondary - up1Primary;
164
    up1Equivalent = cvtools::modulo(up1Equivalent, 2.0*pi);
164
    up1Equivalent = cvtools::modulo(up1Equivalent, 2.0*pi);
165
    cv::Mat up1 = unwrapWithCue(up1Primary, up1Equivalent, (float)screenCols/nPeriodsPrimary);
165
    cv::Mat up1 = unwrapWithCue(up1Primary, up1Equivalent, nPeriodsPrimary);
166
    up1 *= screenCols/(2.0*pi);
166
    up1 *= screenCols/(2.0*pi);
167
    cv::Mat amplitude1;
167
    cv::Mat amplitude1;
168
    cv::magnitude(F1Primary[2], -F1Primary[3], amplitude1);
168
    cv::magnitude(F1Primary[2], -F1Primary[3], amplitude1);
169
 
169
 
170
    // Collected signal energy at higher frequencies
170
    // Collected signal energy at higher frequencies
Line 220... Line 220...
220
//    // Erode occlusion masks
220
//    // Erode occlusion masks
221
//    cv::Mat strel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5,5));
221
//    cv::Mat strel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5,5));
222
//    cv::erode(occlusion0, occlusion0, strel);
222
//    cv::erode(occlusion0, occlusion0, strel);
223
//    cv::erode(occlusion1, occlusion1, strel);
223
//    cv::erode(occlusion1, occlusion1, strel);
224
 
224
 
225
//    // Threshold on gradient of phase
225
    // Threshold on gradient of phase
226
//    cv::Mat edges0;
226
    cv::Mat edges0;
227
//    cv::Sobel(up0, edges0, -1, 1, 1, 5);
227
    cv::Sobel(up0, edges0, -1, 1, 1, 5);
228
//    occlusion0 = occlusion0 & (abs(edges0) < 150);
228
    occlusion0 = occlusion0 & (abs(edges0) < 150);
229
 
229
 
230
//    cv::Mat edges1;
230
    cv::Mat edges1;
231
//    cv::Sobel(up1, edges1, -1, 1, 1, 5);
231
    cv::Sobel(up1, edges1, -1, 1, 1, 5);
232
//    occlusion1 = occlusion1 & (abs(edges1) < 150);
232
    occlusion1 = occlusion1 & (abs(edges1) < 150);
233
 
233
 
234
    #ifdef QT_DEBUG
234
    #ifdef QT_DEBUG
235
        cvtools::writeMat(occlusion0, "occlusion0.mat", "occlusion0");
235
        cvtools::writeMat(occlusion0, "occlusion0.mat", "occlusion0");
236
        cvtools::writeMat(occlusion1, "occlusion1.mat", "occlusion1");
236
        cvtools::writeMat(occlusion1, "occlusion1.mat", "occlusion1");
237
    #endif
237
    #endif
Line 253... Line 253...
253
                    continue;
253
                    continue;
254
 
254
 
255
                float up1Left = up1.at<float>(row,col1);
255
                float up1Left = up1.at<float>(row,col1);
256
                float up1Right = up1.at<float>(row,col1+1);
256
                float up1Right = up1.at<float>(row,col1+1);
257
 
257
 
258
                if((up1Left <= up0i) && (up0i <= up1Right) && (up0i-up1Left < 1) && (up1Right-up0i < 1)){
258
                if((up1Left <= up0i) && (up0i <= up1Right) && (up0i-up1Left < 1.0) && (up1Right-up0i < 1.0) && (up1Right-up1Left > 0.1)){
259
 
259
 
260
                    float col1i = col1 + (up0i-up1Left)/(up1Right-up1Left);
260
                    float col1i = col1 + (up0i-up1Left)/(up1Right-up1Left);
261
 
261
 
262
                    q0.push_back(cv::Point2f(col, row));
262
                    q0.push_back(cv::Point2f(col, row));
263
                    q1.push_back(cv::Point2f(col1i, row));
263
                    q1.push_back(cv::Point2f(col1i, row));