Subversion Repositories seema-scanner

Rev

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

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