Subversion Repositories seema-scanner

Rev

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

Rev 25 Rev 26
1
#include "SMScanner.h"
1
#include "SMScanner.h"
2
#include "ui_SMScanner.h"
2
#include "ui_SMScanner.h"
3
 
3
 
4
#include "SMCalibrator.h"
4
#include "SMCalibrator.h"
5
 
5
 
6
#include <QMetaObject>
6
#include <QMetaObject>
7
 
7
 
8
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner), calibrationReviewMode(false){
8
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner), calibrationReviewMode(false){
9
    ui->setupUi(this);
9
    ui->setupUi(this);
10
 
10
 
11
    // Restore geometry
11
    // Restore geometry
12
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
12
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
13
    this->restoreState(settings.value("state/mainwindow").toByteArray());
13
    this->restoreState(settings.value("state/mainwindow").toByteArray());
14
 
14
 
15
    // Set up threads
15
    // Set up threads
16
    captureWorker = new SMCaptureWorker;
16
    captureWorker = new SMCaptureWorker;
17
    captureWorkerThread = new QThread(this);
17
    captureWorkerThread = new QThread(this);
18
    captureWorkerThread->setObjectName("captureWorkerThread");
18
    captureWorkerThread->setObjectName("captureWorkerThread");
19
    captureWorker->moveToThread(captureWorkerThread);
19
    captureWorker->moveToThread(captureWorkerThread);
20
    captureWorkerThread->start();
20
    captureWorkerThread->start();
21
 
21
 
22
    // Connections
22
    // Connections
23
    qRegisterMetaType<cv::Mat>("cv::Mat");
23
    qRegisterMetaType<cv::Mat>("cv::Mat");
24
    qRegisterMetaType< std::vector<cv::Mat> >("std::vector<cv::Mat>");
24
    qRegisterMetaType< std::vector<cv::Mat> >("std::vector<cv::Mat>");
25
    qRegisterMetaType<CalibrationSet>("CalibrationSet");
25
    qRegisterMetaType<CalibrationSet>("CalibrationSet");
26
    connect(captureWorker, SIGNAL(newFrame(unsigned int, cv::Mat)), this, SLOT(onReceiveFrame(unsigned int, cv::Mat)));
26
    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)));
27
    connect(captureWorker, SIGNAL(newCalibrationSet(CalibrationSet)), this, SLOT(onReceiveCalibrationSet(CalibrationSet)));
28
 
28
 
29
    // Start capturing
29
    // Start capturing
30
    QMetaObject::invokeMethod(captureWorker, "setup");
30
    QMetaObject::invokeMethod(captureWorker, "setup");
31
    QMetaObject::invokeMethod(captureWorker, "doWork");
31
    QMetaObject::invokeMethod(captureWorker, "doWork");
32
 
32
 
33
}
33
}
34
 
34
 
35
void SMScanner::onReceiveFrame(unsigned int camId, cv::Mat frame){
35
void SMScanner::onReceiveFrame(unsigned int camId, cv::Mat frame){
36
 
36
 
37
    if(camId == 0){
37
    if(camId == 0){
38
        if(!calibrationReviewMode)
38
        if(!calibrationReviewMode)
39
            ui->calibrationCamera0Widget->showImageCV(frame);
39
            ui->calibrationCamera0Widget->showImageCV(frame);
40
        ui->captureCamera0Widget->showImageCV(frame);
40
        ui->captureCamera0Widget->showImageCV(frame);
41
    } else if(camId == 1){
41
    } else if(camId == 1){
42
        if(!calibrationReviewMode)
42
        if(!calibrationReviewMode)
43
            ui->calibrationCamera1Widget->showImageCV(frame);
43
            ui->calibrationCamera1Widget->showImageCV(frame);
44
        ui->captureCamera1Widget->showImageCV(frame);
44
        ui->captureCamera1Widget->showImageCV(frame);
45
    }
45
    }
46
}
46
}
47
 
47
 
48
void SMScanner::on_actionPreferences_triggered(){
48
void SMScanner::on_actionPreferences_triggered(){
49
 
49
 
50
    preferenceDialog.show();
50
    preferenceDialog.show();
51
}
51
}
52
 
52
 
53
void SMScanner::closeEvent(QCloseEvent *event){
53
void SMScanner::closeEvent(QCloseEvent *event){
54
 
54
 
55
    // Stop capturing thread
55
    // Stop capturing thread
56
    connect(captureWorker, SIGNAL(finished()), captureWorker, SLOT(deleteLater()));
56
    connect(captureWorker, SIGNAL(finished()), captureWorker, SLOT(deleteLater()));
57
    connect(captureWorker, SIGNAL(finished()), captureWorkerThread, SLOT(quit()));
57
    connect(captureWorker, SIGNAL(finished()), captureWorkerThread, SLOT(quit()));
58
    QMetaObject::invokeMethod(captureWorker, "stopWork");
58
    QMetaObject::invokeMethod(captureWorker, "stopWork");
59
    captureWorkerThread->quit();
59
    captureWorkerThread->quit();
60
    captureWorkerThread->wait();
60
    captureWorkerThread->wait();
61
 
61
 
62
    // Save window geometry
62
    // Save window geometry
63
    settings.setValue("geometry/mainwindow", this->saveGeometry());
63
    settings.setValue("geometry/mainwindow", this->saveGeometry());
64
    settings.setValue("state/mainwindow", this->saveState());
64
    settings.setValue("state/mainwindow", this->saveState());
65
 
65
 
66
    event->accept();
66
    event->accept();
67
 
67
 
68
}
68
}
69
 
