Subversion Repositories seema-scanner

Rev

Rev 26 | Rev 28 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 26 Rev 27
Line 1... Line 1...
1
#include "SMScanner.h"
1
#include "SMScanner.h"
2
#include "ui_SMScanner.h"
2
#include "ui_SMScanner.h"
3
 
3
 
4
#include "SMCalibrator.h"
-
 
5
 
-
 
6
#include <QMetaObject>
4
#include <QMetaObject>
7
 
5
 
8
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner), calibrationReviewMode(false){
6
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner),
-
 
7
                                        calibrationReviewMode(false), captureReviewMode(false){
9
    ui->setupUi(this);
8
    ui->setupUi(this);
10
 
9
 
-
 
10
    // Register metatypes
-
 
11
    qRegisterMetaType<cv::Mat>("cv::Mat");
-
 
12
    qRegisterMetaType< std::vector<cv::Mat> >("std::vector<cv::Mat>");
-
 
13
    qRegisterMetaType<SMCalibrationSet>("SMCalibrationSet");
-
 
14
    qRegisterMetaType<SMCalibrationParameters>("SMCalibrationParameters");
-
 
15
    qRegisterMetaTypeStreamOperators<SMCalibrationParameters>("SMCalibrationParameters");
-
 
16
    qRegisterMetaType< std::vector<SMCalibrationSet> >("std::vector<SMCalibrationSet>");
-
 
17
    qRegisterMetaType<SMFrameSequence>("SMFrameSequence");
-
 
18
 
11
    // Restore geometry
19
    // Restore geometry
12
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
20
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
13
    this->restoreState(settings.value("state/mainwindow").toByteArray());
21
    this->restoreState(settings.value("state/mainwindow").toByteArray());
14
 
22
 
15
    // Set up threads
23
    // Set up threads
Line 18... Line 26...
18
    captureWorkerThread->setObjectName("captureWorkerThread");
26
    captureWorkerThread->setObjectName("captureWorkerThread");
19
    captureWorker->moveToThread(captureWorkerThread);
27
    captureWorker->moveToThread(captureWorkerThread);
20
    captureWorkerThread->start();
28
    captureWorkerThread->start();
21
 
29
 
22
    // Connections
30
    // Connections
23
    qRegisterMetaType<cv::Mat>("cv::Mat");
-
 
24
    qRegisterMetaType< std::vector<cv::Mat> >("std::vector<cv::Mat>");
-
 
25
    qRegisterMetaType<CalibrationSet>("CalibrationSet");
-
 
26
    connect(captureWorker, SIGNAL(newFrame(unsigned int, cv::Mat)), this, SLOT(onReceiveFrame(unsigned int, cv::Mat)));
31
    connect(captureWorker, SIGNAL(newFrame(unsigned int, cv::Mat)), this, SLOT(onReceiveFrame(unsigned int, cv::Mat)));
27
    connect(captureWorker, SIGNAL(newCalibrationSet(CalibrationSet)), this, SLOT(onReceiveCalibrationSet(CalibrationSet)));
32
    connect(captureWorker, SIGNAL(newCalibrationSet(SMCalibrationSet)), this, SLOT(onReceiveCalibrationSet(SMCalibrationSet)));
-
 
33
    connect(captureWorker, SIGNAL(newFrameSequence(SMFrameSequence)), this, SLOT(onReceiveFrameSequence(SMFrameSequence)));
28
 
34
 
29
    // Start capturing
35
    // Start capturing
30
    QMetaObject::invokeMethod(captureWorker, "setup");
36
    QMetaObject::invokeMethod(captureWorker, "setup");
31
    QMetaObject::invokeMethod(captureWorker, "doWork");
37
    QMetaObject::invokeMethod(captureWorker, "doWork");
32
 
38
 
Line 35... Line 41...
35
void SMScanner::onReceiveFrame(unsigned int camId, cv::Mat frame){
41
void SMScanner::onReceiveFrame(unsigned int camId, cv::Mat frame){
36
 
42
 
37
    if(camId == 0){
43
    if(camId == 0){
38
        if(!calibrationReviewMode)
44
        if(!calibrationReviewMode)
39
            ui->calibrationCamera0Widget->showImageCV(frame);
45
            ui->calibrationCamera0Widget->showImageCV(frame);
-
 
46
        if(!captureReviewMode)
40
        ui->captureCamera0Widget->showImageCV(frame);
47
            ui->captureCamera0Widget->showImageCV(frame);
41
    } else if(camId == 1){
48
    } else if(camId == 1){
42
        if(!calibrationReviewMode)
49
        if(!calibrationReviewMode)
43
            ui->calibrationCamera1Widget->showImageCV(frame);
50
            ui->calibrationCamera1Widget->showImageCV(frame);
-
 
51
        if(!captureReviewMode)
44
        ui->captureCamera1Widget->showImageCV(frame);
52
            ui->captureCamera1Widget->showImageCV(frame);
45
    }
53
    }
46
}
54
}
47
 
55
 
48
void SMScanner::on_actionPreferences_triggered(){
56
void SMScanner::on_actionPreferences_triggered(){
Line 80... Line 88...
80
        ui->batchCalibrationButton->setText("Batch Aquisition");
88
        ui->batchCalibrationButton->setText("Batch Aquisition");
81
        calibrationReviewMode = false;
89
        calibrationReviewMode = false;
82
        return;
90
        return;
83
    }
91
    }
84
 
92
 
85
    float position = ui->calibrationRotationDial->value();
-
 
86
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSet", Q_ARG(float, position));
93
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSet", Q_ARG(float, -1.0));
87
 
94
 
88
}
95
}
89
 
