20 #include "mainwindow.h" 21 #include "ui_mainwindow.h" 22 #include <QFileDialog> 23 #include <QStandardItemModel> 24 #include <QMessageBox> 27 MainWindow::MainWindow(QWidget *parent) :
33 svmlist <<
"C_SVC" <<
"nu_SVC" <<
"one_class" <<
"epsilon_SVR" <<
"nu_SVR";
34 ui->svmtype->addItems(svmlist);
35 QStringList kernellist;
36 kernellist <<
"radial" <<
"linear" <<
"polynomial" <<
"sigmoid";
37 ui->kerneltype->addItems(kernellist);
41 MainWindow::~MainWindow()
46 void MainWindow::setDefaults()
52 ui->training->clear();
54 ui->label->setText(
"label");
56 setClassTable(labels);
61 ui->msknodata->setText(
"0");
63 ui->nodata->setText(
"0");
66 ui->coef0->setText(
"0");
67 ui->nu->setText(
"0.5");
69 ui->label->setText(
"label");
71 ui->gamma->setText(
"1");
72 ui->ccost->setText(
"1000");
75 void MainWindow::on_actionTraining_triggered()
77 QString qstraining = QFileDialog::getOpenFileName(
this,
"Training");
78 ui->training->setText(qstraining);
79 this->on_training_returnPressed();
82 void MainWindow::on_actionMask_triggered()
84 QString qsmask = QFileDialog::getOpenFileName(
this,
"Mask");
85 ui->mask->setText(qsmask);
88 void MainWindow::on_actionOutput_triggered()
90 QString qsoutput = QFileDialog::getSaveFileName(
this,
"Output image",
"",
"*.*");
91 ui->output->setText(qsoutput);
94 void MainWindow::on_actionInput_triggered()
96 QString qsinput = QFileDialog::getOpenFileName(
this,
"Input");
97 ui->input->setText(qsinput);
101 void MainWindow::on_actionColor_table_triggered()
103 QString qsct = QFileDialog::getOpenFileName(
this,
"Color table");
104 ui->ct->setText(qsct);
107 void MainWindow::on_toolButton_input_clicked()
109 on_actionInput_triggered();
112 void MainWindow::on_toolButton_mask_clicked()
114 on_actionMask_triggered();
117 void MainWindow::on_toolButton_output_clicked()
119 on_actionOutput_triggered();
122 void MainWindow::on_toolButton_training_clicked()
124 on_actionTraining_triggered();
127 void MainWindow::on_toolButton_ct_clicked()
129 on_actionColor_table_triggered();
132 void MainWindow::on_training_returnPressed()
137 void MainWindow::setClassTable(
const QStringList &labels)
139 QStandardItemModel *model =
new QStandardItemModel(labels.size(),4,
this);
140 model->setHorizontalHeaderItem(0,
new QStandardItem(QString(
"label name")));
141 model->setHorizontalHeaderItem(1,
new QStandardItem(QString(
"class nr")));
142 model->setHorizontalHeaderItem(2,
new QStandardItem(QString(
"prior prob")));
143 model->setHorizontalHeaderItem(3,
new QStandardItem(QString(
"balance (optional)")));
144 for(
int ilabel=0;ilabel<labels.size();++ilabel){
145 QStandardItem *firstCol =
new QStandardItem(QString(labels[ilabel]));
146 model->setItem(ilabel,0,firstCol);
147 QStandardItem *secondCol =
new QStandardItem(QString::number(ilabel+1));
148 model->setItem(ilabel,1,secondCol);
149 QStandardItem *thirdCol =
new QStandardItem(QString::number(1.0/labels.size()));
150 model->setItem(ilabel,2,thirdCol);
152 ui->tableView_labels->setModel(model);
155 void MainWindow::on_pushButton_run_clicked()
158 ui->commandLineEdit->clear();
159 ui->consoleEdit->clear();
160 QString program =
"pksvm";
161 if(ui->training->text().isEmpty())
162 MainWindow::on_actionTraining_triggered();
163 if(ui->training->text().isEmpty()){
164 QString qsError=
"No training vector file selected";
167 if(!ui->input->text().isEmpty()){
168 if(ui->output->text().isEmpty())
169 MainWindow::on_actionOutput_triggered();
170 if(ui->output->text().isEmpty()){
171 QString qsError=
"No training vector file selected";
187 QStringList qslBalance;
188 for(
int irow=0;irow<ui->tableView_labels->model()->rowCount();++irow){
190 qsOption+=
" --class ";
191 qsOption+=ui->tableView_labels->model()->data(ui->tableView_labels->model()->index(irow,0)).toString();
192 qsOption+=
" --reclass ";
193 qsOption+=ui->tableView_labels->model()->data(ui->tableView_labels->model()->index(irow,1)).toString();
194 qsOption+=
" --prior ";
195 qsOption+=ui->tableView_labels->model()->data(ui->tableView_labels->model()->index(irow,2)).toString();
197 if(ui->tableView_labels->model()->columnCount()>3){
198 QString qsbalance=ui->tableView_labels->model()->data(ui->tableView_labels->model()->index(irow,3)).toString();
199 if(!qsbalance.isEmpty())
200 qslBalance << qsbalance;
203 if(qslBalance.size()){
204 for(
int irow=0;irow<ui->tableView_labels->model()->rowCount();++irow){
206 qsOption+=
" --balance ";
207 if(qslBalance.size()==ui->tableView_labels->model()->rowCount())
208 qsOption+=qslBalance[irow];
210 qsOption+=qslBalance[0];
215 QList<QComboBox*> qcomboBoxList = this->findChildren<QComboBox *>();
217 for(QList<QComboBox*>::ConstIterator qcbit=qcomboBoxList.begin();qcbit!=qcomboBoxList.end();++qcbit){
220 qsOption+=(*qcbit)->objectName();
223 program+=(*qcbit)->currentText();
226 QList<QLineEdit*> qlineEditList = this->findChildren<QLineEdit *>();
228 for(QList<QLineEdit*>::ConstIterator qlbit=qlineEditList.begin();qlbit!=qlineEditList.end();++qlbit){
229 if(!((*qlbit)->text().isEmpty())){
232 qsOption+=(*qlbit)->objectName();
234 qsOption+=(*qlbit)->text();
239 ui->commandLineEdit->setText(program);
242 QProcess *myProcess =
new QProcess(
this);
243 myProcess->start(program);
244 myProcess->setProcessChannelMode(QProcess::MergedChannels);
245 this->setCursor(Qt::WaitCursor);
246 myProcess->waitForFinished(-1);
247 this->setCursor(Qt::ArrowCursor);
249 QString p_stderr = myProcess->readAllStandardError();
250 if(!p_stderr.isEmpty()){
251 msgBox.setText(p_stderr);
254 QString p_stdout = myProcess->readAll();
255 ui->consoleEdit->insertPlainText(p_stdout);
258 catch(QString qsError){
260 msgBox.setText(qsError);
265 void MainWindow::on_pushButton_restore_clicked()
270 void MainWindow::on_commandLinkButtonPrepareTable_clicked()
272 int nclass=ui->nclass->text().toInt();
274 for(
int iclass=1;iclass<=nclass;++iclass){
275 QString lstring=
"label";
276 lstring+=QString::number(iclass);
279 setClassTable(labels);