Subversion Repositories seema-scanner

Rev

Rev 245 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 245 Rev 255
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 "AlgorithmPhaseShiftTwoFreq.h"
5
#include "AlgorithmPhaseShiftTwoFreq.h"
6
#include "AlgorithmPhaseShiftTwoFreqHorzVert.h"
6
#include "AlgorithmPhaseShiftTwoFreqHorzVert.h"
7
#include "AlgorithmPhaseShiftThreeFreq.h"
7
#include "AlgorithmPhaseShiftThreeFreq.h"
8
#include "AlgorithmPhaseShiftEmbedded.h"
8
#include "AlgorithmPhaseShiftEmbedded.h"
9
#include "AlgorithmLineShift.h"
9
#include "AlgorithmLineShift.h"
10
 
10
 
11
#include <QCoreApplication>
11
#include <QCoreApplication>
12
#include <QTime>
12
#include <QTime>
13
#include <QSettings>
13
#include <QSettings>
14
#include <QtTest/QTest>
14
#include <QtTest/QTest>
15
 
15
 
16
#include "cvtools.h"
16
#include "cvtools.h"
17
 
17
 
18
void SMCaptureWorker::setup(){
18
void SMCaptureWorker::setup(){
19
 
19
 
20
    QSettings settings;
20
    QSettings settings;
21
 
21
 
22
    // Create cameras
22
    // Create cameras
23
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
23
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
24
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
24
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
25
    camera0.reset(CameraFactory::NewCamera(iNum0,cNum0,triggerModeSoftware));
25
    camera0.reset(CameraFactory::NewCamera(iNum0,cNum0,triggerModeSoftware));
26
 
26
 
27
    if(!camera0)
27
    if(!camera0)
28
        return;
28
        return;
29
 
29
 
30
    int iNum1 = settings.value("camera1/interfaceNumber", -1).toInt();
30
    int iNum1 = settings.value("camera1/interfaceNumber", -1).toInt();
31
    int cNum1 = settings.value("camera1/cameraNumber", -1).toInt();
31
    int cNum1 = settings.value("camera1/cameraNumber", -1).toInt();
32
    camera1.reset(CameraFactory::NewCamera(iNum1,cNum1,triggerModeSoftware));
32
    camera1.reset(CameraFactory::NewCamera(iNum1,cNum1,triggerModeSoftware));
33
 
33
 
34
    if(!camera1)
34
    if(!camera1)
35
        return;
35
        return;
36
 
36
 
37
    // Set camera settings
37
    // Set camera settings
38
    CameraSettings cameraSettings;
38
    CameraSettings cameraSettings;
39
    cameraSettings.shutter = settings.value("camera/shutter", 16.666).toFloat();
39
    cameraSettings.shutter = settings.value("camera/shutter", 16.666).toFloat();
40
    cameraSettings.gain = 0.0;
40
    cameraSettings.gain = 0.0;
41
 
41
 
42
    camera0->setCameraSettings(cameraSettings);
42
    camera0->setCameraSettings(cameraSettings);
43
    camera1->setCameraSettings(cameraSettings);
43
    camera1->setCameraSettings(cameraSettings);
44
 
44
 
45
    // Start capturing
45
    // Start capturing
46
    camera0->startCapture();
46
    camera0->startCapture();
47
    camera1->startCapture();
47
    camera1->startCapture();
48
 
48
 
49
    // Create projector
49
    // Create projector
50
    //int screenNum = settings.value("projector/screenNumber", -1).toInt();
50
    //int screenNum = settings.value("projector/screenNumber", -1).toInt();
51
    int screenNum = settings.value("projector/screenNumber", 1).toInt();
51
    int screenNum = settings.value("projector/screenNumber", 1).toInt();
52
    if(screenNum != -1)
52
    if(screenNum != -1)
53
        projector.reset(new ProjectorOpenGL(screenNum));
53
        projector.reset(new ProjectorOpenGL(screenNum));
54
 
54
 
55
//    // Create rotation stage
55
//    // Create rotation stage
56
//    for(int i = 0; i<10; i++){
56
//    for(int i = 0; i<10; i++){
57
//        try{
57
//        try{
58
//            delete rotationStage.get();
58
//            delete rotationStage.get();
59
//            rotationStage = std::make_shared<RotationStage>();
59
//            rotationStage = std::make_shared<RotationStage>();
60
//            break;
60
//            break;
61
//        }
61
//        }
62
//        catch (...){
62
//        catch (...){
63
//            std::cerr << "trying to setup rotation stage" << std::endl;
63
//            std::cerr << "trying to setup rotation stage" << std::endl;
64
//        }
64
//        }
65
//    }
65
//    }
66
    rotationStage.reset();
66
    rotationStage.reset();
67
    rotationStage.reset(new RotationStage());
67
    rotationStage.reset(new RotationStage());
68
 
68
 
69
    // Create Algorithm
69
    // Create Algorithm
70
    unsigned int screenCols, screenRows;
70
    unsigned int screenCols, screenRows;
71
    projector->getScreenRes(&screenCols, &screenRows);
71
    projector->getScreenRes(&screenCols, &screenRows);
-
 
72
    std::cout << "Screen res: " << screenCols << " x " << screenRows << std::endl;
72
    codec = settings.value("algorithm", "GrayCode").toString();
73
    codec = settings.value("algorithm", "GrayCode").toString();
73
    if(codec == "GrayCode")
74
    if(codec == "GrayCode")
74
        algorithm.reset(new AlgorithmGrayCode(screenCols, screenRows));
75
        algorithm.reset(new AlgorithmGrayCode(screenCols, screenRows));
75
    else if(codec == "GrayCodeHorzVert")
76
    else if(codec == "GrayCodeHorzVert")
76
        algorithm.reset(new AlgorithmGrayCodeHorzVert(screenCols, screenRows));
77
        algorithm.reset(new AlgorithmGrayCodeHorzVert(screenCols, screenRows));
77
    else if(codec == "PhaseShiftTwoFreq")
78
    else if(codec == "PhaseShiftTwoFreq")
78
        algorithm.reset(new AlgorithmPhaseShiftTwoFreq(screenCols, screenRows));
79
        algorithm.reset(new AlgorithmPhaseShiftTwoFreq(screenCols, screenRows));
79
    else if(codec == "PhaseShiftThreeFreq")
80
    else if(codec == "PhaseShiftThreeFreq")
80
        algorithm.reset(new AlgorithmPhaseShiftThreeFreq(screenCols, screenRows));
81
        algorithm.reset(new AlgorithmPhaseShiftThreeFreq(screenCols, screenRows));
81
    else if(codec == "PhaseShiftTwoFreqHorzVert")
82
    else if(codec == "PhaseShiftTwoFreqHorzVert")
82
        algorithm.reset(new AlgorithmPhaseShiftTwoFreqHorzVert(screenCols, screenRows));
83
        algorithm.reset(new AlgorithmPhaseShiftTwoFreqHorzVert(screenCols, screenRows));
83
    else if(codec == "PhaseShiftEmbedded")
84
    else if(codec == "PhaseShiftEmbedded")
84
        algorithm.reset(new AlgorithmPhaseShiftEmbedded(screenCols, screenRows));
85
        algorithm.reset(new AlgorithmPhaseShiftEmbedded(screenCols, screenRows));
85
    else if(codec == "LineShift")
86
    else if(codec == "LineShift")
86
        algorithm.reset(new AlgorithmLineShift(screenCols, screenRows));
87
        algorithm.reset(new AlgorithmLineShift(screenCols, screenRows));
87
    else
88
    else
88
        std::cerr << "SMCaptureWorker: invalid codec " << codec.toStdString() << std::endl;
89
        std::cerr << "SMCaptureWorker: invalid codec " << codec.toStdString() << std::endl;
89
 
90
 
90
    // Upload patterns to projector/GPU
91
    // Upload patterns to projector/GPU
91
    for(unsigned int i=0; i<algorithm->getNPatterns(); i++){
92
    for(unsigned int i=0; i<algorithm->getNPatterns(); i++){
92
        cv::Mat pattern = algorithm->getEncodingPattern(i);
93
        cv::Mat pattern = algorithm->getEncodingPattern(i);
93
        projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows);
94
        projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows);
94
    }
95
    }
