Subversion Repositories seema-scanner

Rev

Rev 27 | Rev 36 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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