Subversion Repositories seema-scanner

Rev

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

Rev 74 Rev 76
Line 6... Line 6...
6
#ifndef M_PI
6
#ifndef M_PI
7
    #define M_PI 3.14159265358979323846
7
    #define M_PI 3.14159265358979323846
8
#endif
8
#endif
9
 
9
 
10
static unsigned int nSteps = 20; // number of shifts/steps in primary
10
static unsigned int nSteps = 20; // number of shifts/steps in primary
11
static float pPrimary = 200; // primary period
11
static float pPrimary = 64; // primary period
12
 
12
 
13
// Algorithm
13
// Algorithm
14
static cv::Mat computePhaseVector(unsigned int length, float phase, float pitch){
14
static cv::Mat computePhaseVector(unsigned int length, float phase, float pitch){
15
 
15
 
16
    cv::Mat phaseVector(length, 1, CV_8UC3);
16
    cv::Mat phaseVector(length, 1, CV_8UC3);
Line 29... Line 29...
29
}
29
}
30
 
30
 
31
AlgorithmPhaseShift::AlgorithmPhaseShift(unsigned int _screenCols, unsigned int _screenRows) : Algorithm(_screenCols, _screenRows){
31
AlgorithmPhaseShift::AlgorithmPhaseShift(unsigned int _screenCols, unsigned int _screenRows) : Algorithm(_screenCols, _screenRows){
32
 
32
 
33
    // Set N
33
    // Set N
34
    N = 2+nSteps+3;
34
    N = 2+2*nSteps;
35
 
35
 
36
    // Determine the secondary (wider) period
36
    // Determine the secondary (wider) period
37
    float pSecondary = (screenCols*pPrimary)/(screenCols-pPrimary);
37
    float pSecondary = (screenCols*pPrimary)/(screenCols-pPrimary);
38
 
38
 
39
    // all on pattern
39
    // all on pattern
Line 55... Line 55...
55
        patternI = computePhaseVector(screenCols, phase, pitch);
55
        patternI = computePhaseVector(screenCols, phase, pitch);
56
        patterns.push_back(patternI.t());
56
        patterns.push_back(patternI.t());
57
    }
57
    }
58
 
58
 
59
    // Secondary encoding patterns
59
    // Secondary encoding patterns
60
    for(unsigned int i=0; i<3; i++){
60
    for(unsigned int i=0; i<nSteps; i++){
61
        float phase = 2.0*pi/3 * i;
61
        float phase = 2.0*pi/nSteps * i;
62
        float pitch = pSecondary;
62
        float pitch = pSecondary;
63
        cv::Mat patternI(1,1,CV_8U);
63
        cv::Mat patternI(1,1,CV_8U);
64
        patternI = computePhaseVector(screenCols, phase, pitch);
64
        patternI = computePhaseVector(screenCols, phase, pitch);
65
        patterns.push_back(patternI.t());
65
        patterns.push_back(patternI.t());
66
    }
66
    }
Line 153... Line 153...
153
        cv::cvtColor(frames1[i], frames1Gray[i], CV_RGB2GRAY);
153
        cv::cvtColor(frames1[i], frames1Gray[i], CV_RGB2GRAY);
154
    }
154
    }
155
 
155
 
156
    // Decode camera0
156
    // Decode camera0
157
    std::vector<cv::Mat> frames0Primary(frames0Gray.begin()+2, frames0Gray.begin()+2+nSteps);
157
    std::vector<cv::Mat> frames0Primary(frames0Gray.begin()+2, frames0Gray.begin()+2+nSteps);
158
    std::vector<cv::Mat> frames0Secondary(frames0Gray.begin()+2+nSteps, frames0Gray.begin()+2+nSteps+3);
158
    std::vector<cv::Mat> frames0Secondary(frames0Gray.begin()+2+nSteps, frames0Gray.begin()+2+2*nSteps);
159
    std::vector<cv::Mat> F0Enc = getDFTComponents(frames0Primary);
159
    std::vector<cv::Mat> F0Primary = getDFTComponents(frames0Primary);
160
    cv::Mat up0Primary;
160
    cv::Mat up0Primary;
161
    cv::phase(F0Enc[2], -F0Enc[3], up0Primary);
161
    cv::phase(F0Primary[2], -F0Primary[3], up0Primary);
162
    cv::Mat up0Secondary = getPhase(frames0Secondary[0], frames0Secondary[1], frames0Secondary[2]);
162
    //cv::Mat up0Secondary = getPhase(frames0Secondary[0], frames0Secondary[1], frames0Secondary[2]);
-
 
163
    std::vector<cv::Mat> F0Secondary = getDFTComponents(frames0Secondary);
-
 
164
    cv::Mat up0Secondary;
-
 
165
    cv::phase(F0Secondary[2], -F0Secondary[3], up0Secondary);
163
    cv::Mat up0Equivalent = up0Primary - up0Secondary;
166
    cv::Mat up0Equivalent = up0Primary - up0Secondary;
164
    up0Equivalent = cvtools::modulo(up0Equivalent, 2*pi);
167
    up0Equivalent = cvtools::modulo(up0Equivalent, 2*pi);
165
    cv::Mat up0 = unwrapWithCue(up0Primary, up0Equivalent, (float)screenCols/pPrimary);
