00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include <QtGui>
00045
00046 #include "vrglwidget.h"
00047 #include "window.h"
00048
00049 Window::Window()
00050 {
00051 QGroupBox *vrGroup = new QGroupBox(this);
00052 vrGroup->setTitle("Volume rendering");
00053
00054 QGroupBox *cpGroup = new QGroupBox(this);
00055 cpGroup->setTitle("Control panel");
00056
00057 cpGroup->setMinimumSize(260,700);
00058 cpGroup->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
00059
00060 QHBoxLayout *mainLayout = new QHBoxLayout(this);
00061 mainLayout->addWidget(vrGroup);
00062 mainLayout->addWidget(cpGroup);
00063
00064 QVBoxLayout *vrGroupLayout = new QVBoxLayout(vrGroup);
00065 m_vrGLWidget = new vrGLWidget(vrGroup);
00066 vrGroupLayout->addWidget(m_vrGLWidget);
00067
00068 QVBoxLayout *cpGroupLayout = new QVBoxLayout(cpGroup);
00069
00070
00071 m_tabWidget = new QTabWidget;
00072
00073 cpGroupLayout->addWidget(m_tabWidget);
00074
00075 QGroupBox *basictfGroup = new QGroupBox(this);
00076 basictfGroup->setTitle("Density-based Transfer Functions");
00077
00078 m_tabWidget->addTab(basictfGroup, tr("Main"));
00079
00080 basictfGroup->setMinimumSize(260,700);
00081 basictfGroup->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
00082
00083 QVBoxLayout *basictfGroupLayout = new QVBoxLayout(basictfGroup);
00084
00085 QGroupBox *fileGroup = new QGroupBox(cpGroup);
00086 fileGroup->setTitle("File");
00087
00088 fileGroup->setMinimumSize(260,50);
00089 fileGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
00090
00091 basictfGroupLayout->addWidget(fileGroup);
00092
00093 QVBoxLayout *fileGroupLayout = new QVBoxLayout(fileGroup);
00094
00095 m_openButton = new QPushButton("Open");
00096 fileGroupLayout->addWidget(m_openButton);
00097 connect(m_openButton, SIGNAL(clicked()), m_vrGLWidget, SLOT(loadData()));
00098
00099 QGroupBox *samplingGroup = new QGroupBox(cpGroup);
00100 samplingGroup->setTitle("Sampling");
00101
00102 samplingGroup->setMinimumSize(260,50);
00103 samplingGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
00104
00105 basictfGroupLayout->addWidget(samplingGroup);
00106
00107 QVBoxLayout *samplingGroupLayout = new QVBoxLayout(samplingGroup);
00108
00109 samplingSlider = createSlider();
00110 samplingGroupLayout->addWidget(samplingSlider);
00111 connect(samplingSlider, SIGNAL(valueChanged(int)), m_vrGLWidget, SLOT(setSampling(int)));
00112
00113 connect(m_vrGLWidget, SIGNAL(samplingChanged(int)), samplingSlider, SLOT(setValue(int)));
00114
00115
00116 tf_editor = new GradientWidget(cpGroup);
00117 basictfGroupLayout->addWidget(tf_editor);
00118 connect(tf_editor, SIGNAL(tfready(QImage &)), m_vrGLWidget, SLOT(setTFtexture(QImage &)));
00119
00120 connect(tf_editor, SIGNAL(tfready(QImage &)), this, SLOT(setThresholdImage(QImage &)));
00121 m_threshold_image = QImage();
00122 m_threshold_image.fill(0);
00123 m_threshold.clear();
00124
00125 connect(m_vrGLWidget, SIGNAL(histogramChanged(QList<int> &)), tf_editor, SIGNAL(histogram_changed(QList<int> &)));
00126
00127
00128
00129 QGroupBox *sizetfGroup = new QGroupBox(this);
00130 sizetfGroup->setTitle("Space-space Transfer Functions Data");
00131
00132
00133
00134 m_tabWidget->addTab(sizetfGroup, tr("Scale-space"));
00135
00136 sizetfGroup->setMinimumSize(260,700);
00137 sizetfGroup->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
00138
00139 QVBoxLayout *sizetfGroupLayout = new QVBoxLayout(sizetfGroup);
00140
00141
00142 QGroupBox *computeControlsGroup = new QGroupBox(cpGroup);
00143 computeControlsGroup->setTitle("Compute Scale-space Data");
00144
00145 sizetfGroupLayout->addWidget(computeControlsGroup);
00146
00147 computeControlsGroup->setMinimumSize(260,70);
00148 computeControlsGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
00149
00150 QHBoxLayout *computeControlsGroupLayout = new QHBoxLayout(computeControlsGroup);
00151
00152 m_computeScalesButton = new QPushButton("Compute");
00153 computeControlsGroupLayout->addWidget(m_computeScalesButton);
00154
00155 connect(m_computeScalesButton, SIGNAL(clicked()), this, SLOT(setScaleSpaceParameters()));
00156 connect(this, SIGNAL(updateScaleSpace(QList<QString> &,QList<QString> &,int)), m_vrGLWidget, SLOT(computeScaleSpaceData(QList<QString> &,QList<QString> &,int)));
00157
00158
00159
00160 m_progressbar = new QProgressBar(cpGroup);
00161 m_progressbar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
00162
00163
00164
00165 m_progressbar_value = 0;
00166
00167 sizetfGroupLayout->addWidget(m_progressbar);
00168
00169 connect(m_vrGLWidget, SIGNAL(scaleSpaceComputationProgress()), this, SLOT(updateScaleSpaceProgressBar()));
00170
00171
00172 QGroupBox *hwOptimizationGroup = new QGroupBox(cpGroup);
00173 hwOptimizationGroup->setTitle("Hardware Optimization");
00174
00175 hwOptimizationGroup->setMinimumSize(260,50);
00176 hwOptimizationGroup->setMaximumSize(300,50);
00177 hwOptimizationGroup->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
00178
00179 sizetfGroupLayout->addWidget(hwOptimizationGroup);
00180
00181 QHBoxLayout *hwOptimizationGroupLayout = new QHBoxLayout(hwOptimizationGroup);
00182
00183 cuda_button = new QRadioButton("CUDA", cpGroup);
00184 cg_button = new QRadioButton("Cg", cpGroup);
00185 sse_button = new QRadioButton("SSE", cpGroup);
00186 cpu_button = new QRadioButton("CPU", cpGroup);
00187
00188 cg_button->setChecked(true);
00189 m_hw_optimization = 6;
00190
00191 hwOptimizationGroupLayout->addWidget(cuda_button);
00192 hwOptimizationGroupLayout->addWidget(cg_button);
00193 hwOptimizationGroupLayout->addWidget(sse_button);
00194 hwOptimizationGroupLayout->addWidget(cpu_button);
00195
00196
00197 QGroupBox *valueRangeScalesGroup = new QGroupBox(cpGroup);
00198 valueRangeScalesGroup->setTitle("Filtering Values from 'scales.txt'");
00199
00200 valueRangeScalesGroup->setMinimumSize(260,200);
00201
00202 valueRangeScalesGroup->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
00203
00204 sizetfGroupLayout->addWidget(valueRangeScalesGroup);
00205
00206 QHBoxLayout *valueRangeScalesGroupLayout = new QHBoxLayout(valueRangeScalesGroup);
00207
00208 m_listWidget = new QListWidget(cpGroup);
00209
00210 valueRangeScalesGroupLayout->addWidget(m_listWidget);
00211
00212
00213 readScalesInputFile();
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 setLayout(mainLayout);
00234
00235 setWindowTitle(tr("bcube 0.2"));
00236 }
00237
00238 Window::~Window()
00239 {
00240 }
00241
00242 QSlider *Window::createSlider()
00243 {
00244 QSlider *slider = new QSlider(Qt::Horizontal);
00245 slider->setRange(0, 1024);
00246 slider->setSingleStep(16);
00247 slider->setPageStep(15 * 16);
00248 slider->setTickInterval(15 * 16);
00249 slider->setTickPosition(QSlider::TicksBelow);
00250 return slider;
00251 }
00252
00253 void Window::setScaleSpaceParameters()
00254 {
00255 readScalesInputFile();
00256
00257
00258
00259
00260
00261 if(cuda_button->isChecked())
00262 {
00263 m_hw_optimization = 4;
00264 }
00265 else if(cg_button->isChecked())
00266 {
00267 m_hw_optimization = 6;
00268 }
00269 else if(sse_button->isChecked())
00270 {
00271 m_hw_optimization = 2;
00272 }
00273 else if(cpu_button->isChecked())
00274 {
00275 m_hw_optimization = 1;
00276 }
00277
00278 qDebug() << "hw optimization:" << m_hw_optimization << "\n";
00279
00280
00281 int progress_steps_count;
00282 progress_steps_count = 0;
00283
00284
00285 progress_steps_count += 1;
00286
00287 progress_steps_count += 1;
00288
00289 progress_steps_count += m_scales_values.size() * 3;
00290
00291 progress_steps_count += 1;
00292
00293 m_progressbar->setMinimum(0);
00294 m_progressbar->setMaximum(progress_steps_count);
00295
00296 m_progressbar->setValue(0);
00297 m_progressbar_value = 0;
00298
00299 m_progressbar_step = 1;
00300 emit updateScaleSpace(m_threshold, m_scales_values,m_hw_optimization);
00301 }
00302
00303 void Window::updateScaleSpaceProgressBar()
00304 {
00305 m_progressbar_value += m_progressbar_step;
00306 m_progressbar->setValue(m_progressbar_value);
00307 }
00308
00309 void Window::setThresholdImage(QImage &thld_img)
00310 {
00311 m_threshold_image = thld_img;
00312
00313 int iy = 0;
00314 int ix;
00315 int max1,max2,max3,max4;
00316 max1 = max2 = max3 = max4 = 0;
00317 int val_before = 0;
00318 int val_current = 0;
00319 int val_next = 0;
00320
00321 int global_max = 0;
00322 for (ix = 0; ix < 256; ix++)
00323 {
00324 QRgb tfc_current = m_threshold_image.pixel(ix,iy);
00325 val_current = qAlpha(tfc_current);
00326 if(val_current > global_max)
00327 global_max = val_current;
00328 }
00329
00330
00331 for (ix = 0; ix < 256; ix++)
00332 {
00333 if(ix == 0)
00334 val_before = 0;
00335 else
00336 {
00337 QRgb tfc_before = m_threshold_image.pixel(ix-1,iy);
00338 val_before = qAlpha(tfc_before);
00339 }
00340
00341 QRgb tfc_current = m_threshold_image.pixel(ix,iy);
00342 val_current = qAlpha(tfc_current);
00343
00344 if(ix == 255)
00345 val_next = 0;
00346 else
00347 {
00348 QRgb tfc_next = m_threshold_image.pixel(ix+1,iy);
00349 val_next = qAlpha(tfc_next);
00350 }
00351
00352 if((val_before == 0) && (val_next > 0))
00353 max1 = ix;
00354
00355 if( (val_before < global_max) && (val_next == global_max ) )
00356 max2 = ix;
00357
00358 if( (val_before == global_max) && (val_next < global_max ) )
00359 max3 = ix;
00360
00361 if((val_before > 0) && (val_next == 0 ))
00362 max4 = ix;
00363 }
00364
00365 m_threshold.clear();
00366 m_threshold.append(QString::number(max1));
00367 m_threshold.append(QString::number(max2));
00368 m_threshold.append(QString::number(max3));
00369 m_threshold.append(QString::number(max4));
00370
00371 qDebug() << "threshold:" << max1 << max2 << max3 << max4;
00372 }
00373
00374 void Window::readScalesInputFile()
00375 {
00376 m_scales_values.clear();
00377 m_listWidget->clear();
00378
00379
00380 QFile file("scales.txt");
00381 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
00382 return;
00383
00384 QTextStream in(&file);
00385 while (!in.atEnd()) {
00386 QString line = in.readLine();
00387
00388 new QListWidgetItem(line, m_listWidget);
00389 m_scales_values.append(line);
00390 }
00391
00392 file.close();
00393 }