OpenCV plot 模块实战:用 opencv_contrib 快速绘制 1D/2D 数据图表
计算机视觉图像处理深度学习机器学习【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址https://gitcode.com/gh_mirrors/op/opencv_contrib点击查看免费下载plot是 opencv_contrib 仓库中的轻量级绘图模块让你无需引入 matplotlib 等第三方库直接用 OpenCV 原生能力把一维或二维数据渲染成图表。通过本文你将掌握如何用plot::Plot2d绘制曲线、如何调整窗口尺寸、坐标轴范围与各元素颜色以及如何实时显示绘图结果或将其保存为 PNG 图片。模块定位在 OpenCV 内部完成数据可视化plot模块的核心能力正如其 README 所描述This Plot module allows you to easily plot data in 1D or 2D. You can change the size of the window, the limits of the axis and the colors of each element. You can also show in real time the plot you are building or save the plot as an image (png).即支持一维/二维数据绘图可调整窗口尺寸、坐标轴范围和每个元素的颜色既能实时显示正在构建的图表也能把图表保存为 PNG 图片。模块由 Nuno Moutinho 创建头文件与实现文件中的版权注释均予以标注见 plot.hpp。从 CMakeLists.txt 可以看到模块的依赖关系与语言绑定情况set(the_description Plot function for Mat data.) ocv_define_module(plot opencv_core opencv_imgproc WRAP python java objc)它只依赖opencv_core矩阵与标量和opencv_imgprocline、circle、putText等绘图原语并提供 Python、Java、Objective-C 语言绑定。数据输入一维矩阵与坐标要求Plot2d通过静态工厂方法create创建公开接口定义在 plot.hpp提供两种重载重载说明create(InputArray data)只传一组 Y 值X 自动取数据下标0, 1, 2, …create(InputArray dataX, InputArray dataY)同时指定每个点的 X 与 Y 坐标在 plot.cpp 的实现中对输入矩阵有两个硬性约束形状必须是 1xN 或 Nx1若行列都大于 1会抛出CV_Error(Error::StsBadArg, ERROR: Plot data must be a 1xN or Nx1 matrix.\n)数据类型必须是CV_64Fdouble通过CV_Assert(_plotData.type() CV_64F)强制校验。如果传入的是行向量cols rows构造函数会自动转置为列向量。单参数版本还会生成 X 序列plotDataY _plotData; plotDataX plotDataY * 0; for (int i 0; i plotDataY.rows; i) { plotDataX.atdouble(i, 0) i; }因此用Mat::zeros或循环填充CV_64F矩阵是构造绘图数据的最标准方式。完整 API配置轴、颜色、网格与渲染Plot2d继承自cv::Algorithm见 plot.hpp所有配置方法均通过CV_WRAP导出到绑定语言完整清单如下方法作用setMinX(double)/setMaxX(double)设置 X 轴显示范围下限/上限setMinY(double)/setMaxY(double)设置 Y 轴显示范围下限/上限setPlotSize(int width, int height)设置输出画布尺寸宽、高setPlotLineWidth(int)设置曲线/散点的线宽setNeedPlotLine(bool)为true时相邻点用线段连接折线为false时按独立散点绘制setPlotLineColor(Scalar)设置曲线颜色setPlotBackgroundColor(Scalar)设置背景颜色setPlotAxisColor(Scalar)设置坐标轴颜色setPlotGridColor(Scalar)设置网格颜色setPlotTextColor(Scalar)设置刻度文字颜色setShowGrid(bool)是否显示网格setShowText(bool)是否显示坐标刻度文字setGridLinesNumber(int)设置网格线数量setInvertOrientation(bool)是否反转 Y 轴方向图像坐标下 Y 向下setPointIdxToPrint(int)指定在左上角打印坐标的数据点下标render(OutputArray plotResult)把图表渲染输出到Mat默认样式与参数边界源码级确认在 plot.cpp 的plotHelper中模块为每个新创建的图设置了默认参数创建后不调用任何 setter 即可直接渲染画布尺寸600 × 400setPlotSize(600, 400)曲线线宽1颜色曲线青黄色Scalar(0, 255, 255)、背景黑色Scalar(0, 0, 0)、坐标轴红色Scalar(0, 0, 255)、网格白色Scalar(255, 255, 255)、文字白色Scalar(255, 255, 255)默认显示网格与刻度文字setShowGrid(true)、setShowText(true)网格线数量10连线模式默认开启needPlotLine trueY 轴不反转invertOrientation false。几个 setter 还带有参数边界保护见 plot.cppsetPlotSize的最小值为宽 400、高 300传入更小的值会被钳制到该下限setGridLinesNumber传入非正数时被强制置为 1setPointIdxToPrint传入越界下标时回退到最后一个数据点rows - 1。X/Y 轴范围未手动设置时会自动取数据的最小/最大值通过minMaxLoc计算坐标原点0 点也会被并入范围保证轴线位于画面内。核心流程创建 → 配置 → render → 显示/保存plot模块与 OpenCV 生态无缝衔接的关键在于render方法它把图表直接渲染到一张CV_8UC3的Mat见 plot.cpp。既然输出是普通 Mat就自然拥有了两条出路实时显示配合highgui的imshowwaitKey即可实时展示正在构建的图表保存图片配合imwrite即可把图表保存为 PNG 图片README 中明确支持 png 输出。这也是 README 中 show in real time the plot you are building or save the plot as an image (png) 的底层实现方式。实战示例绘制三次函数并自定义样式仓库自带完整示例 plot_demo.cpp演示了从构造数据到自定义样式的全过程#include opencv2/highgui.hpp #include opencv2/plot.hpp #include iostream using namespace cv; int main() { Mat data_x(1, 51, CV_64F); Mat data_y(1, 51, CV_64F); for (int i 0; i data_x.cols; i) { double x (i - data_x.cols / 2); data_x.atdouble(0, i) x; data_y.atdouble(0, i) x * x * x; // y x^3 } Mat plot_result; Ptrplot::Plot2d plot plot::Plot2d::create(data_x, data_y); plot-render(plot_result); imshow(The plot rendered with default visualization options, plot_result); // 自定义可视化选项 plot-setShowText(false); // 关闭刻度文字 plot-setShowGrid(false); // 关闭网格 plot-setPlotBackgroundColor(Scalar(255, 200, 200)); // 浅粉背景 plot-setPlotLineColor(Scalar(255, 0, 0)); // 红色曲线 plot-setPlotLineWidth(2); // 加粗曲线 plot-setInvertOrientation(true); // 反转 Y 轴 plot-render(plot_result); imshow(The plot rendered with some of custom visualization options, plot_result); waitKey(); return 0; }示例展示了两段式用法先用默认样式渲染一次得到黑底、黄色折线、白色网格的效果再通过一系列 setter 修改样式后二次渲染。把imshow换成imwrite(plot.png, plot_result)即可实现 README 所说的 PNG 保存。示例还覆盖了散点模式只要设置setNeedPlotLine(false)render就会改用circle逐点绘制见 plot.cpp适合展示离散测量数据。渲染原理线性插值与图像坐标变换render的底层实现值得了解它解释了为什么图表渲染如此轻量见 plot.cpp坐标映射通过linearInterpolation把数据值域线性映射到画布像素坐标。X 方向映射[plotMinX, plotMaxX] → [0, plotSizeWidth]Y 方向默认映射[plotMinY, plotMaxY] → [0, plotSizeHeight]若开启setInvertOrientation(true)则上下颠倒因为图像坐标 Y 轴向下反转后数学上的上在画布顶部。轴与网格drawAxis先计算原点在图像中的像素位置把 0 值也纳入插值范围保证坐标轴可见然后用line绘制 X/Y 轴线并用间距为plotSizeHeight / gridLinesNumber的短虚线Trace 模式绘制网格。曲线/散点绘制连线模式用line顺序连接相邻插值点散点模式用circle逐点画半径为 1 的小圆。文字标注setShowText(true)时putText会在原点四周绘制轴刻度值并在左上角打印setPointIdxToPrint指定点的坐标格式如X_5 2.5见 plot.cpp。编译与运行plot是 opencv_contrib 的 extra module不包含在 OpenCV 主仓库中。构建时通过OPENCV_EXTRA_MODULES_PATH指向本仓库的modules目录即可启用git clone 本仓库地址 cd opencv mkdir build cd build cmake -DOPENCV_EXTRA_MODULES_PATH/path/to/opencv_contrib/modules .. make -j$(nproc)启用后即可编译运行modules/plot/samples/plot_demo.cpp需同时链接opencv_plot、opencv_core、opencv_imgproc、opencv_highgui。由于接口带CV_WRAP且 CMake 声明了 Python/Java/ObjC 绑定Python 等语言中同样可以使用cv2.plot.Plot2d_create完成绘图适合在纯 OpenCV 环境内快速产出可视化结果。小结plot模块以极小的 API 面一个类、两个工厂方法、一组 setter 加一个render覆盖了日常数据可视化的核心需求1D/2D 数据绘图、窗口尺寸与坐标范围控制、元素配色、网格/文字开关、实时显示与 PNG 导出。由于渲染结果是标准Mat它能与 OpenCV 的图像处理管线、imshow显示和imwrite存储无缝衔接是嵌入式或纯 OpenCV 环境下轻量绘图的实用选择。赞分享计算机视觉图像处理深度学习机器学习【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址https://gitcode.com/gh_mirrors/op/opencv_contrib点击查看免费下载相关推荐plotly.py 统计图表实战指南用 Histogram、Box Plot 与 SPLOM 绘制分布与多维数据plotly.py 统计图表实战指南用 Histogram、Box Plot 与 SPLOM 绘制分布与多维数据 统计图表是探索数据分布、识别离群点、观察变量数据可视化数据分析OpenCV HDF5 数据集读写实战使用 opencv_contrib hdf 模块创建、写入与读取 cv::MatOpenCV HDF5 数据集读写实战使用 opencv_contrib hdf 模块创建、写入与读取 cv::Mat 本篇技术指南围绕 opencv_con计算机视觉图像处理深度学习机器学习Highcharts 图表中的绘图带(Plot Bands)与绘图线(Plot Lines)详解Highcharts 图表中的绘图带 Plot Bands 与绘图线 Plot Lines 详解 概述 在数据可视化领域Highcharts 作为一款功能强大数据可视化前端上一篇Leantime 敏捷项目管理3 步部署10 分钟跑通看板与时间线下一篇终极指南Happy DOM 如何实现完整的浏览器环境测试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考