Subversion Repositories seema-scanner

Rev

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

Rev 32 Rev 36
1
#include "SMScanner.h"
1
#include "SMScanner.h"
2
#include "ui_SMScanner.h"
2
#include "ui_SMScanner.h"
3
 
3
 
4
#include <QMetaObject>
4
#include <QMetaObject>
-
 
5
#include <QFileDialog>
5
 
6
 
6
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner),
7
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner),
7
                                        calibrationReviewMode(false), captureReviewMode(false){
8
                                        calibrationReviewMode(false), captureReviewMode(false){
8
    ui->setupUi(this);
9
    ui->setupUi(this);
9
 
10
 
10
    // Register metatypes
11
    // Register metatypes
11
    qRegisterMetaType<cv::Mat>("cv::Mat");
12
    qRegisterMetaType<cv::Mat>("cv::Mat");
12
    qRegisterMetaType< std::vector<cv::Mat> >("std::vector<cv::Mat>");
13
    qRegisterMetaType< std::vector<cv::Mat> >("std::vector<cv::Mat>");
13
    qRegisterMetaType< std::vector<float> >("std::vector<float>");
14
    qRegisterMetaType< std::vector<float> >("std::vector<float>");
14
    qRegisterMetaType<SMCalibrationSet>("SMCalibrationSet");
15
    qRegisterMetaType<SMCalibrationSet>("SMCalibrationSet");
15
    qRegisterMetaType<SMCalibrationParameters>("SMCalibrationParameters");
16
    qRegisterMetaType<SMCalibrationParameters>("SMCalibrationParameters");
16
    qRegisterMetaTypeStreamOperators<SMCalibrationParameters>("SMCalibrationParameters");
17
    qRegisterMetaTypeStreamOperators<SMCalibrationParameters>("SMCalibrationParameters");
17
    qRegisterMetaType< std::vector<SMCalibrationSet> >("std::vector<SMCalibrationSet>");
18
    qRegisterMetaType< std::vector<SMCalibrationSet> >("std::vector<SMCalibrationSet>");
18
    qRegisterMetaType<SMFrameSequence>("SMFrameSequence");
19
    qRegisterMetaType<SMFrameSequence>("SMFrameSequence");
19
 
20
 
20
    // Restore geometry
21
    // Restore geometry
21
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
22
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
22
    this->restoreState(settings.value("state/mainwindow").toByteArray());
23
    this->restoreState(settings.value("state/mainwindow").toByteArray());
23
 
24
 
24
    // Set up threads
25
    // Set up threads
25
    captureWorker = new SMCaptureWorker;
26
    captureWorker = new SMCaptureWorker;
26
    captureWorkerThread = new QThread(this);
27
    captureWorkerThread = new QThread(this);
27
    captureWorkerThread->setObjectName("captureWorkerThread");
28
    captureWorkerThread->setObjectName("captureWorkerThread");
28
    captureWorker->moveToThread(captureWorkerThread);
29
    captureWorker->moveToThread(captureWorkerThread);
29
    captureWorkerThread->start();
30
    captureWorkerThread->start();
30
 
31
 
31
    // Connections
32
    // Connections
32
    connect(captureWorker, SIGNAL(newFrame(unsigned int, cv::Mat)), this, SLOT(onReceiveFrame(unsigned int, cv::Mat)));
33
    connect(captureWorker, SIGNAL(newFrame(unsigned int, cv::Mat)), this, SLOT(onReceiveFrame(unsigned int, cv::Mat)));
33
    connect(captureWorker, SIGNAL(newCalibrationSet(SMCalibrationSet)), this, SLOT(onReceiveCalibrationSet(SMCalibrationSet)));
34
    connect(captureWorker, SIGNAL(newCalibrationSet(SMCalibrationSet)), this, SLOT(onReceiveCalibrationSet(SMCalibrationSet)));
34
    connect(captureWorker, SIGNAL(newFrameSequence(SMFrameSequence)), this, SLOT(onReceiveFrameSequence(SMFrameSequence)));
35
    connect(captureWorker, SIGNAL(newFrameSequence(SMFrameSequence)), this, SLOT(onReceiveFrameSequence(SMFrameSequence)));
35
    connect(captureWorker, SIGNAL(rotatedTo(float)), this, SLOT(onReceiveRotatedTo(float)));
36
    connect(captureWorker, SIGNAL(rotatedTo(float)), this, SLOT(onReceiveRotatedTo(float)));
36
 
37
 
37
    // Start capturing
38
    // Start capturing
38
    QMetaObject::invokeMethod(captureWorker, "setup");
39
    QMetaObject::invokeMethod(captureWorker, "setup");
39
    QMetaObject::invokeMethod(captureWorker, "doWork");
40
    QMetaObject::invokeMethod(captureWorker, "doWork");
40
 
41
 
41
}
42
}
42
 
