Subversion Repositories seema-scanner

Rev

Rev 23 | Rev 30 | 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();
9 jakw 122
}
123
 
23 jakw 124
void SMCaptureWorker::acquireCalibrationSet(float angle){
125
 
27 jakw 126
    if(angle != -1.0)
127
        rotateTo(angle);
128
 
23 jakw 129
    CameraFrame frame;
27 jakw 130
    SMCalibrationSet calibrationSet;
23 jakw 131
 
132
    // trigger cameras
133
    camera0->trigger();
134
    camera1->trigger();
135
 
136
    // retrieve frames
137
    frame = camera0->getFrame();
138
    cv::Mat frameCV;
139
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
140
    frameCV = frameCV.clone();
141
 
27 jakw 142
    emit newFrame(0, frameCV);
23 jakw 143
    calibrationSet.frame0 = frameCV;
144
 
145
    frame = camera1->getFrame();
146
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
147
    frameCV = frameCV.clone();
148
 
27 jakw 149
    emit newFrame(1, frameCV);
23 jakw 150
    calibrationSet.frame1 = frameCV;
151
 
27 jakw 152
    calibrationSet.rotationAngle = rotationStage->getAngle();
23 jakw 153
 
154
    emit newCalibrationSet(calibrationSet);
9 jakw 155
}
156
 
23 jakw 157
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){}
9 jakw 158
 
27 jakw 159
void SMCaptureWorker::acquireFrameSequence(float angle){
160
 
161
    if(angle != -1.0)
162
        rotateTo(angle);
163
 
164
    CameraFrame frame;
165
 
166
    SMFrameSequence frameSequence;
167
 
168
    for(unsigned int i=0; i<encoder->getNPatterns(); i++){
169
 
170
        // display pattern
171
        projector->displayPattern(i);
172
 
173
        QTest::qSleep(delay);
174
 
175
        // trigger cameras
176
        camera0->trigger();
177
        camera1->trigger();
178
 
179
        // retrieve frames
180
        frame = camera0->getFrame();
181
        cv::Mat frameCV;
182
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
183
        frameCV = frameCV.clone();
184
 
185
        emit newFrame(0, frameCV);
186
        frameSequence.frames0.push_back(frameCV);
187
 
188
        frame = camera1->getFrame();
189
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
190
        frameCV = frameCV.clone();
191
 
192
        emit newFrame(1, frameCV);
193
        frameSequence.frames1.push_back(frameCV);
194
 
195
    }
196
 
197
    frameSequence.rotationAngle = rotationStage->getAngle();
198
    frameSequence.codec = codec;
199
 
200
    emit newFrameSequence(frameSequence);
201
 
202
}
203
 
204
 
23 jakw 205
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){}
206
 
207
void SMCaptureWorker::abort(){}
208
 
209
void SMCaptureWorker::stopWork(){
210
    working = false;
211
}
212
 
9 jakw 213
SMCaptureWorker::~SMCaptureWorker(){
23 jakw 214
    delete projector;
9 jakw 215
    delete camera0;
216
    delete camera1;
23 jakw 217
    delete rotationStage;
9 jakw 218
}