Subversion Repositories seema-scanner

Rev

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

Rev 27 Rev 30
1
#include "SMCaptureWorker.h"
1
#include "SMCaptureWorker.h"
2
 
2
 
3
#include "CodecGrayCode.h"
3
#include "CodecGrayCode.h"
4
#include "CodecPhaseShift.h"
4
#include "CodecPhaseShift.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
    // Create rotation stage
13
    // Create rotation stage
14
    rotationStage = new RotationStage();
14
    rotationStage = new RotationStage();
15
 
15
 
16
    QSettings settings;
16
    QSettings settings;
17
 
17
 
18
    // Create cameras
18
    // Create cameras
19
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
19
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
20
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
20
    int cNum0 = settings.value("camera0/cameraNumber", -1).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", -1).toInt();
24
    int iNum1 = settings.value("camera1/interfaceNumber", -1).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 encoder
49
    // Create encoder
50
    CodecDir dir = (CodecDir)settings.value("pattern/direction", CodecDirHorizontal).toInt();
50
    CodecDir dir = (CodecDir)settings.value("pattern/direction", CodecDirHorizontal).toInt();
51
    if(dir == CodecDirNone)
51
    if(dir == CodecDirNone)
52
        std::cerr << "SMCaptureWorker: invalid coding direction " << std::endl;
52
        std::cerr << "SMCaptureWorker: invalid coding direction " << std::endl;
53
 
53
 
54
    codec = settings.value("codec", "GrayCode").toString();
54
    codec = settings.value("codec", "GrayCode").toString();
55
    if(codec == "PhaseShift")
55
    if(codec == "PhaseShift")
56
        encoder = new EncoderPhaseShift(screenCols, screenRows, dir);
56
        encoder = new EncoderPhaseShift(screenCols, screenRows, dir);
57
    else if(codec == "GrayCode")
57
    else if(codec == "GrayCode")
58
        encoder = new EncoderGrayCode(screenCols, screenRows, dir);
58
        encoder = new EncoderGrayCode(screenCols, screenRows, dir);
59
    else
59
    else
60
        std::cerr << "SLScanWorker: invalid codec " << codec.toStdString() << std::endl;
60
        std::cerr << "SLScanWorker: invalid codec " << codec.toStdString() << std::endl;
61
 
61
 
62
 
62
 
63
    // Upload patterns to projector/GPU
63
    // Upload patterns to projector/GPU
64
    for(unsigned int i=0; i<encoder->getNPatterns(); i++){
64
    for(unsigned int i=0; i<encoder->getNPatterns(); i++){
65
        cv::Mat pattern = encoder->getEncodingPattern(i);
65
        cv::Mat pattern = encoder->getEncodingPattern(i);
66
        projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows);
66
        projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows);
67
    }
67
    }
68
 
68
 
69
    delay = settings.value("trigger/delay", 50).toInt();
69
    delay = settings.value("trigger/delay", 50).toInt();
70
}
70
}
71
 
71
 
72
 
72
 
73
void SMCaptureWorker::doWork(){
73
void SMCaptureWorker::doWork(){
74
 
74
 
75
    working = true;
75
    working = true;
76
 
76
 
77
    // Processing loop
77
    // Processing loop
78
    QTime time;
78
    QTime time;
79
    time.start();
79
    time.start();
80
    while(working){
80
    while(working){
81
 
81
 
82
        projector->displayWhite();
82
        projector->displayWhite();
83
 
83
 
84
        std::vector<cv::Mat> frameSet;
84
        std::vector<cv::Mat> frameSet;
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 frames
92
        // retrieve 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_8UC3, frame.memory);
95
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
96
        frameCV = frameCV.clone();
96
        frameCV = frameCV.clone();
97
        frameSet.push_back(frameCV);
97
        frameSet.push_back(frameCV);
98
 
98
 
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_8UC3, frame.memory);
102
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
103
        frameCV = frameCV.clone();
103
        frameCV = frameCV.clone();
104
        frameSet.push_back(frameCV);
104
        frameSet.push_back(frameCV);
105
 
105
 
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
    std::cout << "Moving to: " << angle << std::endl;
119
    std::cout << "Moving to: " << angle << std::endl;
120
    rotationStage->moveAbsolute(angle);
120
    rotationStage->moveAbsolute(angle);
121
    rotationStage->wait();
121
    rotationStage->wait();
-
 
122
 
-
 
123
    emit rotatedTo(angle);
122
}
124
}
123
 
125
 
124
void SMCaptureWorker::acquireCalibrationSet(float angle){
126
void SMCaptureWorker::acquireCalibrationSet(float angle){
125
 
127
 
126
    if(angle != -1.0)
128
    if(angle != -1.0)
127
        rotateTo(angle);
129
        rotateTo(angle);
128
 
130
 
129
    CameraFrame frame;
131
    CameraFrame frame;
130
    SMCalibrationSet calibrationSet;
132
    SMCalibrationSet calibrationSet;
131
 
133
 
132
    // trigger cameras
134
    // trigger cameras
133
    camera0->trigger();
135
    camera0->trigger();
134
    camera1->trigger();
136
    camera1->trigger();
135
 
137
 
136
    // retrieve frames
138
    // retrieve frames
137
    frame = camera0->getFrame();
139
    frame = camera0->getFrame();
138
    cv::Mat frameCV;
140
    cv::Mat frameCV;
139
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
141
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
140
    frameCV = frameCV.clone();
142
    frameCV = frameCV.clone();
141
 
143
 
142
    emit newFrame(0, frameCV);
144
    emit newFrame(0, frameCV);
143
    calibrationSet.frame0 = frameCV;
145
    calibrationSet.frame0 = frameCV;
144
 
146
 
145
    frame = camera1->getFrame();
147
    frame = camera1->getFrame();
146
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
148
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
147
    frameCV = frameCV.clone();
149
    frameCV = frameCV.clone();
148
 
150
 
149
    emit newFrame(1, frameCV);
151
    emit newFrame(1, frameCV);
150
    calibrationSet.frame1 = frameCV;
152
    calibrationSet.frame1 = frameCV;
151
 
153
 
152
    calibrationSet.rotationAngle = rotationStage->getAngle();
154
    calibrationSet.rotationAngle = rotationStage->getAngle();
153
 
155
 
154
    emit newCalibrationSet(calibrationSet);
156
    emit newCalibrationSet(calibrationSet);
155
}
157
}
156
 
158
 
157
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){}
159
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){
-
 
160
 
-
 
161
    for(int i=0; i<angles.size(); i++)
-
 
162
        acquireCalibrationSet(angles[i]);
-
 
163
}
158
 