95
 
96
 
96
    delay = settings.value("trigger/delay", 50).toInt();
97
    delay = settings.value("trigger/delay", 50).toInt();
97
    stackingCalibration = settings.value("stacking/calibration", 1).toInt();
98
    stackingCalibration = settings.value("stacking/calibration", 1).toInt();
98
    stackingAcquisition= settings.value("stacking/acquisition", 1).toInt();
99
    stackingAcquisition= settings.value("stacking/acquisition", 1).toInt();
99
 
100
 
100
    setupSuccessful = true;
101
    setupSuccessful = true;
101
}
102
}
102
 
103
 
103
 
104
 
104
void SMCaptureWorker::doWork(){
105
void SMCaptureWorker::doWork(){
105
 
106
 
106
    if(!setupSuccessful)
107
    if(!setupSuccessful)
107
        return;
108
        return;
108
 
109
 
109
    working = true;
110
    working = true;
110
 
111
 
111
    cv::Mat checkerboard(8, 8, CV_8UC3);
112
    cv::Mat checkerboard(8, 8, CV_8UC3);
112
    checkerboard.setTo(0);
113
    checkerboard.setTo(0);
113
    checkerboard.rowRange(0, 4).colRange(0, 4).setTo(cv::Vec3b(255,255,255));
114
    checkerboard.rowRange(0, 4).colRange(0, 4).setTo(cv::Vec3b(255,255,255));
114
    checkerboard.rowRange(4, 8).colRange(4, 8).setTo(cv::Vec3b(255,255,255));
115
    checkerboard.rowRange(4, 8).colRange(4, 8).setTo(cv::Vec3b(255,255,255));
115
 
116
 
116
    // Processing loop
117
    // Processing loop
117
//    QTime time;
118
//    QTime time;
118
//    time.start();
119
//    time.start();
119
    while(working){
120
    while(working){
120
 
121
 
121
        if(focusingPattern)
122
        if(focusingPattern)
122
            projector->displayTexture(checkerboard.ptr(), checkerboard.cols, checkerboard.rows);
123
            projector->displayTexture(checkerboard.ptr(), checkerboard.cols, checkerboard.rows);
123
        else
124
        else
124
            projector->displayWhite();
125
            projector->displayWhite();
125
 
126
 
126
 
127
 
127
        // prevent image acquisition timeout
128
        // prevent image acquisition timeout
128
        QTest::qSleep(100);
129
        QTest::qSleep(100);
129
 
130
 
130
        CameraFrame frame;
131
        CameraFrame frame;
131
 
132
 
132
        // trigger cameras
133
        // trigger cameras
133
        camera0->trigger();
134
        camera0->trigger();
134
        camera1->trigger();
135
        camera1->trigger();
135
 
136
 
136
        // retrieve raw frames
137
        // retrieve raw frames
137
        frame = camera0->getFrame();
138
        frame = camera0->getFrame();
138
        cv::Mat frameCV;
139
        cv::Mat frameCV;
139
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
140
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
140
        frameCV = frameCV.clone();
141
        frameCV = frameCV.clone();
141
//        cvtools::rshift(frameCV, 8);
142
//        cvtools::rshift(frameCV, 8);
142
//        frameCV.convertTo(frameCV, CV_8UC1);
143
//        frameCV.convertTo(frameCV, CV_8UC1);
143
        emit newFrame(0, frameCV);
144
        emit newFrame(0, frameCV);
144
 
145
 
145
        frame = camera1->getFrame();
146
        frame = camera1->getFrame();
146
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
147
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
147
        frameCV = frameCV.clone();
148
        frameCV = frameCV.clone();
148
//        cvtools::rshift(frameCV, 8);
149
//        cvtools::rshift(frameCV, 8);
149
//        frameCV.convertTo(frameCV, CV_8UC1);
150
//        frameCV.convertTo(frameCV, CV_8UC1);
150
        emit newFrame(1, frameCV);
151
        emit newFrame(1, frameCV);
151
 
152
 
152
        //std::cout << "SMCaptureWorker idle " << time.restart() << "ms" << std::endl;
153
        //std::cout << "SMCaptureWorker idle " << time.restart() << "ms" << std::endl;
153
 
154
 
154
        // Process events e.g. perform a task
155
        // Process events e.g. perform a task
155
        QCoreApplication::processEvents();
156
        QCoreApplication::processEvents();
156
    }
157
    }
157
 
158
 
158
    emit finished();
159
    emit finished();
159
}
160
}
160
 
