Subversion Repositories seema-scanner

Rev

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

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