43
 
43
void SMScanner::onReceiveFrame(unsigned int camId, cv::Mat frame){
44
void SMScanner::onReceiveFrame(unsigned int camId, cv::Mat frame){
44
 
45
 
45
    if(camId == 0){
46
    if(camId == 0){
46
        if(!calibrationReviewMode)
47
        if(!calibrationReviewMode)
47
            ui->calibrationCamera0Widget->showImageCV(frame);
48
            ui->calibrationCamera0Widget->showImageCV(frame);
48
        if(!captureReviewMode)
49
        if(!captureReviewMode)
49
            ui->captureCamera0Widget->showImageCV(frame);
50
            ui->captureCamera0Widget->showImageCV(frame);
50
    } else if(camId == 1){
51
    } else if(camId == 1){
51
        if(!calibrationReviewMode)
52
        if(!calibrationReviewMode)
52
            ui->calibrationCamera1Widget->showImageCV(frame);
53
            ui->calibrationCamera1Widget->showImageCV(frame);
53
        if(!captureReviewMode)
54
        if(!captureReviewMode)
54
            ui->captureCamera1Widget->showImageCV(frame);
55
            ui->captureCamera1Widget->showImageCV(frame);
55
    }
56
    }
56
}
57
}
57
 
58
 
58
void SMScanner::on_actionPreferences_triggered(){
59
void SMScanner::on_actionPreferences_triggered(){
59
 
60
 
60
    preferenceDialog.show();
61
    preferenceDialog.show();
61
}
62
}
62
 
63
 
63
void SMScanner::closeEvent(QCloseEvent *event){
64
void SMScanner::closeEvent(QCloseEvent *event){
64
 
65
 
65
    // Stop capturing thread
66
    // Stop capturing thread
66
    connect(captureWorker, SIGNAL(finished()), captureWorker, SLOT(deleteLater()));
67
    connect(captureWorker, SIGNAL(finished()), captureWorker, SLOT(deleteLater()));
67
    connect(captureWorker, SIGNAL(finished()), captureWorkerThread, SLOT(quit()));
68
    connect(captureWorker, SIGNAL(finished()), captureWorkerThread, SLOT(quit()));
68
    QMetaObject::invokeMethod(captureWorker, "stopWork");
69
    QMetaObject::invokeMethod(captureWorker, "stopWork");
69
    captureWorkerThread->quit();
70
    captureWorkerThread->quit();
70
    captureWorkerThread->wait();
71
    captureWorkerThread->wait();
71
 
72
 
72
    // Save window geometry
73
    // Save window geometry
73
    settings.setValue("geometry/mainwindow", this->saveGeometry());
74
    settings.setValue("geometry/mainwindow", this->saveGeometry());
74
    settings.setValue("state/mainwindow", this->saveState());
75
    settings.setValue("state/mainwindow", this->saveState());
75
 
76
 
76
    event->accept();
77
    event->accept();
77
 
78
 
78
}
79
}
79
 
80
 
80
SMScanner::~SMScanner(){
81
SMScanner::~SMScanner(){
81
    delete ui;
82
    delete ui;
82
}
83
}
83
 
