Day38 Qchart绘制灰度直方图

2023-10-28 08:12

本文主要是介绍Day38 Qchart绘制灰度直方图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.场景

一个小场景是,点击按钮将显示一张图片,灰度直方图将立即更新该图片的灰度统计结果。主要借助此场景说明直方图的创建步骤。实际应用中,可以在采集图片流时适时发出更新灰度统计信号,即可实时显示当前画面的统计信息,用于指示调节曝光时间。

2.步骤

1.qt的组件中安装qt chart模块

2.Qt ,pro文件中添加chart模块

QT  += core gui charts

3.添加模块相关的头文件

#include <QChart>
#include <QChartView>
#include <QtCharts/QChart>
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QCategoryAxis>
#include <QtCharts/QValueAxis>

4.初始化画图程序

在界面初始化的时候,画一个直方图的框架,留下数据更新接口,程序运行时,通过信号槽的方式,在槽函数中添加更新直方图数据的代码。现介绍初始化部分。可以将QChart类比为一个画布,它提供了绘制图表所需的各种属性和方法。可以在QChart对象上添加不同类型的图表元素,如曲线、柱状图、饼图等。QChart负责管理和绘制这些图表元素,并提供一些功能,如坐标轴、图例、背景等。而QChartView类则可以看作是一个显示器,它将QChart对象的内容显示在窗口中。QChartView提供了一个图表视图,可以在其中显示QChart对象,并支持用户交互操作,例如缩放、平移、选择等。QChartView还可以设置一些显示属性,如背景颜色、边框样式等。可以将QChart理解为图表的数据和样式的容器,而QChartView则是将这些数据和样式以图形的形式展示出来的视图。通过将QChart对象与QChartView对象结合使用,我们可以在窗口中创建、显示和操作各种类型的图表。QBarSeries包含多个QBarSet对象,每个QBarSet对象代表一个柱子的数据集。QCategoryAxis用于在水平方向上显示类别,例如产品名称。QValueAxis用于在垂直方向上显示值,例如销售量。代码如下:

void MainWindow::initHistogram()
{grayChart= new QChart();//创建视图grayChart->setTitle("Histogram");QChartView* graphicsView = new QChartView(grayChart,ui->widget);//创建表格与视图绑定graphicsView->setRenderHint(QPainter::Antialiasing);//抗锯齿QVBoxLayout* layout_bottom_ = new QVBoxLayout(ui->widget);layout_bottom_->setMargin(0);layout_bottom_->setSpacing(0);layout_bottom_->addWidget(graphicsView);QBarSet * set = new QBarSet("灰度值",this);//柱子set->setBrush(QBrush(Qt::gray));set->setPen(QPen(Qt::gray));//包含关系是:Qchart(QChartView显示)>>QBarSeries>>QBarSetseries = new QBarSeries(grayChart);//柱子族中只有一根柱子(一种柱子)series->append(set);series->setBarWidth(1);// 设置柱子宽度grayChart->addSeries(series);// 向直方图中添加数据系列grayChart->legend()->setVisible(false); // 显示图例// 初始化坐标轴画笔和标签字体QPen pen(Qt::black);pen.setWidth(2);QFont font;font.setBold(true);font.setPointSize(9);// 设置横坐标m_axisX = new QCategoryAxis();//水平方向上显示柱子族m_axisX->setRange(0, 255);// 设置x轴刻度标签for (int i = 0; i <= 255; i+=20) {m_axisX->append(QString::number(i), i);}m_axisX->append("0",0);m_axisX->append("255",255);m_axisX->setGridLineVisible(false);m_axisX->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue);grayChart->addAxis(m_axisX, Qt::AlignBottom);// 添加坐标轴series->attachAxis(m_axisX);// 将坐标轴与数据系列绑定m_axisX->setLinePen(pen);// 设置坐标轴及其网格线m_axisX->setGridLinePen(pen);m_axisX->setLabelsFont(font);// 设置纵坐标m_axisY = new QValueAxis();//水平方向上显示柱子族的对应数值m_axisY->setLabelFormat("%d");// 设置坐标轴刻度m_axisY->setTickCount(2);// 设置纵向刻度数目m_axisY->setGridLineVisible(false);grayChart->addAxis(m_axisY, Qt::AlignLeft); // 添加坐标轴series->attachAxis(m_axisY);// 将坐标轴与数据系列绑定m_axisY->setLinePen(pen); // 设置坐标轴及其网格线m_axisY->setGridLinePen(pen);m_axisY->setLabelsFont(font);grayChart->setBackgroundBrush(QColor(255, 255, 255));grayChart->setMargins(QMargins(0, 0, 0, 0)); // 设置边距,以增加边框的宽度
}