161
 
161
void SMCaptureWorker::rotateTo(float angle){
162
void SMCaptureWorker::rotateTo(float angle){
162
    // TODO is this the right check
163
    // TODO is this the right check
163
    if(!setupSuccessful || !rotationStage || !rotationStage->Handle)
164
    if(!setupSuccessful || !rotationStage || !rotationStage->Handle)
164
        return;
165
        return;
165
 
166
 
166
    rotationStage->moveAbsolute(angle);
167
    rotationStage->moveAbsolute(angle);
167
    while(rotationStage->isMoving()){
168
    while(rotationStage->isMoving()){
168
 
169
 
169
        // prevent grab timeout in flycapture
170
        // prevent grab timeout in flycapture
170
        QTest::qSleep(10);
171
        QTest::qSleep(10);
171
 
172
 
172
        // trigger cameras
173
        // trigger cameras
173
        camera0->trigger();
174
        camera0->trigger();
174
        camera1->trigger();
175
        camera1->trigger();
175
 
176
 
176
        // retrieve frames
177
        // retrieve frames
177
        CameraFrame frame;
178
        CameraFrame frame;
178
        frame = camera0->getFrame();
179
        frame = camera0->getFrame();
179
        cv::Mat frameCV;
180
        cv::Mat frameCV;
180
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
181
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
181
        frameCV = frameCV.clone();
182
        frameCV = frameCV.clone();
182
        emit newFrame(0, frameCV);
183
        emit newFrame(0, frameCV);
183
        frame = camera1->getFrame();
184
        frame = camera1->getFrame();
184
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
185
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
185
        frameCV = frameCV.clone();
186
        frameCV = frameCV.clone();
186
        emit newFrame(1, frameCV);
187
        emit newFrame(1, frameCV);
187
    }
188
    }
188
 
189
 
189
    emit rotatedTo(angle);
190
    emit rotatedTo(angle);
190
}
191
}
191
 