84
 
84
void SMScanner::on_singleCalibrationButton_clicked(){
85
void SMScanner::on_singleCalibrationButton_clicked(){
85
 
86
 
86
    // If in review mode, go back to aquisition mode
87
    // If in review mode, go back to aquisition mode
87
    if(calibrationReviewMode){
88
    if(calibrationReviewMode){
88
        ui->calibrationListWidget->clearSelection();
89
        ui->calibrationListWidget->clearSelection();
89
        ui->singleCalibrationButton->setText("Single Aquisition");
90
        ui->singleCalibrationButton->setText("Single Aquisition");
90
        ui->batchCalibrationButton->setText("Batch Aquisition");
91
        ui->batchCalibrationButton->setText("Batch Aquisition");
91
        calibrationReviewMode = false;
92
        calibrationReviewMode = false;
92
        return;
93
        return;
93
    }
94
    }
94
 
95
 
95
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSet", Q_ARG(float, -1.0));
96
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSet", Q_ARG(float, -1.0));
96
 
97
 
97
}
98
}
98
 
99
 
99
 
100
 
100
void SMScanner::on_batchCalibrationButton_clicked(){
101
void SMScanner::on_batchCalibrationButton_clicked(){
101
 
102
 
102
    // If in review mode, go back to aquisition mode
103
    // If in review mode, go back to aquisition mode
103
    if(calibrationReviewMode){
104
    if(calibrationReviewMode){
104
        ui->calibrationListWidget->clearSelection();
105
        ui->calibrationListWidget->clearSelection();
105
        ui->singleCalibrationButton->setText("Single Aquisition");
106
        ui->singleCalibrationButton->setText("Single Aquisition");
106
        ui->batchCalibrationButton->setText("Batch Aquisition");
107
        ui->batchCalibrationButton->setText("Batch Aquisition");
107
        calibrationReviewMode = false;
108
        calibrationReviewMode = false;
108
        return;
109
        return;
109
    }
110
    }
110
 
111
 
111
    // Construct vector of angles
112
    // Construct vector of angles
112
    int angleStart = ui->calibrationBatchStartSpinBox->value();
113
    int angleStart = ui->calibrationBatchStartSpinBox->value();
113
    int angleEnd = ui->calibrationBatchEndSpinBox->value();
114
    int angleEnd = ui->calibrationBatchEndSpinBox->value();
114
    int angleStep = ui->calibrationBatchStepSpinBox->value();
115
    int angleStep = ui->calibrationBatchStepSpinBox->value();
115
 
116
 
116
    if(angleStart > angleEnd)
117
    if(angleStart > angleEnd)
117
        angleEnd += 360;
118
        angleEnd += 360;
118
 
119
 
119
    std::vector<float> angles;
120
    std::vector<float> angles;
120
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
121
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
121
        angles.push_back(i % 360);
122
        angles.push_back(i % 360);
122
 
123
 
123
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSets", Q_ARG(std::vector<float>, angles));
124
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSets", Q_ARG(std::vector<float>, angles));
124
 
125
 
125
    std::cout << "Aquiring sets at ";
126
    std::cout << "Aquiring sets at ";
126
    for(int i=0; i<angles.size(); i++)
127
    for(int i=0; i<angles.size(); i++)
127
        std::cout << angles[i] << " ";
128
        std::cout << angles[i] << " ";
128
    std::cout << " degrees" <<std::endl;
129
    std::cout << " degrees" <<std::endl;
129
}
130
}
130
 
131
 
131
 
132
 
132
void SMScanner::on_calibrationRotationDial_sliderReleased(){
133
void SMScanner::on_calibrationRotationDial_sliderReleased(){
133
 
134
 
134
    float angle = ui->calibrationRotationDial->value();
135
    float angle = ui->calibrationRotationDial->value();
135
    std::cout << "Rotation stage target: " << angle << std::endl;
136
    std::cout << "Rotation stage target: " << angle << std::endl;
136
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
137
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
137
 
138
 
138
    ui->captureRotationDial->setValue(ui->calibrationRotationDial->value());
139
    ui->captureRotationDial->setValue(ui->calibrationRotationDial->value());
139
}
140
}
140
 
