Subversion Repositories seema-scanner

Rev

Rev 164 | Rev 169 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 164 Rev 167
1
#include "SMCaptureWorker.h"
1
#include "SMCaptureWorker.h"
2
 
2
 
3
#include "AlgorithmGrayCode.h"
3
#include "AlgorithmGrayCode.h"
4
#include "AlgorithmGrayCodeHorzVert.h"
4
#include "AlgorithmGrayCodeHorzVert.h"
5
#include "AlgorithmGrayCodeMax.h"
5
#include "AlgorithmGrayCodeMax.h"
6
#include "AlgorithmPhaseShiftTwoFreq.h"
6
#include "AlgorithmPhaseShiftTwoFreq.h"
7
#include "AlgorithmPhaseShiftThreeFreq.h"
7
#include "AlgorithmPhaseShiftThreeFreq.h"
8
#include "AlgorithmLineShift.h"
8
#include "AlgorithmLineShift.h"
9
 
9
 
10
#include <QCoreApplication>
10
#include <QCoreApplication>
11
#include <QTime>
11
#include <QTime>
12
#include <QSettings>
12
#include <QSettings>
13
#include <QtTest/QTest>
13
#include <QtTest/QTest>
14
 
14
 
15
#include "cvtools.h"
15
#include "cvtools.h"
16
 
16
 
