zoukankan      html  css  js  c++  java
  • 4. 绘制光谱曲线QGraphicsView类

    一、前言

    Qt的QGraphicsView类具有强大的视图功能,与其一起使用的还有QGraphicsScene类和QGraphicsItem类。大体思路就是通过构建场景类,然后向场景对象中增加各种图元,最后利用QGraphicsView类对场景进行显示。

    二、绘制光谱曲线

    实现功能主要有:

    1 传递点击图像行列号,然后绘制曲线,代码如下:

     1 void SpectralProfileDialog::AddPressSlot()
     2 {
     3     //setModal(0);
     4     HyperProcess *ptr = (HyperProcess*)parentWidget();
     5     curFileName = ptr->curFileName;
     6     currentRow = ptr->curRow;
     7     currentCol = ptr->curCol;
     8 
     9     if(curFileName == "")
    10     {
    11         QMessageBox::information(this,"Message Error","Current Scene IS NULL!");
    12         return;
    13     }
    14 
    15     if(currentCol == -1 || currentRow == -1)
    16     {
    17         QMessageBox::information(this,"Message Error","please Select A Pixel");
    18         return;
    19     }
    20 
    21     cv::Mat curImg = GDALOpenCV::GDAL2Mat(curFileName);
    22     if(currentCol > curImg.cols || currentRow > curImg.rows)
    23         return;
    24 
    25     int count  = curImg.channels();
    26 
    27     std::vector<cv::Mat> curImgMat(count);
    28     cv::split(curImg,curImgMat);
    29 
    30     QVector<QPointF> pixSpectralData(count);
    31     double tmpMaxValue;
    32     double tmpMinValue;
    33     double maxValue = 0;
    34     for(int c = 0;c<count;c++)
    35     {
    36         cv::minMaxIdx(curImgMat[c],&tmpMinValue,&tmpMaxValue);
    37         if(maxValue < tmpMaxValue)
    38             maxValue = tmpMaxValue;
    39         pixSpectralData[c].setX(curImgMat[c].at<float>(currentCol,currentRow));
    40         pixSpectralData[c].setY(c+1);
    41     }
    42 
    43     float x_scale = 1.0*(ui->spectralGraphicsView->height()-1)/maxValue;
    44     float y_scale = 1.0*(ui->spectralGraphicsView->width()-1)/count;
    45 
    46     QPen pen;
    47     pen.setWidth(2);
    48     QColor qc=QColor::fromHsl(rand()%360,rand()%256,rand()%200);
    49     pen.setColor(QColor(qc.red(),qc.green(),qc.blue()));
    50 
    51     for(int c = 0;c<curImg.channels()-1;c++)
    52     {
    53         myScene->addLine(pixSpectralData[c].y()*y_scale,-1.0*(pixSpectralData[c].x()*x_scale),
    54                          pixSpectralData[c+1].y()*y_scale,-1.0*(pixSpectralData[c+1].x()*x_scale),pen);
    55     }
    56     ui->spectralGraphicsView->setScene(myScene);
    57 }

    三、效果图

  • 相关阅读:
    Docker-常用命令
    5分钟了解折半插入排序
    Spring框架之IOC原理
    使用JS实现简单喷泉效果
    坦克大战系列6-API常用函数说明1
    坦克大战系列6-API常用函数说明2
    为什么要使用-Docker
    SQL语言:存储过程
    使用原生JS重构简单的音乐播放器
    [区间DP]ZOJ3541 The Last Puzzle
  • 原文地址:https://www.cnblogs.com/zyore2013/p/4673033.html
Copyright © 2011-2022 走看看