141
 
141
void SMScanner::onReceiveCalibrationSet(SMCalibrationSet calibrationSet){
142
void SMScanner::onReceiveCalibrationSet(SMCalibrationSet calibrationSet){
142
    calibrationData.push_back(calibrationSet);
143
    calibrationData.push_back(calibrationSet);
143
 
144
 
144
    // Add identifier to list
145
    // Add identifier to list
145
    QListWidgetItem* item = new QListWidgetItem(QString("Calibration Set %1 -- %2 deg").arg(ui->calibrationListWidget->count()).arg(calibrationSet.rotationAngle), ui->calibrationListWidget);
146
    QListWidgetItem* item = new QListWidgetItem(QString("Calibration Set %1 -- %2 deg").arg(ui->calibrationListWidget->count()).arg(calibrationSet.rotationAngle), ui->calibrationListWidget);
146
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
147
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
147
    item->setCheckState(Qt::Checked);
148
    item->setCheckState(Qt::Checked);
148
    ui->calibrationListWidget->addItem(item);
149
    ui->calibrationListWidget->addItem(item);
149
 
150
 
150
    // Set enabled checkmark
151
    // Set enabled checkmark
151
    if(calibrationData.size() >= 2)
152
    if(calibrationData.size() >= 2)
152
        ui->calibrateButton->setEnabled(true);
153
        ui->calibrateButton->setEnabled(true);
153
}
154
}
154
 
155
 
155
void SMScanner::on_calibrateButton_clicked(){
156
void SMScanner::on_calibrateButton_clicked(){
156
 
157
 
157
    // disable ui elements
158
    // disable ui elements
158
    ui->calibrateButton->setEnabled(false);
159
    ui->calibrateButton->setEnabled(false);
159
    ui->calibrationFrame->setEnabled(false);
160
    ui->calibrationFrame->setEnabled(false);
160
 
161
 
161
    // set checked flags
162
    // set checked flags
162
    for(int i=0; i<calibrationData.size(); i++){
163
    for(int i=0; i<calibrationData.size(); i++){
163
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
164
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
164
    }
165
    }
165
 
166
 
166
//    SMCalibrationWorker calibrationWorker;
167
//    SMCalibrationWorker calibrationWorker;
167
//    calibrationWorker.performCalibration(calibrationData);
168
//    calibrationWorker.performCalibration(calibrationData);
168
 
169
 
169
    // Set up calibration thread
170
    // Set up calibration thread
170
    calibrationWorker = new SMCalibrationWorker;
171
    calibrationWorker = new SMCalibrationWorker;
171
    calibrationWorkerThread = new QThread(this);
172
    calibrationWorkerThread = new QThread(this);
172
    calibrationWorkerThread->setObjectName("calibrationWorkerThread");
173
    calibrationWorkerThread->setObjectName("calibrationWorkerThread");
173
    calibrationWorker->moveToThread(captureWorkerThread);
174
    calibrationWorker->moveToThread(captureWorkerThread);
174
    calibrationWorkerThread->start();
175
    calibrationWorkerThread->start();
175
 
176
 
176
    // Connections
177
    // Connections
177
    connect(calibrationWorker, SIGNAL(newSetProcessed(int)), this, SLOT(onCalibrationSetProcessed(int)));
178
    connect(calibrationWorker, SIGNAL(newSetProcessed(int)), this, SLOT(onCalibrationSetProcessed(int)));
178
    connect(calibrationWorker, SIGNAL(newFrameResult(int,int,bool,cv::Mat)), this, SLOT(onCalibrationFrameResult(int,int,bool,cv::Mat)));
179
    connect(calibrationWorker, SIGNAL(newFrameResult(int,int,bool,cv::Mat)), this, SLOT(onCalibrationFrameResult(int,int,bool,cv::Mat)));
179
    connect(calibrationWorker, SIGNAL(done()), this, SLOT(onCalibrationDone()));
180
    connect(calibrationWorker, SIGNAL(done()), this, SLOT(onCalibrationDone()));
180
    connect(calibrationWorker, SIGNAL(done()), ui->pointCloudWidget, SLOT(updateCalibrationParameters()));
181
    connect(calibrationWorker, SIGNAL(done()), ui->pointCloudWidget, SLOT(updateCalibrationParameters()));
181
    connect(calibrationWorker, SIGNAL(done()), calibrationWorkerThread, SLOT(quit()));
182
    connect(calibrationWorker, SIGNAL(done()), calibrationWorkerThread, SLOT(quit()));
182
    connect(calibrationWorker, SIGNAL(done()), calibrationWorker, SLOT(deleteLater()));
183
    connect(calibrationWorker, SIGNAL(done()), calibrationWorker, SLOT(deleteLater()));
183
 
184
 
184
    // Start calibration
185
    // Start calibration
185
    QMetaObject::invokeMethod(calibrationWorker, "performCalibration", Q_ARG(std::vector<SMCalibrationSet>, calibrationData));
186
    QMetaObject::invokeMethod(calibrationWorker, "performCalibration", Q_ARG(std::vector<SMCalibrationSet>, calibrationData));
186
 
187
 
187
}
188
}
188
 