17
void SMCaptureWorker::setup(){
17
void SMCaptureWorker::setup(){
18
 
18
 
19
    QSettings settings;
19
    QSettings settings;
20
 
20
 
21
    // Create cameras
21
    // Create cameras
22
    int iNum0 = settings.value("camera0/interfaceNumber", 0).toInt();
22
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
23
    int cNum0 = settings.value("camera0/cameraNumber", 0).toInt();
23
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
24
    if(iNum0 != -1)
24
    if(iNum0 != -1)
25
        camera0 = CameraFactory::NewCamera(iNum0,cNum0,triggerModeSoftware);
25
        camera0 = CameraFactory::NewCamera(iNum0,cNum0,triggerModeSoftware);
-
 
26
    else
-
 
27
        return;
26
 
28
 
27
    int iNum1 = settings.value("camera1/interfaceNumber", 0).toInt();
29
    int iNum1 = settings.value("camera1/interfaceNumber", -1).toInt();
28
    int cNum1 = settings.value("camera1/cameraNumber", 1).toInt();
30
    int cNum1 = settings.value("camera1/cameraNumber", -1).toInt();
29
    if(iNum1 != -1)
31
    if(iNum1 != -1)
30
        camera1 = CameraFactory::NewCamera(iNum1,cNum1,triggerModeSoftware);
32
        camera1 = CameraFactory::NewCamera(iNum1,cNum1,triggerModeSoftware);
-
 
33
    else
-
 
34
        return;
31
 
35
 
32
    // Set camera settings
36
    // Set camera settings
33
    CameraSettings cameraSettings;
37
    CameraSettings cameraSettings;
34
    cameraSettings.shutter = settings.value("camera/shutter", 16.666).toFloat();
38
    cameraSettings.shutter = settings.value("camera/shutter", 16.666).toFloat();
35
    cameraSettings.gain = 0.0;
39
    cameraSettings.gain = 0.0;
36
 
40
 
37
    camera0->setCameraSettings(cameraSettings);
41
    camera0->setCameraSettings(cameraSettings);
38
 
42
 
39
    camera1->setCameraSettings(cameraSettings);
43
    camera1->setCameraSettings(cameraSettings);
40
 
44
 
41
    // Start capturing
45
    // Start capturing
42
    camera0->startCapture();
46
    camera0->startCapture();
43
    camera1->startCapture();
47
    camera1->startCapture();
44
 
48
 
45
    // Create projector
49
    // Create projector
46
    //int screenNum = settings.value("projector/screenNumber", -1).toInt();
50
    //int screenNum = settings.value("projector/screenNumber", -1).toInt();
47
    int screenNum = settings.value("projector/screenNumber", 1).toInt();
51
    int screenNum = settings.value("projector/screenNumber", 1).toInt();
48
    if(screenNum != -1)
52
    if(screenNum != -1)
49
        projector = new ProjectorOpenGL(screenNum);
53
        projector = new ProjectorOpenGL(screenNum);
50
 
54
 
51
    // Create rotation stage
55
    // Create rotation stage
52
    rotationStage = new RotationStage();
56
    rotationStage = new RotationStage();
53
 
57
 
54
    // Create Algorithm
58
    // Create Algorithm
55
    unsigned int screenCols, screenRows;
59
    unsigned int screenCols, screenRows;
56
    projector->getScreenRes(&screenCols, &screenRows);
60
    projector->getScreenRes(&screenCols, &screenRows);
57
    codec = settings.value("algorithm", "GrayCode").toString();
61
    codec = settings.value("algorithm", "GrayCode").toString();
58
    if(codec == "GrayCode")
62
    if(codec == "GrayCode")
59
        algorithm = new AlgorithmGrayCode(screenCols, screenRows);
63
        algorithm = new AlgorithmGrayCode(screenCols, screenRows);
60
    else if(codec == "GrayCodeHorzVert")
64
    else if(codec == "GrayCodeHorzVert")
61
        algorithm = new AlgorithmGrayCodeHorzVert(screenCols, screenRows);
65
        algorithm = new AlgorithmGrayCodeHorzVert(screenCols, screenRows);
62
    else if(codec == "GrayCodeMax")
66
    else if(codec == "GrayCodeMax")
63
        algorithm = new AlgorithmGrayCodeMax(screenCols, screenRows);
67
        algorithm = new AlgorithmGrayCodeMax(screenCols, screenRows);
64
    else if(codec == "PhaseShiftTwoFreq")
68
    else if(codec == "PhaseShiftTwoFreq")
65
        algorithm = new AlgorithmPhaseShiftTwoFreq(screenCols, screenRows);
69
        algorithm = new AlgorithmPhaseShiftTwoFreq(screenCols, screenRows);
66
    else if(codec == "PhaseShiftThreeFreq")
70
    else if(codec == "PhaseShiftThreeFreq")
67
        algorithm = new AlgorithmPhaseShiftThreeFreq(screenCols, screenRows);
71
        algorithm = new AlgorithmPhaseShiftThreeFreq(screenCols, screenRows);
68
    else if(codec == "LineShift")
72
    else if(codec == "LineShift")
69
        algorithm = new AlgorithmLineShift(screenCols, screenRows);
73
        algorithm = new AlgorithmLineShift(screenCols, screenRows);
70
    else
74
    else
71
        std::cerr << "SMCaptureWorker: invalid codec " << codec.toStdString() << std::endl;
75
        std::cerr << "SMCaptureWorker: invalid codec " << codec.toStdString() << std::endl;
72
 
76
 
73
    // Upload patterns to projector/GPU
77
    // Upload patterns to projector/GPU
74
    for(unsigned int i=0; i<algorithm->getNPatterns(); i++){
78
    for(unsigned int i=0; i<algorithm->getNPatterns(); i++){
75
        cv::Mat pattern = algorithm->getEncodingPattern(i);
79
        cv::Mat pattern = algorithm->getEncodingPattern(i);
76
        projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows);
80
        projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows);
77
    }
81
    }
78
 
82
 
79
    delay = settings.value("trigger/delay", 50).toInt();
83
    delay = settings.value("trigger/delay", 50).toInt();
80
    stackingCalibration = settings.value("stacking/calibration", 1).toInt();
84
    stackingCalibration = settings.value("stacking/calibration", 1).toInt();
81
    stackingAcquisition= settings.value("stacking/acquisition", 1).toInt();