69
 
70
SMScanner::~SMScanner(){
70
SMScanner::~SMScanner(){
71
    delete ui;
71
    delete ui;
72
}
72
}
73
 
73
 
74
void SMScanner::on_singleCalibrationButton_clicked(){
74
void SMScanner::on_singleCalibrationButton_clicked(){
75
 
75
 
76
    // If in review mode, go back to aquisition mode
76
    // If in review mode, go back to aquisition mode
77
    if(calibrationReviewMode){
77
    if(calibrationReviewMode){
-
 
78
        ui->calibrationListWidget->clearSelection();
78
        ui->singleCalibrationButton->setText("Single Aquisition");
79
        ui->singleCalibrationButton->setText("Single Aquisition");
79
        ui->batchCalibrationButton->setText("Batch Aquisition");
80
        ui->batchCalibrationButton->setText("Batch Aquisition");
80
        calibrationReviewMode = false;
81
        calibrationReviewMode = false;
81
        return;
82
        return;
82
    }
83
    }
83
 
84
 
84
    float position = ui->calibrationRotationDial->value();
85
    float position = ui->calibrationRotationDial->value();
85
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSet", Q_ARG(float, position));
86
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSet", Q_ARG(float, position));
86
 
87
 
87
}
88
}
88
 
89
 
89
void SMScanner::on_calibrationRotationDial_sliderReleased(){
90
void SMScanner::on_calibrationRotationDial_sliderReleased(){
90
    float angle = ui->calibrationRotationDial->value();
91
    float angle = ui->calibrationRotationDial->value();
91
    std::cout << "Rotation stage target: " << angle << std::endl;
92
    std::cout << "Rotation stage target: " << angle << std::endl;
92
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
93
    QMetaObject::invokeMethod(captureWorker, "rotateTo", Q_ARG(float, angle));
93
}
94
}
94
 
95
 
95
void SMScanner::onReceiveCalibrationSet(CalibrationSet calibrationSet){
96
void SMScanner::onReceiveCalibrationSet(CalibrationSet calibrationSet){
96
    calibrationData.push_back(calibrationSet);
97
    calibrationData.push_back(calibrationSet);
97
 
98
 
98
    // Add identifier to list
99
    // Add identifier to list
99
    QListWidgetItem* item = new QListWidgetItem(QString("Set %1").arg(ui->calibrationListWidget->count()), ui->calibrationListWidget);
100
    QListWidgetItem* item = new QListWidgetItem(QString("Set %1").arg(ui->calibrationListWidget->count()), ui->calibrationListWidget);
100
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
101
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
101
    item->setCheckState(Qt::Checked);
102
    item->setCheckState(Qt::Checked);
102
    ui->calibrationListWidget->addItem(item);
103
    ui->calibrationListWidget->addItem(item);
103
 
104
 
104
    // Set enabled checkmark
105
    // Set enabled checkmark
105
    if(calibrationData.size() >= 2)
106
    if(calibrationData.size() >= 2)
106
        ui->calibrateButton->setEnabled(true);
107
        ui->calibrateButton->setEnabled(true);
107
}
108
}
108
 
109
 
109
void SMScanner::on_calibrationListWidget_currentRowChanged(int currentRow){
110
void SMScanner::on_calibrationListWidget_currentRowChanged(int currentRow){
110
 
111
 
111
    calibrationReviewMode = true;
112
    calibrationReviewMode = true;
112
    ui->singleCalibrationButton->setText("Live View");
113
    ui->singleCalibrationButton->setText("Live View");
113
    ui->batchCalibrationButton->setText("Live View");
114
    ui->batchCalibrationButton->setText("Live View");
114
 
115
 
115
    if(!calibrationData[currentRow].frame0Result.empty())
116
    if(!calibrationData[currentRow].frame0Result.empty())
116
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0Result);
117
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0Result);
117
    else
118
    else
118
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0);
119
        ui->calibrationCamera0Widget->showImageCV(calibrationData[currentRow].frame0);
119
 
120
 
120
    if(!calibrationData[currentRow].frame1Result.empty())
121
    if(!calibrationData[currentRow].frame1Result.empty())
121
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1Result);
122
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1Result);
122
    else
123
    else
123
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1);
124
        ui->calibrationCamera1Widget->showImageCV(calibrationData[currentRow].frame1);
124
}
125
}
125
 
126
 
126
void SMScanner::on_calibrateButton_clicked(){
127
void SMScanner::on_calibrateButton_clicked(){
127
 
128
 
128
    // set checked flags
129
    // set checked flags
129
    for(int i=0; i<calibrationData.size(); i++){
130
    for(int i=0; i<calibrationData.size(); i++){
130
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
131
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
131
    }
132
    }
132
 
133
 
133
    SMCalibrator calibrator;
134
    SMCalibrator calibrator;
134
    calibrator.performCalibration(calibrationData);
135
    calibrator.performCalibration(calibrationData);
135
 
136
 
136
}
137
}
-
 
138
 
-
 
139
void SMScanner::onCalibrationSetProcessed(int idx){
-
 
140
    ui->calibrationListWidget->setCurrentRow(idx);
-
 
141
}
137
 
142