189
 
189
 
190
 
190
 
191
 
191
void SMScanner::onCalibrationSetProcessed(int idx){
192
void SMScanner::onCalibrationSetProcessed(int idx){
192
 
193
 
193
    ui->calibrationListWidget->setCurrentRow(idx);
194
    ui->calibrationListWidget->setCurrentRow(idx);
194
}
195
}
195
 
196
 
196
void SMScanner::onCalibrationDone(){
197
void SMScanner::onCalibrationDone(){
197
 
198
 
198
    std::cout << "Calibration done!" << std::endl;
199
    std::cout << "Calibration done!" << std::endl;
199
    ui->calibrateButton->setEnabled(true);
200
    ui->calibrateButton->setEnabled(true);
200
    ui->calibrationFrame->setEnabled(true);
201
    ui->calibrationFrame->setEnabled(true);
201
 
202
 
202
}
203
}
203
 
204
 
204
void SMScanner::on_calibrationListWidget_itemSelectionChanged(){
205
void SMScanner::on_calibrationListWidget_itemSelectionChanged(){
205
 
206
 
206
    // if selection is just cleared
207
    // if selection is just cleared
207
    if(ui->calibrationListWidget->selectedItems().empty())
208
    if(ui->calibrationListWidget->selectedItems().empty())
208
        return;
209
        return;
209
 
210
 
210
    int currentRow = ui->calibrationListWidget->currentRow();
211
    int currentRow = ui->calibrationListWidget->currentRow();
211
 
212
 
212
    calibrationReviewMode = true;
213
    calibrationReviewMode = true;
213
    ui->singleCalibrationButton->setText("Live View");
214
    ui->singleCalibrationButton->setText("Live View");
214
    ui->batchCalibrationButton->setText("Live View");
215
    ui->batchCalibrationButton->setText("Live View");
215
 
216
 
216
    if(!calibrationData[currentRow].frame0Result.empty())
217
    if(!calibrationData[currentRow].frame0Result.empty())
217
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0Result);
218
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0Result);
218
    else
219
    else
219
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0);
220
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0);
220
 
221
 
221
    if(!calibrationData[currentRow].frame1Result.empty())
222
    if(!calibrationData[currentRow].frame1Result.empty())
222
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1Result);
223
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1Result);
223
    else
224
    else
224
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1);
225
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1);
225
 
226
 
226
//     std::cout << "on_calibrationListWidget_itemSelectionChanged" << std::endl;
227
//     std::cout << "on_calibrationListWidget_itemSelectionChanged" << std::endl;
227
}
228
}
228
 
229
 
