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 }

三、效果图

时间: 2024-07-30 22:20:52

4. 绘制光谱曲线QGraphicsView类的相关文章

【MFC】MFC绘制动态曲线,用双缓冲绘图技术防闪烁

摘自:http://zhy1987819.blog.163.com/blog/static/841427882011614103454335/ MFC绘制动态曲线,用双缓冲绘图技术防闪烁 2011-07-14 10:34:54|  分类: 学习笔记 |  标签:双缓冲绘图技术  mfc  动态曲线   |举报 |字号 订阅 先上效果图 随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新.一.如何绘制动态曲线. 所谓动画,都是一帧一帧的图像连续呈现在用户面前形成的.所以如果你掌握了如何绘制静

C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码

C#WPF 如何绘制几何图形? 怎么绘制坐标系? 这离不开Path(System.Windows.Shapes)和StreamGeometry(System.Windows.Media)类. 一.建立WPF工程 二.添加代码 MainWindow.xaml 中代码 <Window x:Class="WPFDrawingTraning.MainWindow"         xmlns="<a target=_blank href="http://sche

pyqt中使用matplotlib绘制动态曲线

一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟,每一秒钟绘制一个点,X轴长度超过1分钟,则左移1秒刻度,实现动态效果 2)Y轴显示随机变化的数值,1-100 三.准备工作 1环境:python3.3,eric5,pyqt4 四.开始动手: 使用Eric创建新项目: 在设计编码前期主要用到Eric的两个窗口:源码和窗体浏览器,类似delphi.

Sketch Nyquist plot 徒手绘制Nyquist 曲线

Sketch Nyquist plot 这是相当纠结的领悟.我始终没明白Nyquist曲线究竟是怎么回事,简直痛苦 之前讲了 波特图入门 徒手绘制波特图 波特图就是讲幅频特性和相频特性分别绘制在两幅图片上,而Nyquist曲线是将这两幅图合并成一幅图. 现实生活中多是黑箱模型,系统内部的结构是不知道的,为了测试系统的幅频特性和相频特性,会采用向系统输入各种频率不同的正弦信号的形式,(默认线性系统),这样得到输出信号和输入信号做比较.每一个频率都有对应的输出幅值和相角! 什么是Nyquist曲线?

canvas绘制贝塞尔曲线

原文:canvas绘制贝塞尔曲线 1.绘制二次方贝塞尔曲线 quadraticCurveTo(cp1x,cp1y,x,y); 其中参数cp1x和cp1y是控制点的坐标,x和y是终点坐标 数学公式表示如下: 二次方贝兹曲线的路径由给定点P0.P1.P2的函数B(t)追踪: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <

Matlab 如何绘制复杂曲线的包络线

Matlab 如何绘制复杂曲线的包络线 http://jingyan.baidu.com/article/aa6a2c14d36c710d4c19c4a8.html 如果一条曲线(比如声音波形)波动很大,曲折复杂,可以通过绘制包络线的方式使其更加平滑和清晰.本经验帮助刚接触matlab不久的新手完成这一过程. 工具/原料 Matlab 软件 样本数据 方法/步骤 处理前后的效果对比,图示为某声波傅里叶变换(fft)后的频谱图.   原数据为横纵坐标为 frequency 和 Amplitude,

绘制希尔伯特曲线

转自:http://www.easyx.cn/samples/View.aspx?id=57 #include "stdafx.h" #include <graphics.h>#include <conio.h>#include <string>using namespace std; int g_len; // Hilbert 曲线的单位长度//string a;//string a = "123"; // 递归绘制 Hilbe

在频数直方图上绘制正态分布曲线

首先,了解几个相关概念. 频数:在一组样本数据中,不同的数据出现的次数有多有少,或者说它们出现的频繁程度不同,我们称每个数据出现的次数为频数. 频率:每个数据出现的次数与样本数据总量的比值为频率. 组数:把全体样本数据分成的组的个数(当数据总量在100个以内时,常常分为5-12组). 组距:把全体样本数据分成若干个组,每个小组在x轴上的两个左右端点的距离. 极差:全体样本数据中的最大值与最小值的差. 由以上定义,可以得到下面的关系: 频数 极差 频率 = ———————— , 组距 = ————

pyqt中使用matplotlib绘制动态曲线 – pythonic

一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟,每一秒钟绘制一个点,X轴长度超过1分钟,则左移1秒刻度,实现动态效果 2)Y轴显示随机变化的数值,1-100 三.准备工作 1环境:python3.3,eric5,pyqt4 四.开始动手 : 使用Eric创建新项目: 在设计编码前期主要用到Eric的两个窗口:源码和窗体浏览器,类似delphi.