Subversion Repositories seema-scanner

Rev

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

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