229
void SMScanner::onCalibrationFrameResult(int idx, int camID, bool success, cv::Mat result){
230
void SMScanner::onCalibrationFrameResult(int idx, int camID, bool success, cv::Mat result){
230
 
231
 
231
//    std::cout << "onCalibrationFrameResult " << idx << camID << std::endl;
232
//    std::cout << "onCalibrationFrameResult " << idx << camID << std::endl;
232
 
233
 
233
    if(!success)
234
    if(!success)
234
        ui->calibrationListWidget->item(idx)->setCheckState(Qt::Unchecked);
235
        ui->calibrationListWidget->item(idx)->setCheckState(Qt::Unchecked);
235
    else {
236
    else {
236
        if(camID == 0)
237
        if(camID == 0)
237
            calibrationData[idx].frame0Result = result;
238
            calibrationData[idx].frame0Result = result;
238
        else if(camID == 1)
239
        else if(camID == 1)
239
            calibrationData[idx].frame1Result = result;
240
            calibrationData[idx].frame1Result = result;
240
    }
241
    }
241
 
242
 
242
}
243
}
243
 
244
 
244
void SMScanner::on_singleCaptureButton_clicked(){
245
void SMScanner::on_singleCaptureButton_clicked(){
245
 
246
 
246
    // If in review mode, go back to aquisition mode
247
    // If in review mode, go back to aquisition mode
247
    if(captureReviewMode){
248
    if(captureReviewMode){
248
        ui->captureTreeWidget->clearSelection();
249
        ui->captureTreeWidget->clearSelection();
249
        ui->singleCaptureButton->setText("Single Aquisition");
250
        ui->singleCaptureButton->setText("Single Aquisition");
250
        ui->batchCaptureButton->setText("Batch Aquisition");
251
        ui->batchCaptureButton->setText("Batch Aquisition");
251
        captureReviewMode = false;
252
        captureReviewMode = false;
252
        return;
253
        return;
253
    }
254
    }
254
 
255
 
255
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequence", Q_ARG(float, -1.0));
256
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequence", Q_ARG(float, -1.0));
256
 
257
 
257
}
258
}
258
 
259
 
259
 
260
 
260
void SMScanner::on_batchCaptureButton_clicked(){
261
void SMScanner::on_batchCaptureButton_clicked(){
261
 
262
 
262
    // If in review mode, go back to aquisition mode
263
    // If in review mode, go back to aquisition mode
263
    if(captureReviewMode){
264
    if(captureReviewMode){
264
        ui->captureTreeWidget->clearSelection();
265
        ui->captureTreeWidget->clearSelection();
265
        ui->singleCaptureButton->setText("Single Aquisition");
266
        ui->singleCaptureButton->setText("Single Aquisition");
266
        ui->batchCaptureButton->setText("Batch Aquisition");
267
        ui->batchCaptureButton->setText("Batch Aquisition");
267
        captureReviewMode = false;
268
        captureReviewMode = false;
268
        return;
269
        return;
269
    }
270
    }
270
 
271
 
271
    // Construct vector of angles
272
    // Construct vector of angles
272
    int angleStart = ui->captureBatchStartSpinBox->value();
273
    int angleStart = ui->captureBatchStartSpinBox->value();
273
    int angleEnd = ui->captureBatchEndSpinBox->value();
274
    int angleEnd = ui->captureBatchEndSpinBox->value();
274
    int angleStep = ui->captureBatchStepSpinBox->value();
275
    int angleStep = ui->captureBatchStepSpinBox->value();
275
 
276
 
276
    if(angleStart > angleEnd)
277
    if(angleStart > angleEnd)
277
        angleEnd += 360;
278
        angleEnd += 360;
278
 
279
 
279
    std::vector<float> angles;
280
    std::vector<float> angles;
280
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
281
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
281
        angles.push_back(i % 360);
282
        angles.push_back(i % 360);
282
 
283
 
283
    std::cout << "Aquiring sequences at ";
284
    std::cout << "Aquiring sequences at ";
284
    for(int i=0; i<angles.size(); i++)
285
    for(int i=0; i<angles.size(); i++)
285
        std::cout << angles[i] << " ";
286
        std::cout << angles[i] << " ";
286
    std::cout << " degrees" <<std::endl;
287
    std::cout << " degrees" <<std::endl;
287
 
288
 
288
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequences", Q_ARG(std::vector<float>, angles));
289
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequences", Q_ARG(std::vector<float>, angles));
289
}
290
}
290
 