96
 
90
void SMScanner::on_calibrationRotationDial_sliderReleased(){
97
void SMScanner::on_calibrationRotationDial_sliderReleased(){
-
 
98
 
91
    float angle = ui->calibrationRotationDial->value();
99
    float angle = ui->calibrationRotationDial->value();
92
    std::cout << "Rotation stage target: " << angle << std::endl;
100
    std::cout << "Rotation stage target: " << angle << std::endl;
93
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
101
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
-
 
102
 
-
 
103
    ui->captureRotationDial->setValue(ui->calibrationRotationDial->value());
94
}
104
}
95
 
105
 
96
void SMScanner::onReceiveCalibrationSet(CalibrationSet calibrationSet){
106
void SMScanner::onReceiveCalibrationSet(SMCalibrationSet calibrationSet){
97
    calibrationData.push_back(calibrationSet);
107
    calibrationData.push_back(calibrationSet);
98
 
108
 
99
    // Add identifier to list
109
    // Add identifier to list
100
    QListWidgetItem* item = new QListWidgetItem(QString("Set %1").arg(ui->calibrationListWidget->count()), ui->calibrationListWidget);
110
    QListWidgetItem* item = new QListWidgetItem(QString("Set %1 -- %2 deg").arg(ui->calibrationListWidget->count()).arg(calibrationSet.rotationAngle), ui->calibrationListWidget);
101
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
111
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
102
    item->setCheckState(Qt::Checked);
112
    item->setCheckState(Qt::Checked);
103
    ui->calibrationListWidget->addItem(item);
113
    ui->calibrationListWidget->addItem(item);
104
 
114
 
105
    // Set enabled checkmark
115
    // Set enabled checkmark
106
    if(calibrationData.size() >= 2)
116
    if(calibrationData.size() >= 2)
107
        ui->calibrateButton->setEnabled(true);
117
        ui->calibrateButton->setEnabled(true);
108
}
118
}
109
 
119
 
-
 
120
void SMScanner::on_calibrateButton_clicked(){
-
 
121
 
-
 
122
 
-
 
123
    // set checked flags
-
 
124
    for(int i=0; i<calibrationData.size(); i++){
-
 
125
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
-
 
126
    }
-
 
127
 
-
 
128
//    SMCalibrationWorker calibrationWorker;
-
 
129
//    calibrationWorker.performCalibration(calibrationData);
-
 
130
 
-
 
131
    // Set up calibration thread
-
 
132
    calibrationWorker = new SMCalibrationWorker;
-
 
133
    calibrationWorkerThread = new QThread(this);
-
 
134
    calibrationWorkerThread->setObjectName("calibrationWorkerThread");
-
 
135
    calibrationWorker->moveToThread(captureWorkerThread);
-
 
136
    calibrationWorkerThread->start();
-
 
137
 
-
 
138
    // Connections
-
 
139
    connect(calibrationWorker, SIGNAL(newSetProcessed(int)), this, SLOT(onSMCalibrationSetProcessed(int)));
-
 
140
    connect(calibrationWorker, SIGNAL(newFrameResult(int,int,cv::Mat)), this, SLOT(onCalibrationFrameResult(int,int,cv::Mat)));
-
 
141
    connect(calibrationWorker, SIGNAL(done()), this, SLOT(onCalibrationDone()));
-
 
142
    connect(calibrationWorker, SIGNAL(done()), calibrationWorkerThread, SLOT(quit()));
-
 
143
    connect(calibrationWorker, SIGNAL(done()), calibrationWorker, SLOT(deleteLater()));
-
 
144
 
-
 
145
    // Start capturing
-
 
146
    QMetaObject::invokeMethod(calibrationWorker, "performCalibration", Q_ARG(std::vector<SMCalibrationSet>, calibrationData));
-
 
147
 
-
 
148
}
-
 
149
 
-
 
150
void SMScanner::onCalibrationSetProcessed(int idx){
-
 
151
 
-
 
152
    ui->calibrationListWidget->setCurrentRow(idx);
-
 
153
}
-
 
154
 
-
 
155
void SMScanner::onCalibrationDone(){
-
 
156
 
-
 
157
    std::cout << "Calibration done!" << std::endl;
-
 
158
 
-
 
159
}
-
 
160
 
