Subversion Repositories seema-scanner

Rev

Rev 23 | Rev 30 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 23 Rev 27
Line 1... Line 1...
1
#include "SMCaptureWorker.h"
1
#include "SMCaptureWorker.h"
2
 
2
 
-
 
3
#include "CodecGrayCode.h"
-
 
4
#include "CodecPhaseShift.h"
-
 
5
 
3
#include <QCoreApplication>
6
#include <QCoreApplication>
4
#include <QTime>
7
#include <QTime>
5
#include <QSettings>
8
#include <QSettings>
-
 
9
#include <QtTest/QTest>
6
 
10
 
7
void SMCaptureWorker::setup(){
11
void SMCaptureWorker::setup(){
8
 
12
 
9
    // Create projector
13
    // Create rotation stage
-
 
14
    rotationStage = new RotationStage();
-
 
15
 
10
    QSettings settings;
16
    QSettings settings;
11
    int screenNum = settings.value("projector/screenNumber", -1).toInt();
-
 
12
    if(screenNum != -1)
-
 
13
        projector = new ProjectorOpenGL(screenNum);
-
 
14
 
17
 
15
    // Create cameras
18
    // Create cameras
16
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
19
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
17
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
20
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
18
    if(iNum0 != -1)
21
    if(iNum0 != -1)
Line 33... Line 36...
33
 
36
 
34
    // Start capturing
37
    // Start capturing
35
    camera0->startCapture();
38
    camera0->startCapture();
36
    camera1->startCapture();
39
    camera1->startCapture();
37
 
40
 
38
    // Create rotation stage
41
    // Create projector
-
 
42
    int screenNum = settings.value("projector/screenNumber", -1).toInt();
-
 
43
    if(screenNum != -1)
39
    rotationStage = new RotationStage();
44
        projector = new ProjectorOpenGL(screenNum);
-
 
45
 
-
 
46
    unsigned int screenCols, screenRows;
-
 
47
    projector->getScreenRes(&screenCols, &screenRows);
-
 
48
 
-
 
49
    // Create encoder
-
 
50
    CodecDir dir = (CodecDir)settings.value("pattern/direction", CodecDirHorizontal).toInt();
-
 
51
    if(dir == CodecDirNone)
-
 
52
        std::cerr << "SMCaptureWorker: invalid coding direction " << std::endl;
-
 
53
 
-
 
54
    codec = settings.value("codec", "GrayCode").toString();
-
 
55
    if(codec == "PhaseShift")
-
 
56
        encoder = new EncoderPhaseShift(screenCols, screenRows, dir);
-
 
57
    else if(codec == "GrayCode")
-
 
58
        encoder = new EncoderGrayCode(screenCols, screenRows, dir);
-
 
59
    else
-
 
60
        std::cerr << "SLScanWorker: invalid codec " << codec.toStdString() << std::endl;
-
 
61
 
-
 
62
 
-
 
63
    // Upload patterns to projector/GPU
-
 
64
    for(unsigned int i=0; i<encoder->getNPatterns(); i++){
-
 
65
        cv::Mat pattern = encoder->getEncodingPattern(i);
-
 
66
        projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows);
40
}
67
    }
41
 
68
 
-
 
69
    delay = settings.value("trigger/delay", 50).toInt();
-
 
70
}
42
 
71
 