164
 
159
void SMCaptureWorker::acquireFrameSequence(float angle){
165
void SMCaptureWorker::acquireFrameSequence(float angle){
160
 
166
 
161
    if(angle != -1.0)
167
    if(angle != -1.0)
162
        rotateTo(angle);
168
        rotateTo(angle);
163
 
169
 
164
    CameraFrame frame;
170
    CameraFrame frame;
165
 
171
 
166
    SMFrameSequence frameSequence;
172
    SMFrameSequence frameSequence;
167
 
173
 
168
    for(unsigned int i=0; i<encoder->getNPatterns(); i++){
174
    for(unsigned int i=0; i<encoder->getNPatterns(); i++){
169
 
175
 
170
        // display pattern
176
        // display pattern
171
        projector->displayPattern(i);
177
        projector->displayPattern(i);
172
 
178
 
173
        QTest::qSleep(delay);
179
        QTest::qSleep(delay);
174
 
180
 
175
        // trigger cameras
181
        // trigger cameras
176
        camera0->trigger();
182
        camera0->trigger();
177
        camera1->trigger();
183
        camera1->trigger();
178
 
184
 
179
        // retrieve frames
185
        // retrieve frames
180
        frame = camera0->getFrame();
186
        frame = camera0->getFrame();
181
        cv::Mat frameCV;
187
        cv::Mat frameCV;
182
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
188
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
183
        frameCV = frameCV.clone();
189
        frameCV = frameCV.clone();
184
 
190
 
185
        emit newFrame(0, frameCV);
191
        emit newFrame(0, frameCV);
186
        frameSequence.frames0.push_back(frameCV);
192
        frameSequence.frames0.push_back(frameCV);
187
 
193
 
188
        frame = camera1->getFrame();
194
        frame = camera1->getFrame();
189
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
195
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
190
        frameCV = frameCV.clone();
196
        frameCV = frameCV.clone();
191
 
197
 
192
        emit newFrame(1, frameCV);
198
        emit newFrame(1, frameCV);
193
        frameSequence.frames1.push_back(frameCV);
199
        frameSequence.frames1.push_back(frameCV);
194
 
200
 
195
    }
201
    }
196
 
202
 
197
    frameSequence.rotationAngle = rotationStage->getAngle();
203
    frameSequence.rotationAngle = rotationStage->getAngle();
198
    frameSequence.codec = codec;
204
    frameSequence.codec = codec;
199
 
205
 
200
    emit newFrameSequence(frameSequence);
206
    emit newFrameSequence(frameSequence);
201
 
207
 
202
}
208
}
203
 
209
 
204
 
210
 
205
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){}
211
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){
-
 
212
 
-
 
213
    for(int i=0; i<angles.size(); i++)
-
 
214
        acquireFrameSequence(angles[i]);
-
 
215
}
206
 
216
 
207
void SMCaptureWorker::abort(){}
217
void SMCaptureWorker::abort(){}
208
 
218
 
209
void SMCaptureWorker::stopWork(){
219
void SMCaptureWorker::stopWork(){
210
    working = false;
220
    working = false;
211
}
221
}
212
 
222
 
213
SMCaptureWorker::~SMCaptureWorker(){
223
SMCaptureWorker::~SMCaptureWorker(){
214
    delete projector;
224
    delete projector;
215
    delete camera0;
225
    delete camera0;
216
    delete camera1;
226
    delete camera1;
217
    delete rotationStage;
227
    delete rotationStage;
218
}
228
}
219
 
229