192
 
192
void SMCaptureWorker::acquireCalibrationSet(float angle){
193
void SMCaptureWorker::acquireCalibrationSet(float angle){
193
    if(!setupSuccessful || !rotationStage || !rotationStage->Handle)
194
    if(!setupSuccessful || !rotationStage || !rotationStage->Handle)
194
        return;
195
        return;
195
 
196
 
196
    if(angle != -1.0)
197
    if(angle != -1.0)
197
        rotateTo(angle);
198
        rotateTo(angle);
198
 
199
 
199
    //projector->displayWhite();
200
    //projector->displayWhite();
200
 
201
 
201
    // just for safe measures
202
    // just for safe measures
202
    QTest::qSleep(500);
203
    QTest::qSleep(500);
203
 
204
 
204
    CameraFrame frame;
205
    CameraFrame frame;
205
    SMCalibrationSet calibrationSet;
206
    SMCalibrationSet calibrationSet;
206
    cv::Mat frameCVStacked0(camera0->getFrameHeight(), camera0->getFrameWidth(), CV_32SC1, cv::Scalar(0));
207
    cv::Mat frameCVStacked0(camera0->getFrameHeight(), camera0->getFrameWidth(), CV_32SC1, cv::Scalar(0));
207
    cv::Mat frameCVStacked1(camera1->getFrameHeight(), camera1->getFrameWidth(), CV_32SC1, cv::Scalar(0));
208
    cv::Mat frameCVStacked1(camera1->getFrameHeight(), camera1->getFrameWidth(), CV_32SC1, cv::Scalar(0));
208
 
209
 
209
    for(int i=0; i<stackingCalibration; i++){
210
    for(int i=0; i<stackingCalibration; i++){
210
        // trigger cameras
211
        // trigger cameras
211
        camera0->trigger();
212
        camera0->trigger();
212
        camera1->trigger();
213
        camera1->trigger();
213
 
214
 
214
        // retrieve frames
215
        // retrieve frames
215
        frame = camera0->getFrame();
216
        frame = camera0->getFrame();
216
        cv::Mat frameCV;
217
        cv::Mat frameCV;
217
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
218
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
218
        frameCV = frameCV.clone();
219
        frameCV = frameCV.clone();
219
        cv::add(frameCV, frameCVStacked0, frameCVStacked0, cv::noArray(), CV_32SC1);
220
        cv::add(frameCV, frameCVStacked0, frameCVStacked0, cv::noArray(), CV_32SC1);
220
//cvtools::writeMat(frameCV, "frameCV.mat", "frameCV");
221
//cvtools::writeMat(frameCV, "frameCV.mat", "frameCV");
221
//cvtools::writeMat(frameCVStacked0, "frameCVStacked0.mat", "frameCVStacked0");
222
//cvtools::writeMat(frameCVStacked0, "frameCVStacked0.mat", "frameCVStacked0");
222
        emit newFrame(0, frameCV);
223
        emit newFrame(0, frameCV);
223
 
224
 
224
        frame = camera1->getFrame();
225
        frame = camera1->getFrame();
225
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
226
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
226
        frameCV = frameCV.clone();
227
        frameCV = frameCV.clone();
227
        cv::add(frameCV, frameCVStacked1, frameCVStacked1, cv::noArray(), CV_32SC1);
228
        cv::add(frameCV, frameCVStacked1, frameCVStacked1, cv::noArray(), CV_32SC1);
228
 
229
 
229
        emit newFrame(1, frameCV);
230
        emit newFrame(1, frameCV);
230
 
231
 
231
    }
232
    }
232
 
233
 
233
    frameCVStacked0.convertTo(frameCVStacked0, CV_8UC1, 1.0/stackingCalibration);
234
    frameCVStacked0.convertTo(frameCVStacked0, CV_8UC1, 1.0/stackingCalibration);
234
//cvtools::writeMat(frameCVStacked0, "frameCVStacked0a.mat", "frameCVStacked0a");
235
//cvtools::writeMat(frameCVStacked0, "frameCVStacked0a.mat", "frameCVStacked0a");
235
    frameCVStacked1.convertTo(frameCVStacked1, CV_8UC1, 1.0/stackingCalibration);
236
    frameCVStacked1.convertTo(frameCVStacked1, CV_8UC1, 1.0/stackingCalibration);
236
 
237
 
237
    calibrationSet.frame0 = frameCVStacked0;
238
    calibrationSet.frame0 = frameCVStacked0;
238
    calibrationSet.frame1 = frameCVStacked1;
239
    calibrationSet.frame1 = frameCVStacked1;
239
 
240
 
240
    calibrationSet.rotationAngle = rotationStage->getAngle();
241
    calibrationSet.rotationAngle = rotationStage->getAngle();
241
 
242
 
242
    emit newCalibrationSet(calibrationSet);
243
    emit newCalibrationSet(calibrationSet);
243
}
244
}
244
 