85
    stackingAcquisition= settings.value("stacking/acquisition", 1).toInt();
-
 
86
 
-
 
87
    setupSuccessful = true;
82
}
88
}
83
 
89
 
84
 
90
 
85
void SMCaptureWorker::doWork(){
91
void SMCaptureWorker::doWork(){
86
 
92
 
-
 
93
    if(!setupSuccessful)
-
 
94
        return;
-
 
95
 
87
    working = true;
96
    working = true;
88
 
97
 
89
    // Processing loop
98
    // Processing loop
90
//    QTime time;
99
//    QTime time;
91
//    time.start();
100
//    time.start();
92
    while(working){
101
    while(working){
93
 
102
 
94
        projector->displayWhite();
103
        projector->displayWhite();
95
 
104
 
96
        // prevent image acquisition timeout
105
        // prevent image acquisition timeout
97
        QTest::qSleep(10);
106
        QTest::qSleep(10);
98
 
107
 
99
        CameraFrame frame;
108
        CameraFrame frame;
100
 
109
 
101
        // trigger cameras
110
        // trigger cameras
102
        camera0->trigger();
111
        camera0->trigger();
103
        camera1->trigger();
112
        camera1->trigger();
104
 
113
 
105
        // retrieve raw frames
114
        // retrieve raw frames
106
        frame = camera0->getFrame();
115
        frame = camera0->getFrame();
107
        cv::Mat frameCV;
116
        cv::Mat frameCV;
108
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
117
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
109
        frameCV = frameCV.clone();
118
        frameCV = frameCV.clone();
110
//        cvtools::rshift(frameCV, 8);
119
//        cvtools::rshift(frameCV, 8);
111
//        frameCV.convertTo(frameCV, CV_8UC1);
120
//        frameCV.convertTo(frameCV, CV_8UC1);
112
        emit newFrame(0, frameCV);
121
        emit newFrame(0, frameCV);
113
 
122
 
114
        frame = camera1->getFrame();
123
        frame = camera1->getFrame();
115
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
124
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
116
        frameCV = frameCV.clone();
125
        frameCV = frameCV.clone();
117
//        cvtools::rshift(frameCV, 8);
126
//        cvtools::rshift(frameCV, 8);
118
//        frameCV.convertTo(frameCV, CV_8UC1);
127
//        frameCV.convertTo(frameCV, CV_8UC1);
119
        emit newFrame(1, frameCV);
128
        emit newFrame(1, frameCV);
120
 
129
 
121
        //std::cout << "SMCaptureWorker idle " << time.restart() << "ms" << std::endl;
130
        //std::cout << "SMCaptureWorker idle " << time.restart() << "ms" << std::endl;
122
 
131
 
123
        // Process events e.g. perform a task
132
        // Process events e.g. perform a task
124
        QCoreApplication::processEvents();
133
        QCoreApplication::processEvents();
125
    }
134
    }
126
 
135
 
127
    emit finished();
136
    emit finished();
128
}
137
}
129
 
138
 
130
void SMCaptureWorker::rotateTo(float angle){
139
void SMCaptureWorker::rotateTo(float angle){
131
 
140
 
-
 
141
    if(!setupSuccessful)
-
 
142
        return;
-
 
143
 
132
    rotationStage->moveAbsolute(angle);
144
    rotationStage->moveAbsolute(angle);
133
 
145
 
134
    while(rotationStage->isMoving()){
146
    while(rotationStage->isMoving()){
135
 
147
 
136
        // prevent grab timeout in flycapture
148
        // prevent grab timeout in flycapture
137
        QTest::qSleep(10);
149
        QTest::qSleep(10);
138
 
150
 
139
        // trigger cameras
151
        // trigger cameras
140
        camera0->trigger();
152
        camera0->trigger();
141
        camera1->trigger();
153
        camera1->trigger();
142
 
154
 
143
        // retrieve frames
155
        // retrieve frames
144
        CameraFrame frame;
156
        CameraFrame frame;
145
        frame = camera0->getFrame();
157
        frame = camera0->getFrame();
146
        cv::Mat frameCV;
158
        cv::Mat frameCV;
147
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
159
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
148
        frameCV = frameCV.clone();
160
        frameCV = frameCV.clone();
149
        emit newFrame(0, frameCV);
161
        emit newFrame(0, frameCV);
150
        frame = camera1->getFrame();
162
        frame = camera1->getFrame();
151
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
163
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
152
        frameCV = frameCV.clone();
164
        frameCV = frameCV.clone();
153
        emit newFrame(1, frameCV);
165
        emit newFrame(1, frameCV);
154
    }
166
    }
155
 
167
 
156
    emit rotatedTo(angle);
168
    emit rotatedTo(angle);
157
}
169
}
158
 
