Subversion Repositories seema-scanner

Rev

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

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