245
 
245
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){
246
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){
246
 
247
 
247
    if(!setupSuccessful)
248
    if(!setupSuccessful)
248
        return;
249
        return;
249
 
250
 
250
    for(unsigned int i=0; i<angles.size(); i++)
251
    for(unsigned int i=0; i<angles.size(); i++)
251
        acquireCalibrationSet(angles[i]);
252
        acquireCalibrationSet(angles[i]);
252
}
253
}
253
 
254
 
254
void SMCaptureWorker::acquireFrameSequenceLDR(SMFrameSequence &frameSequence){
255
void SMCaptureWorker::acquireFrameSequenceLDR(SMFrameSequence &frameSequence){
255
 
256
 
256
 
257
 
257
 
258
 
258
    CameraFrame frame;
259
    CameraFrame frame;
259
 
260
 
260
    for(unsigned int i=0; i<algorithm->getNPatterns(); i++){
261
    for(unsigned int i=0; i<algorithm->getNPatterns(); i++){
261
 
262
 
262
        // display pattern
263
        // display pattern
263
        projector->displayPattern(i);
264
        projector->displayPattern(i);
264
 
265
 
265
        QTest::qSleep(delay);
266
        QTest::qSleep(delay);
266
 
267
 
267
        cv::Mat frameCVStacked0(camera0->getFrameHeight(), camera0->getFrameWidth(), CV_32SC1, cv::Scalar(0));
268
        cv::Mat frameCVStacked0(camera0->getFrameHeight(), camera0->getFrameWidth(), CV_32SC1, cv::Scalar(0));
268
        cv::Mat frameCVStacked1(camera1->getFrameHeight(), camera1->getFrameWidth(), CV_32SC1, cv::Scalar(0));
269
        cv::Mat frameCVStacked1(camera1->getFrameHeight(), camera1->getFrameWidth(), CV_32SC1, cv::Scalar(0));
269
        for(int i=0; i<stackingAcquisition; i++){
270
        for(int i=0; i<stackingAcquisition; i++){
270
            // trigger cameras
271
            // trigger cameras
271
            camera0->trigger();
272
            camera0->trigger();
272
            camera1->trigger();
273
            camera1->trigger();
273
 
274
 
274
            // retrieve frames
275
            // retrieve frames
275
            frame = camera0->getFrame();
276
            frame = camera0->getFrame();
276
            cv::Mat frameCV;
277
            cv::Mat frameCV;
277
            frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
278
            frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
278
            frameCV = frameCV.clone();
279
            frameCV = frameCV.clone();
279
            cv::add(frameCV, frameCVStacked0, frameCVStacked0, cv::noArray(), CV_32SC1);
280
            cv::add(frameCV, frameCVStacked0, frameCVStacked0, cv::noArray(), CV_32SC1);
280
 
281
 
281
            emit newFrame(0, frameCV);
282
            emit newFrame(0, frameCV);
282
 
283
 
283
            frame = camera1->getFrame();
284
            frame = camera1->getFrame();
284
            frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
285
            frameCV  = cv::Mat(frame.height, frame.width, CV_8UC1, frame.memory);
285
            frameCV = frameCV.clone();
286
            frameCV = frameCV.clone();
286
            cv::add(frameCV, frameCVStacked1, frameCVStacked1, cv::noArray(), CV_32SC1);
287
            cv::add(frameCV, frameCVStacked1, frameCVStacked1, cv::noArray(), CV_32SC1);
287
 
288
 
288
            emit newFrame(1, frameCV);
289
            emit newFrame(1, frameCV);
289
 
290
 
290
        }
291
        }
291
 
292
 
292
        frameCVStacked0.convertTo(frameCVStacked0, CV_8UC1, 1.0/stackingAcquisition);
293
        frameCVStacked0.convertTo(frameCVStacked0, CV_8UC1, 1.0/stackingAcquisition);
293
        frameCVStacked1.convertTo(frameCVStacked1, CV_8UC1, 1.0/stackingAcquisition);
294
        frameCVStacked1.convertTo(frameCVStacked1, CV_8UC1, 1.0/stackingAcquisition);
294
 
295
 
295
        frameSequence.frames0.push_back(frameCVStacked0);
296
        frameSequence.frames0.push_back(frameCVStacked0);
296
        frameSequence.frames1.push_back(frameCVStacked1);
297
        frameSequence.frames1.push_back(frameCVStacked1);
297
 
298
 
298
    }
299
    }
299
 
300
 
300
 
301
 
301
}
302
}
302
 