291
 
291
void SMScanner::on_captureRotationDial_sliderReleased(){
292
void SMScanner::on_captureRotationDial_sliderReleased(){
292
 
293
 
293
    float angle = ui->captureRotationDial->value();
294
    float angle = ui->captureRotationDial->value();
294
    std::cout << "Rotation stage target: " << angle << std::endl;
295
    std::cout << "Rotation stage target: " << angle << std::endl;
295
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
296
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
296
 
297
 
297
    ui->calibrationRotationDial->setValue(ui->captureRotationDial->value());
298
    ui->calibrationRotationDial->setValue(ui->captureRotationDial->value());
298
}
299
}
299
 
300
 
300
void SMScanner::onReceiveFrameSequence(SMFrameSequence frameSequence){
301
void SMScanner::onReceiveFrameSequence(SMFrameSequence frameSequence){
301
 
302
 
302
    captureData.push_back(frameSequence);
303
    captureData.push_back(frameSequence);
303
 
304
 
304
    int idx = captureData.size()-1;
305
    int idx = captureData.size()-1;
305
 
306
 
306
    // Add identifier to list
307
    // Add identifier to list
307
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->captureTreeWidget);
308
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->captureTreeWidget);
308
    item->setText(0, QString("Frame Sequence %1 -- %2 deg").arg(idx).arg(frameSequence.rotationAngle));
309
    item->setText(0, QString("Frame Sequence %1 -- %2 deg").arg(idx).arg(frameSequence.rotationAngle));
309
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
310
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
310
    item->setData(0, Qt::UserRole, QPoint(idx, -1));
311
    item->setData(0, Qt::UserRole, QPoint(idx, -1));
311
    item->setCheckState(0, Qt::Checked);
312
    item->setCheckState(0, Qt::Checked);
312
    //ui->captureTreeWidget->addItem(item);
313
    //ui->captureTreeWidget->addItem(item);
313
 
314
 
314
    for(int i=0; i<frameSequence.frames0.size(); i++){
315
    for(int i=0; i<frameSequence.frames0.size(); i++){
315
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
316
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
316
        subItem->setText(0, QString("frames %1").arg(i));
317
        subItem->setText(0, QString("frames %1").arg(i));
317
        subItem->setData(0, Qt::UserRole, QPoint(idx, i));
318
        subItem->setData(0, Qt::UserRole, QPoint(idx, i));
318
    }
319
    }
319
}
320
}
320
 
321
 
321
void SMScanner::on_captureTreeWidget_itemSelectionChanged(){
322
void SMScanner::on_captureTreeWidget_itemSelectionChanged(){
322
 
323
 
323
    // if selection is just cleared
324
    // if selection is just cleared
324
    if(ui->captureTreeWidget->selectedItems().empty())
325
    if(ui->captureTreeWidget->selectedItems().empty())
325
        return;
326
        return;
326
 
327
 
327
    QTreeWidgetItem *item = ui->captureTreeWidget->currentItem();
328
    QTreeWidgetItem *item = ui->captureTreeWidget->currentItem();
328
 
329
 
329
    captureReviewMode = true;
330
    captureReviewMode = true;
330
 
331
 
331
    ui->singleCaptureButton->setText("Live View");
332
    ui->singleCaptureButton->setText("Live View");
332
    ui->batchCaptureButton->setText("Live View");
333
    ui->batchCaptureButton->setText("Live View");
333
 
334
 
334
    QPoint idx = item->data(0, Qt::UserRole).toPoint();
335
    QPoint idx = item->data(0, Qt::UserRole).toPoint();
335
 
336
 
336
    if(idx.y() != -1){
337
    if(idx.y() != -1){
337
        ui->captureCamera0Widget->showImageCV(captureData[idx.x()].frames0[idx.y()]);
338
        ui->captureCamera0Widget->showImageCV(captureData[idx.x()].frames0[idx.y()]);
338
        ui->captureCamera1Widget->showImageCV(captureData[idx.x()].frames1[idx.y()]);
339
        ui->captureCamera1Widget->showImageCV(captureData[idx.x()].frames1[idx.y()]);
339
    }
340
    }
340
 
341
 
341
//     std::cout << "on_captureTreeWidget_itemSelectionChanged" << std::endl;
342
//     std::cout << "on_captureTreeWidget_itemSelectionChanged" << std::endl;
342
}
343
}
343
 
