Subversion Repositories seema-scanner

Rev

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