168
    cv::Mat up0 = unwrapWithCue(up0Primary, up0Equivalent, (float)screenCols/pPrimary);
166
    up0 *= screenCols/(2*pi);
169
    up0 *= screenCols/(2*pi);
167
 
170
 
168
    // Decode camera1
171
    // Decode camera1
169
    std::vector<cv::Mat> frames1Primary(frames1Gray.begin()+2, frames1Gray.begin()+2+nSteps);
172
    std::vector<cv::Mat> frames1Primary(frames1Gray.begin()+2, frames1Gray.begin()+2+nSteps);
170
    std::vector<cv::Mat> frames1Secondary(frames1Gray.begin()+2+nSteps, frames1Gray.begin()+2+nSteps+3);
173
    std::vector<cv::Mat> frames1Secondary(frames1Gray.begin()+2+nSteps, frames1Gray.begin()+2+2*nSteps);
171
    std::vector<cv::Mat> F1Enc = getDFTComponents(frames1Primary);
174
    std::vector<cv::Mat> F1Primary = getDFTComponents(frames1Primary);
172
    cv::Mat up1Primary;
175
    cv::Mat up1Primary;
173
    cv::phase(F1Enc[2], -F1Enc[3], up1Primary);
176
    cv::phase(F1Primary[2], -F1Primary[3], up1Primary);
174
    cv::Mat up1Secondary = getPhase(frames1Secondary[0], frames1Secondary[1], frames1Secondary[2]);
177
    //cv::Mat up1Secondary = getPhase(frames1Secondary[0], frames1Secondary[1], frames1Secondary[2]);
-
 
178
    std::vector<cv::Mat> F1Secondary = getDFTComponents(frames1Secondary);
-
 
179
    cv::Mat up1Secondary;
-
 
180
    cv::phase(F1Secondary[2], -F1Secondary[3], up1Secondary);
175
    cv::Mat up1Equivalent = up1Primary - up1Secondary;
181
    cv::Mat up1Equivalent = up1Primary - up1Secondary;
176
    up1Equivalent = cvtools::modulo(up1Equivalent, 2*pi);
182
    up1Equivalent = cvtools::modulo(up1Equivalent, 2*pi);
177
    cv::Mat up1 = unwrapWithCue(up1Primary, up1Equivalent, (float)screenCols/pPrimary);
183
    cv::Mat up1 = unwrapWithCue(up1Primary, up1Equivalent, (float)screenCols/pPrimary);
178
    up1 *= screenCols/(2*pi);
184
    up1 *= screenCols/(2*pi);
179
 
185
 
Line 276... Line 282...
276
                }
282
                }
277
            }
283
            }
278
        }
284
        }
279
    }
285
    }
280
 
286
 
281
    // camera1 against camera0
287
//    // camera1 against camera0
282
    for(int row=0; row<frameRectRows; row++){
288
//    for(int row=0; row<frameRectRows; row++){
283
        for(int col=0; col<frameRectCols; col++){
289
//        for(int col=0; col<frameRectCols; col++){
284
 
290
 
285
            if(!occlusion1Rect.at<char>(row,col))
291
//            if(!occlusion1Rect.at<char>(row,col))
286
                continue;
292
//                continue;
287
 
293
 
288
            float up1i = up1Rect.at<float>(row,col);
294
//            float up1i = up1Rect.at<float>(row,col);
289
            for(int col0=0; col0<up0Rect.cols-1; col0++){
295
//            for(int col0=0; col0<up0Rect.cols-1; col0++){
290
 
296
 
291
                if(!occlusion0Rect.at<char>(row,col0) || !occlusion0Rect.at<char>(row,col0+1))
297
//                if(!occlusion0Rect.at<char>(row,col0) || !occlusion0Rect.at<char>(row,col0+1))
292
                    continue;
298
//                    continue;
293
 
299
 
294
                float up0Left = up0Rect.at<float>(row,col0);
300
//                float up0Left = up0Rect.at<float>(row,col0);
295
                float up0Right = up0Rect.at<float>(row,col0+1);
301
//                float up0Right = up0Rect.at<float>(row,col0+1);
296
 
302
 
297
                if((up0Left <= up1i) && (up1i <= up0Right) && (up1i-up0Left < 1) && (up0Right-up1i < 1)){
303
//                if((up0Left <= up1i) && (up1i <= up0Right) && (up1i-up0Left < 1) && (up0Right-up1i < 1)){
298
 
304
 
299
                    float col0i = col0 + (up1i-up0Left)/(up0Right-up0Left);
305
//                    float col0i = col0 + (up1i-up0Left)/(up0Right-up0Left);
300
 
306
 
301
                    q1Rect.push_back(cv::Point2f(col, row));
307
//                    q1Rect.push_back(cv::Point2f(col, row));
302
                    q0Rect.push_back(cv::Point2f(col0i, row));
308
//                    q0Rect.push_back(cv::Point2f(col0i, row));
303
 
309
 
304
                    break;
310
//                    break;
305
                }
311
//                }
306
            }
312
//            }
307
        }
313
//        }
308
    }
314
//    }
309
 
315
 
310
    int nMatches = q0Rect.size();
316
    int nMatches = q0Rect.size();
311
 
317
 
312
    if(nMatches < 1){
318
    if(nMatches < 1){
313
        Q.resize(0);
319
        Q.resize(0);