344
 
344
 
345
 
345
void SMScanner::onReceiveRotatedTo(float angle){
346
void SMScanner::onReceiveRotatedTo(float angle){
346
 
347
 
347
    // update ui with new position
348
    // update ui with new position
348
    ui->calibrationRotationDial->setValue(angle);
349
    ui->calibrationRotationDial->setValue(angle);
349
    ui->captureRotationDial->setValue(angle);
350
    ui->captureRotationDial->setValue(angle);
350
 
351
 
351
}
352
}
-
 
353
 
-
 
354
void SMScanner::on_actionExport_Sets_triggered(){
-
 
355
 
-
 
356
    QString dirName = QFileDialog::getExistingDirectory(this, "Export calibration sets", QString());
-
 
357
    for(int i=0; i<calibrationData.size(); i++){
-
 
358
        QString fileName = QString("%1/frame0_%2.png").arg(dirName).arg(i);
-
 
359
        cv::Mat frameBGR;
-
 
360
        cv::cvtColor(calibrationData[i].frame0, frameBGR, CV_RGB2BGR);
-
 
361
        cv::imwrite(fileName.toStdString(), frameBGR);
-
 
362
        fileName = QString("%1/frame1_%2.png").arg(dirName).arg(i);
-
 
363
        cv::cvtColor(calibrationData[i].frame1, frameBGR, CV_RGB2BGR);
-
 
364
        cv::imwrite(fileName.toStdString(), frameBGR);
-
 
365
    }
-
 
366
 
-
 
367
}
-
 
368
 
-
 
369
void SMScanner::on_actionExport_Sequences_triggered(){
-
 
370
 
-
 
371
    QString dirName = QFileDialog::getExistingDirectory(this, "Export frame sequences", QString());
-
 
372
 
-
 
373
    for(int i=0; i<captureData.size(); i++){
-
 
374
        QString seqDirName = QString("%1/sequence_%2").arg(dirName).arg(i);
-
 
375
        if(!QDir().mkdir(seqDirName))
-
 
376
            std::cerr << "Could not create directory " << seqDirName.toStdString() << std::endl;
-
 
377
        for(int j=0; j<captureData[i].frames0.size(); j++){
-
 
378
            QString fileName = QString("%1/frames0_%2.png").arg(seqDirName).arg(j);
-
 
379
            cv::Mat frameBGR;
-
 
380
            cv::cvtColor(captureData[i].frames0[j], frameBGR, CV_RGB2BGR);
-
 
381
            cv::imwrite(fileName.toStdString(), frameBGR);
-
 
382
        }
-
 
383
        for(int j=0; j<captureData[i].frames1.size(); j++){
-
 
384
            QString fileName = QString("%1/frames1_%2.png").arg(seqDirName).arg(j);
-
 
385
            cv::Mat frameBGR;
-
 
386
            cv::cvtColor(captureData[i].frames1[j], frameBGR, CV_RGB2BGR);
-
 
387
            cv::imwrite(fileName.toStdString(), frameBGR);
-
 
388
        }
-
 
389
    }
-
 
390
}
352
 
391