Subversion Repositories seema-scanner

Rev

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

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