43
void SMCaptureWorker::doWork(){
-
 
44
 
72
 
45
    projector->displayWhite();
73
void SMCaptureWorker::doWork(){
46
 
74
 
47
    working = true;
75
    working = true;
48
 
76
 
49
    // Processing loop
77
    // Processing loop
50
    QTime time;
78
    QTime time;
51
    time.start();
79
    time.start();
52
    while(working){
80
    while(working){
53
 
81
 
-
 
82
        projector->displayWhite();
-
 
83
 
54
        std::vector<cv::Mat> frameSet;
84
        std::vector<cv::Mat> frameSet;
55
 
85
 
56
        CameraFrame frame;
86
        CameraFrame frame;
57
 
87
 
58
        // trigger cameras
88
        // trigger cameras
Line 90... Line 120...
90
    rotationStage->moveAbsolute(angle);
120
    rotationStage->moveAbsolute(angle);
91
    rotationStage->wait();
121
    rotationStage->wait();
92
}
122
}
93
 
123
 
94
void SMCaptureWorker::acquireCalibrationSet(float angle){
124
void SMCaptureWorker::acquireCalibrationSet(float angle){
-
 
125
 
-
 
126
    if(angle != -1.0)
95
    rotateTo(angle);
127
        rotateTo(angle);
96
 
128
 
97
    CameraFrame frame;
129
    CameraFrame frame;
98
    CalibrationSet calibrationSet;
130
    SMCalibrationSet calibrationSet;
99
 
131
 
100
    // trigger cameras
132
    // trigger cameras
101
    camera0->trigger();
133
    camera0->trigger();
102
    camera1->trigger();
134
    camera1->trigger();
103
 
135
 
Line 105... Line 137...
105
    frame = camera0->getFrame();
137
    frame = camera0->getFrame();
106
    cv::Mat frameCV;
138
    cv::Mat frameCV;
107
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
139
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
108
    frameCV = frameCV.clone();
140
    frameCV = frameCV.clone();
109
 
141
 
-
 
142
    emit newFrame(0, frameCV);
110
    calibrationSet.frame0 = frameCV;
143
    calibrationSet.frame0 = frameCV;
111
 
144
 
112
    frame = camera1->getFrame();
145
    frame = camera1->getFrame();
113
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
146
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
114
    frameCV = frameCV.clone();
147
    frameCV = frameCV.clone();
115
 
148
 
-
 
149
    emit newFrame(1, frameCV);
116
    calibrationSet.frame1 = frameCV;
150
    calibrationSet.frame1 = frameCV;
117
 
151
 
118
    calibrationSet.rotationAngle = angle;
152
    calibrationSet.rotationAngle = rotationStage->getAngle();
119
 
153
 
120
    emit newCalibrationSet(calibrationSet);
154
    emit newCalibrationSet(calibrationSet);
121
}
155
}
122
 
156
 
123
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){}
157
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){}
124
 
158
 
125
void SMCaptureWorker::acquireFrameSequence(float angle){}
159
void SMCaptureWorker::acquireFrameSequence(float angle){
-
 
160
 
-
 
161
    if(angle != -1.0)
-
 
162
        rotateTo(angle);
-
 
163
 
-
 
164
    CameraFrame frame;
-
 
165
 
-
 
166
    SMFrameSequence frameSequence;
-
 
167
 
-
 
168
    for(unsigned int i=0; i<encoder->getNPatterns(); i++){
-
 
169
 
-
 
170
        // display pattern
-
 
171
        projector->displayPattern(i);
-
 
172
 
-
 
173
        QTest::qSleep(delay);
-
 
174
 
-
 
175
        // trigger cameras
-
 
176
        camera0->trigger();
-
 
177
        camera1->trigger();
-
 
178
 
-
 
179
        // retrieve frames
-
 
180
        frame = camera0->getFrame();
-
 
181
        cv::Mat frameCV;
-
 
182
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
-
 
183
        frameCV = frameCV.clone();
-
 
184
 
-
 
185
        emit newFrame(0, frameCV);
-
 
186
        frameSequence.frames0.push_back(frameCV);
-
 
187
 
-
 
188
        frame = camera1->getFrame();
-
 
189
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
-
 
190
        frameCV = frameCV.clone();
-
 
191
 
-
 
192
        emit newFrame(1, frameCV);
-
 
193
        frameSequence.frames1.push_back(frameCV);
-
 
194
 
-
 
195
    }
-
 
196
 
-
 
197
    frameSequence.rotationAngle = rotationStage->getAngle();
-
 
198
    frameSequence.codec = codec;
-
 
199
 
-
 
200
    emit newFrameSequence(frameSequence);
-
 
201
 
-
 
202
}
-
 
203
 
-
 
204
 
126
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){}
205
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){}
127
 
206
 
128
void SMCaptureWorker::abort(){}
207
void SMCaptureWorker::abort(){}
129
 
208
 
130
void SMCaptureWorker::stopWork(){
209
void SMCaptureWorker::stopWork(){