5.响应程序

在框架搭好的基础上,写一个槽函数用于更新直方图数据。需要注意,更新数据的时候需要从series中把原来的柱子clear掉,在添加新的柱子,如果试图清楚柱子的内容在更新柱子会出错。下面的程序是接收来自相应信号的QImage对象,然后通过遍历像素统计灰度分布,最后添加柱子对象barset更新直方图。

void MainWindow::doProcessUpdateHistogram(const QImage &img)
{series->clear();QBarSet *barSet = new QBarSet("灰度值",this);QVector<int> newData(256, 0);barSet->setBrush(QBrush(Qt::gray));barSet->setPen(QPen(Qt::gray));series->append(barSet);QImage image = img.convertToFormat(QImage::Format_Grayscale8);// 遍历每个像素 统计其灰度值uchar * imgData = image.bits();for (int x = 0; x < image.height()*image.width(); x++) {newData[imgData[x]] = newData[imgData[x]]+1;}int y_range = 0;for (int i = 0; i < 256; ++i) {barSet->append(static_cast<qreal>(newData[i]));if(newData[i] > y_range){y_range = newData[i] ;}}m_axisX->setRange(0, 255);m_axisY->setRange(0, y_range);//设置纵坐标范围grayChart->update();
}


3.源码与效果

源码链接

这篇关于Day38 Qchart绘制灰度直方图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291890

相关文章

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

Java高级Day38-网络编程作业

112.网络编程作业 //1.使用字符流的方式,编写一个客户端程序和服务器端程序//2.客户端发送"name",服务器端接收到后,返回"我是nova"//3.客户端发送"hobby",服务器端接收到后,返回"编写java程序"//4.不是这两个问题,回复"你说啥呢"​​===============//客户端//===============public class SocketT

使用matplotlib绘制散点图、柱状图和饼状图-学习篇

一、散点图 Python代码如下: num_points = 100x = np.random.rand(num_points) #x点位随机y = np.random.rand(num_points) #y点位随机colors = np.random.rand(num_points) #颜色随机sizes = 1000 * np.random.rand(num_points) # 大

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

Excel绘制CDF图

对如下20个原始数据绘制cdf图 1. 对数据进行排序,从小到大 2. 计算累积分布: 计算公式为: 然后对C3下拉,得到累积分布数据。 3. 选中B、C两列绘制散点图:

有无直方图,性能的差距

################################# ###有无直方图,性能的差距### ################################# 实验的环境在redhat平台下的11gr2单实例环境 1、在自己定义的用户下创建表及索引 CREATE TABLE customers AS SELECT * FROM sh.customers; CREATE INDEX cu

【python 图像绘制】图像绘制知识总结

颜色图谱 具体颜色描述autumn 红橙黄cool 青-洋红copper 黑-铜flag 红-白-蓝-黑gray 黑-白hot 黑-红-黄-白hsv hsv颜色空间, 红-黄-绿-青-蓝-洋红-红inferno 黑-红-黄jet 蓝-青-黄-红magma 黑-红-白pink 黑-粉-白plasma 绿-红-黄prism 红-黄-