Subversion Repositories seema-scanner

Rev

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

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