303
 
303
void SMCaptureWorker::acquireFrameSequenceHDR(SMFrameSequence &frameSequence){
304
void SMCaptureWorker::acquireFrameSequenceHDR(SMFrameSequence &frameSequence){
304
 
305
 
305
    QSettings settings;
306
    QSettings settings;
306
    QString shuttersString = settings.value("camera/shuttersHDR").toString();
307
    QString shuttersString = settings.value("camera/shuttersHDR").toString();
307
    QStringList list = shuttersString.split("/");
308
    QStringList list = shuttersString.split("/");
308
    std::vector<float> shutters(list.size());
309
    std::vector<float> shutters(list.size());
309
    for(int i=0; i<list.size(); i++)
310
    for(int i=0; i<list.size(); i++)
310
        shutters[i] = list[i].toFloat();
311
        shutters[i] = list[i].toFloat();
311
    if(shutters.empty()){
312
    if(shutters.empty()){
312
        std::cerr << "Could not read HDR shutter times" << std::endl;
313
        std::cerr << "Could not read HDR shutter times" << std::endl;
313
        return;
314
        return;
314
    }
315
    }
315
 
316
 
316
    int nShutters = shutters.size();
317
    int nShutters = shutters.size();
317
 
318
 
318
    CameraSettings cameraSettings;
319
    CameraSettings cameraSettings;
319
 
320
 
320
    for(int i=0; i<nShutters; i++){
321
    for(int i=0; i<nShutters; i++){
-
 
322
        std::cout << "Acquiring HDR frame sequence "
-
 
323
                  << i + 1 << "/" << nShutters << std::endl;
-
 
324
        std::cout << "Shutter time [ms] "
-
 
325
                  << shutters[i] << std::endl;
321
 
326
 
322
        // Set camera shutter
327
        // Set camera shutter
323
        cameraSettings.shutter = shutters[i];
328
        cameraSettings.shutter = shutters[i];
324
 
329
 
325
        // assert that shutter is given in ms
330
        // assert that shutter is given in ms
326
        assert(cameraSettings.shutter < 2000.0);
331
        assert(cameraSettings.shutter < 2000.0);
327
 
332
 
328
        camera0->setCameraSettings(cameraSettings);
333
        camera0->setCameraSettings(cameraSettings);
329
        camera1->setCameraSettings(cameraSettings);
334
        camera1->setCameraSettings(cameraSettings);
330
 
335
 
331
        // Project/acquire sequence
336
        // Project/acquire sequence
332
        SMFrameSequence frameSequenceLDR;
337
        SMFrameSequence frameSequenceLDR;
333
        acquireFrameSequenceLDR(frameSequenceLDR);
338
        acquireFrameSequenceLDR(frameSequenceLDR);
334
 
339
 
335
        frameSequence.frames0.insert(frameSequence.frames0.end(), frameSequenceLDR.frames0.begin(), frameSequenceLDR.frames0.end());
340
        frameSequence.frames0.insert(frameSequence.frames0.end(), frameSequenceLDR.frames0.begin(), frameSequenceLDR.frames0.end());
336
        frameSequence.frames1.insert(frameSequence.frames1.end(), frameSequenceLDR.frames1.begin(), frameSequenceLDR.frames1.end());
341
        frameSequence.frames1.insert(frameSequence.frames1.end(), frameSequenceLDR.frames1.begin(), frameSequenceLDR.frames1.end());
337
 
342
 
338
    }
343
    }
339
 
344
 
340
    frameSequence.shutters = shutters;
345
    frameSequence.shutters = shutters;
341
 
346
 
342
    // Set camera shutter back to default
347
    // Set camera shutter back to default
343
    cameraSettings.shutter = settings.value("shutter", 66.666).toFloat();
348
    cameraSettings.shutter = settings.value("shutter", 66.666).toFloat();
344
 
349
 
345
    camera0->setCameraSettings(cameraSettings);
350
    camera0->setCameraSettings(cameraSettings);
346
    camera1->setCameraSettings(cameraSettings);
351
    camera1->setCameraSettings(cameraSettings);
347
 
352
 
348
}
353
}
349
 
