qt中opencv怎么用qcostomplot画灰度分布图
时间: 2023-12-26 10:04:00 浏览: 72
以下是一个简单的示例程序,展示如何使用Qt和OpenCV以及QCustomPlot绘制灰度分布图:
```cpp
#include <QApplication>
#include <QMainWindow>
#include "qcustomplot.h"
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建主窗口
QMainWindow mainWindow;
mainWindow.setWindowTitle("Gray Histogram");
mainWindow.setGeometry(100, 100, 800, 600);
//创建QCustomPlot对象并添加到主窗口
QCustomPlot *customPlot = new QCustomPlot(&mainWindow);
customPlot->setGeometry(50, 50, 700, 500);
customPlot->xAxis->setLabel("Gray Level");
customPlot->yAxis->setLabel("Pixel Count");
customPlot->xAxis->setRange(0, 255);
//读取图像并计算灰度分布
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
int histSize = 256;
float range[] = {0, 256};
const float* histRange = {range};
cv::Mat hist;
cv::calcHist(&image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange);
//将灰度分布数据添加到QCustomPlot对象中
QVector<double> xData, yData;
for (int i = 0; i < histSize; i++)
{
xData.append(i);
yData.append(hist.at<float>(i));
}
QCPBars *bars = new QCPBars(customPlot->xAxis, customPlot->yAxis);
bars->setData(xData, yData);
//显示主窗口
mainWindow.show();
return a.exec();
}
```
在上述示例程序中,首先创建了一个QMainWindow对象作为主窗口,然后创建了一个QCustomPlot对象并添加到主窗口中。接着读取图像并计算灰度分布,将灰度分布数据添加到QCustomPlot对象中,最后显示主窗口。
需要注意的是,在使用OpenCV计算灰度分布时,需要使用cv::calcHist函数。该函数的第一个参数是输入图像,第二个参数是输入图像的数量(通常为1),第三个参数是通道索引(如果图像是单通道的,则为0),第四个参数是掩码图像(如果没有,则为cv::Mat()),第五个参数是输出的直方图,第六个参数是直方图的维数,第七个参数是每一维的直方图大小,第八个参数是每一维的取值范围。在本例中,因为是灰度图像,所以直方图的维数为1,每一维的大小为256,取值范围为0到255。计算出直方图后,需要将数据转换为QVector<double>类型,并将其添加到QCustomPlot对象中。最后使用show()函数显示主窗口。
阅读全文