170
 
159
void SMCaptureWorker::acquireCalibrationSet(float angle){
171
void SMCaptureWorker::acquireCalibrationSet(float angle){
160
 
172
 
-
 
173
    if(!setupSuccessful)
-
 
174
        return;
-
 
175
 
161
    if(angle != -1.0)
176
    if(angle != -1.0)
162
        rotateTo(angle);
177
        rotateTo(angle);
163
 
178
 
164
    // just for safe measures
179
    // just for safe measures
165
    QTest::qSleep(500);
180
    QTest::qSleep(500);
166
 
181
 
167
    CameraFrame frame;
182
    CameraFrame frame;
168
    SMCalibrationSet calibrationSet;
183
    SMCalibrationSet calibrationSet;
169
    cv::Mat frameCVStacked0(camera0->getFrameHeight(), camera0->getFrameWidth(), CV_32SC1, cv::Scalar(0));
184
    cv::Mat frameCVStacked0(camera0->getFrameHeight(), camera0->getFrameWidth(), CV_32SC1, cv::Scalar(0));
170
    cv::Mat frameCVStacked1(camera1->getFrameHeight(), camera1->getFrameWidth(), CV_32SC1, cv::Scalar(0));
185
    cv::Mat frameCVStacked1(camera1->getFrameHeight(), camera1->getFrameWidth(), CV_32SC1, cv::Scalar(0));
171
 
186
 
172
    for(int i=0; i<stackingCalibration; i++){
187
    for(int i=0; i<stackingCalibration; i++){
173
        // trigger cameras
188
        // trigger cameras
174
        camera0->trigger();
189
        camera0->trigger();
175
        camera1->trigger();
190
        camera1->trigger();
176
 
191
 
177
        // retrieve frames
192
        // retrieve frames
178
        frame = camera0->getFrame();
193
        frame = camera0->getFrame();
179
        cv::Mat frameCV;
194
        cv::Mat frameCV;
180
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
195
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
181
        frameCV = frameCV.clone();
196
        frameCV = frameCV.clone();
182
        cv::add(frameCV, frameCVStacked0, frameCVStacked0, cv::noArray(), CV_32SC1);
197
        cv::add(frameCV, frameCVStacked0, frameCVStacked0, cv::noArray(), CV_32SC1);
183
//cvtools::writeMat(frameCV, "frameCV.mat", "frameCV");
198
//cvtools::writeMat(frameCV, "frameCV.mat", "frameCV");
184
//cvtools::writeMat(frameCVStacked0, "frameCVStacked0.mat", "frameCVStacked0");
199
//cvtools::writeMat(frameCVStacked0, "frameCVStacked0.mat", "frameCVStacked0");
185
        emit newFrame(0, frameCV);
200
        emit newFrame(0, frameCV);
186
 
201
 
187
        frame = camera1->getFrame();
202
        frame = camera1->getFrame();
188
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
203
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
189
        frameCV = frameCV.clone();
204
        frameCV = frameCV.clone();
190
        cv::add(frameCV, frameCVStacked1, frameCVStacked1, cv::noArray(), CV_32SC1);
205
        cv::add(frameCV, frameCVStacked1, frameCVStacked1, cv::noArray(), CV_32SC1);
191
 
206
 
192
        emit newFrame(1, frameCV);
207
        emit newFrame(1, frameCV);
193
 
208
 
194
    }
209
    }
195
 
210
 
196
    frameCVStacked0.convertTo(frameCVStacked0, CV_8UC1, 1.0/stackingCalibration);
211
    frameCVStacked0.convertTo(frameCVStacked0, CV_8UC1, 1.0/stackingCalibration);
197
//cvtools::writeMat(frameCVStacked0, "frameCVStacked0a.mat", "frameCVStacked0a");
212
//cvtools::writeMat(frameCVStacked0, "frameCVStacked0a.mat", "frameCVStacked0a");
198
    frameCVStacked1.convertTo(frameCVStacked1, CV_8UC1, 1.0/stackingCalibration);
213
    frameCVStacked1.convertTo(frameCVStacked1, CV_8UC1, 1.0/stackingCalibration);
199
 
214
 
200
    calibrationSet.frame0 = frameCVStacked0;
215
    calibrationSet.frame0 = frameCVStacked0;
201
    calibrationSet.frame1 = frameCVStacked1;
216
    calibrationSet.frame1 = frameCVStacked1;
202
 
217
 
203
    calibrationSet.rotationAngle = rotationStage->getAngle();
218
    calibrationSet.rotationAngle = rotationStage->getAngle();
204
 
219
 
205
    emit newCalibrationSet(calibrationSet);
220
    emit newCalibrationSet(calibrationSet);
206
}
221
}
207
 