110
void SMScanner::on_calibrationListWidget_currentRowChanged(int currentRow){
161
void SMScanner::on_calibrationListWidget_itemSelectionChanged(){
-
 
162
 
-
 
163
    // if selection is just cleared
-
 
164
    if(ui->calibrationListWidget->selectedItems().empty())
-
 
165
        return;
-
 
166
 
-
 
167
    int currentRow = ui->calibrationListWidget->currentRow();
111
 
168
 
112
    calibrationReviewMode = true;
169
    calibrationReviewMode = true;
113
    ui->singleCalibrationButton->setText("Live View");
170
    ui->singleCalibrationButton->setText("Live View");
114
    ui->batchCalibrationButton->setText("Live View");
171
    ui->batchCalibrationButton->setText("Live View");
115
 
172
 
Line 120... Line 177...
120
 
177
 
121
    if(!calibrationData[currentRow].frame1Result.empty())
178
    if(!calibrationData[currentRow].frame1Result.empty())
122
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1Result);
179
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1Result);
123
    else
180
    else
124
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1);
181
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1);
-
 
182
 
-
 
183
//     std::cout << "on_calibrationListWidget_itemSelectionChanged" << std::endl;
125
}
184
}
126
 
185
 
127
void SMScanner::on_calibrateButton_clicked(){
186
void SMScanner::onCalibrationFrameResult(int idx, int camID, cv::Mat result){
-
 
187
 
-
 
188
    std::cout << "onCalibrationFrameResult " << idx << camID << std::endl;
-
 
189
 
-
 
190
    if(camID == 0)
-
 
191
        calibrationData[idx].frame0Result = result;
-
 
192
    else if(camID == 1)
-
 
193
        calibrationData[idx].frame1Result = result;
128
 
194
 
129
    // set checked flags
-
 
130
    for(int i=0; i<calibrationData.size(); i++){
-
 
131
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
-
 
132
    }
195
}
133
 
196
 
134
    SMCalibrator calibrator;
-
 
135
    calibrator.performCalibration(calibrationData);
197
void SMScanner::on_singleCaptureButton_clicked(){
136
 
198
 
-
 
199
    // If in review mode, go back to aquisition mode
-
 
200
    if(captureReviewMode){
-
 
201
        ui->captureTreeWidget->clearSelection();
-
 
202
        ui->singleCaptureButton->setText("Single Aquisition");
-
 
203
        ui->batchCaptureButton->setText("Batch Aquisition");
-
 
204
        captureReviewMode = false;
-
 
205
        return;
137
}
206
    }
138
 
207
 
-
 
208
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequence", Q_ARG(float, -1.0));
-
 
209
 
-
 
210
}
-
 
211
 
-
 
212
 
139
void SMScanner::onCalibrationSetProcessed(int idx){
213
void SMScanner::on_captureRotationDial_sliderReleased(){
-
 
214
 
-
 
215
    float angle = ui->captureRotationDial->value();
-
 
216
    std::cout << "Rotation stage target: " << angle << std::endl;
-
 
217
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
-
 
218
 
-
 
219
    ui->calibrationRotationDial->setValue(ui->captureRotationDial->value());
-
 
220
}
-
 
221
 
-
 
222
void SMScanner::onReceiveFrameSequence(SMFrameSequence frameSequence){
-
 
223
 
-
 
224
    captureData.push_back(frameSequence);
-
 
225
 
-
 
226
    int idx = captureData.size()-1;
-
 
227
 
-
 
228
    // Add identifier to list
-
 
229
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->captureTreeWidget);
-
 
230
    item->setText(0, QString("Frame Sequence %1 -- %2 deg").arg(idx).arg(frameSequence.rotationAngle));
-
 
231
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
-
 
232
    item->setData(0, Qt::UserRole, QPoint(idx, -1));
-
 
233
    item->setCheckState(0, Qt::Checked);
140
    ui->calibrationListWidget->setCurrentRow(idx);
234
    //ui->captureTreeWidget->addItem(item);
-
 
235
 
-
 
236
    for(int i=0; i<frameSequence.frames0.size(); i++){
-
 
237
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
-
 
238
        subItem->setText(0, QString("frames %1").arg(i));
-
 
239
        subItem->setData(0, Qt::UserRole, QPoint(idx, i));
-
 
240
    }
-
 
241
}
-
 
242
 
-
 
243
void SMScanner::on_captureTreeWidget_itemSelectionChanged(){
-
 
244
 
-
 
245
    // if selection is just cleared
-
 
246
    if(ui->captureTreeWidget->selectedItems().empty())
-
 
247
        return;
-
 
248
 
-
 
249
    QTreeWidgetItem *item = ui->captureTreeWidget->currentItem();
-
 
250
 
-
 
251
    captureReviewMode = true;
-
 
252
 
-
 
253
    ui->singleCaptureButton->setText("Live View");
-
 
254
    ui->batchCaptureButton->setText("Live View");
-
 
255
 
-
 
256
    QPoint idx = item->data(0, Qt::UserRole).toPoint();
-
 
257
 
-
 
258
    if(idx.y() != -1){
-
 
259
        ui->captureCamera0Widget->showImageCV(captureData[idx.x()].frames0[idx.y()]);
-
 
260
        ui->captureCamera1Widget->showImageCV(captureData[idx.x()].frames1[idx.y()]);
-
 
261
    }
-
 
262
 
-
 
263
//     std::cout << "on_captureTreeWidget_itemSelectionChanged" << std::endl;
141
}
264
}