354
 
350
 
355
 
351
void SMCaptureWorker::acquireFrameSequence(float angle){
356
void SMCaptureWorker::acquireFrameSequence(float angle){
352
 
357
 
353
    if(!setupSuccessful)
358
    if(!setupSuccessful)
354
        return;
359
        return;
355
 
360
 
356
    if(int(angle) != -1.0)
361
    if(int(angle) != -1.0)
357
        rotateTo(angle);
362
        rotateTo(angle);
358
 
363
 
359
    SMFrameSequence frameSequence;
364
    SMFrameSequence frameSequence;
360
 
365
 
361
    QSettings settings;
366
    QSettings settings;
362
    if(settings.contains("camera/shuttersHDR"))
367
    bool HDR = settings.value("camera/shuttersHDR").toString() != QString("");
-
 
368
    if(HDR)
363
        acquireFrameSequenceHDR(frameSequence);
369
        acquireFrameSequenceHDR(frameSequence);
364
    else
370
    else
365
        acquireFrameSequenceLDR(frameSequence);
371
        acquireFrameSequenceLDR(frameSequence);
366
 
372
 
367
 
373
 
368
    if(rotationStage && rotationStage->Handle)// TODO is this the right check
374
    if(rotationStage && rotationStage->Handle)// TODO is this the right check
369
        frameSequence.rotationAngle = rotationStage->getAngle();
375
        frameSequence.rotationAngle = rotationStage->getAngle();
370
    else
376
    else
371
        frameSequence.rotationAngle = 0;
377
        frameSequence.rotationAngle = 0;
372
 
378
 
373
    frameSequence.codec = codec;
379
    frameSequence.codec = codec;
374
 
380
 
375
    emit newFrameSequence(frameSequence);
381
    emit newFrameSequence(frameSequence);
376
 
382
 
377
    projector->displayWhite();
383
    projector->displayWhite();
378
}
384
}
379
 
385
 
380
 
386
 
381
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){
387
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){
382
 
388
 
383
    if(!setupSuccessful)
389
    if(!setupSuccessful)
384
        return;
390
        return;
385
 
391
 
386
    for(unsigned int i=0; i<angles.size(); i++)
392
    for(unsigned int i=0; i<angles.size(); i++)
387
        acquireFrameSequence(angles[i]);
393
        acquireFrameSequence(angles[i]);
388
}
394
}
389
 
395
 
390
void SMCaptureWorker::abort(){}
396
void SMCaptureWorker::abort(){}
391
 
397
 
392
void SMCaptureWorker::stopWork(){
398
void SMCaptureWorker::stopWork(){
393
    working = false;
399
    working = false;
394
}
400
}
395
 
401
 
396
 
402