222
 
208
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){
223
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){
209
 
224
 
-
 
225
    if(!setupSuccessful)
-
 
226
        return;
-
 
227
 
210
    for(int i=0; i<angles.size(); i++)
228
    for(unsigned int i=0; i<angles.size(); i++)
211
        acquireCalibrationSet(angles[i]);
229
        acquireCalibrationSet(angles[i]);
212
}
230
}
213
 
231
 
214
void SMCaptureWorker::acquireFrameSequence(float angle){
232
void SMCaptureWorker::acquireFrameSequence(float angle){
215
 
233
 
-
 
234
    if(!setupSuccessful)
-
 
235
        return;
-
 
236
 
216
    if(angle != -1.0)
237
    if(angle != -1.0)
217
        rotateTo(angle);
238
        rotateTo(angle);
218
 
239
 
219
    CameraFrame frame;
240
    CameraFrame frame;
220
    SMFrameSequence frameSequence;
241
    SMFrameSequence frameSequence;
221
 
242
 
222
    for(unsigned int i=0; i<algorithm->getNPatterns(); i++){
243
    for(unsigned int i=0; i<algorithm->getNPatterns(); i++){
223
 
244
 
224
        // display pattern
245
        // display pattern
225
        projector->displayPattern(i);
246
        projector->displayPattern(i);
226
 
247
 
227
        QTest::qSleep(delay);
248
        QTest::qSleep(delay);
228
 
249
 
229
        cv::Mat frameCVStacked0(camera0->getFrameHeight(), camera0->getFrameWidth(), CV_32SC1, cv::Scalar(0));
250
        cv::Mat frameCVStacked0(camera0->getFrameHeight(), camera0->getFrameWidth(), CV_32SC1, cv::Scalar(0));
230
        cv::Mat frameCVStacked1(camera1->getFrameHeight(), camera1->getFrameWidth(), CV_32SC1, cv::Scalar(0));
251
        cv::Mat frameCVStacked1(camera1->getFrameHeight(), camera1->getFrameWidth(), CV_32SC1, cv::Scalar(0));
231
        for(int i=0; i<stackingAcquisition; i++){
252
        for(int i=0; i<stackingAcquisition; i++){
232
            // trigger cameras
253
            // trigger cameras
233
            camera0->trigger();
254
            camera0->trigger();
234
            camera1->trigger();
255
            camera1->trigger();
235
 
256
 
236
            // retrieve frames
257
            // retrieve frames
237
            frame = camera0->getFrame();
258
            frame = camera0->getFrame();
238
            cv::Mat frameCV;
259
            cv::Mat frameCV;
239
            frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
260
            frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
240
            frameCV = frameCV.clone();
261
            frameCV = frameCV.clone();
241
            cv::add(frameCV, frameCVStacked0, frameCVStacked0, cv::noArray(), CV_32SC1);
262
            cv::add(frameCV, frameCVStacked0, frameCVStacked0, cv::noArray(), CV_32SC1);
242
 
263
 
243
            emit newFrame(0, frameCV);
264
            emit newFrame(0, frameCV);
244
 
265
 
245
            frame = camera1->getFrame();
266
            frame = camera1->getFrame();
246
            frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
267
            frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
247
            frameCV = frameCV.clone();
268
            frameCV = frameCV.clone();
248
            cv::add(frameCV, frameCVStacked1, frameCVStacked1, cv::noArray(), CV_32SC1);
269
            cv::add(frameCV, frameCVStacked1, frameCVStacked1, cv::noArray(), CV_32SC1);
249
 
270
 
250
            emit newFrame(1, frameCV);
271
            emit newFrame(1, frameCV);
251
 
272
 
252
        }
273
        }
253
 
274
 
254
        frameCVStacked0.convertTo(frameCVStacked0, CV_8UC1, 1.0/stackingAcquisition);
275
        frameCVStacked0.convertTo(frameCVStacked0, CV_8UC1, 1.0/stackingAcquisition);
255
        frameCVStacked1.convertTo(frameCVStacked1, CV_8UC1, 1.0/stackingAcquisition);
276
        frameCVStacked1.convertTo(frameCVStacked1, CV_8UC1, 1.0/stackingAcquisition);
256
 
277
 
257
        frameSequence.frames0.push_back(frameCVStacked0);
278
        frameSequence.frames0.push_back(frameCVStacked0);
258
        frameSequence.frames1.push_back(frameCVStacked1);
279
        frameSequence.frames1.push_back(frameCVStacked1);
259
 
280
 
260
    }
281
    }
261
 
282
 
262
    frameSequence.rotationAngle = rotationStage->getAngle();
283
    frameSequence.rotationAngle = rotationStage->getAngle();
263
    frameSequence.codec = codec;
284
    frameSequence.codec = codec;
264
 
285
 
265
    emit newFrameSequence(frameSequence);
286
    emit newFrameSequence(frameSequence);
266
 
287
 
267
    projector->displayWhite();
288
    projector->displayWhite();
268
}
289
}
269
 
290
 
270
 
291
 
271
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){
292
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){
272
 
293
 
-
 
294
    if(!setupSuccessful)
-
 
295
        return;
-
 
296
 
273
    for(int i=0; i<angles.size(); i++)
297
    for(unsigned int i=0; i<angles.size(); i++)
274
        acquireFrameSequence(angles[i]);
298
        acquireFrameSequence(angles[i]);
275
}
299
}
276
 
300
 
277
void SMCaptureWorker::abort(){}
301
void SMCaptureWorker::abort(){}
278
 
302
 
279
void SMCaptureWorker::stopWork(){
303
void SMCaptureWorker::stopWork(){
280
    working = false;
304
    working = false;
281
}
305
}
282
 
306
 
283
SMCaptureWorker::~SMCaptureWorker(){
307
SMCaptureWorker::~SMCaptureWorker(){
284
    delete projector;
308
    delete projector;
285
    delete camera0;
309
    delete camera0;
286
    delete camera1;
310
    delete camera1;
287
    delete rotationStage;
311
    delete rotationStage;
288
}
312
}
289
 
313