前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >五分钟学会C++高效图表绘制神器调用

五分钟学会C++高效图表绘制神器调用

作者头像
OpenCV学堂
发布2020-02-21 14:43:25
8.1K0
发布2020-02-21 14:43:25
举报

引言

给大家介绍一个C++上简单高效的图表绘制与数据可视化的神器 matplotlib-cpp。先交代我的系统配置跟软件版本信息

代码语言:javascript
复制
- Windows 10 64位
- VS2015
- Python3.6.5
- OpenCV4.2

安装与配置Matplotlib-cpp

通过C++调用python的matplotlib工具包实现各种数据图表显示,是最简单的C++图表库。支持Windows跟Linux系统下使用。

下载

代码语言:javascript
复制
git clone https://github.com/lava/matplotlib-cpp.git

目录结构如下:

在contrib文件夹下面打开WinBuild.cmd,运行这个脚本即可完成编译,但是在运行之前先打开修改4~8行的默认参数,符合自己的软件版本与信息,我的修改如下:

代码语言:javascript
复制
REM ------Set Your Environment------------------------------- 
if NOT DEFINED MSVC_VERSION set MSVC_VERSION=14
if NOT DEFINED CMAKE_CONFIG set CMAKE_CONFIG=Release
if NOT DEFINED PYTHONHOME   set PYTHONHOME=C:/Users/Administrator/AppData/Local/Programs/Python/Python36
REM ---------------------------------------------------------

然后在windows 命令行窗口运行如下:

完成编译之后就好啦,现在需要完成VS2015的配置,主要分为三步:

- 配置包含路径

- 配置库目录

- 配置链接器

注意:

还有最重要的一点,把对应的python的home目录设置到环境变量中去!

使用matplotlib-cpp

- 测试matplotlib-cpp

创建一个测试cpp文件,添加如下代码:

代码语言:javascript
复制
#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;
int main() {
    plt::plot({1,3,2,4});
    plt::show();
}

运行结果如下:

OpenCV + matplotlib-cpp联合使用

显示图像

通过 plt::imshow 支持黑白跟彩色图像显示,显示一张图像的代码如下:

代码语言:javascript
复制
Mat src = imread("D:/images/test1.png");
cvtColor(src, src, COLOR_BGR2RGB);
const uchar* buff = src.ptr<uchar>(0);
int h = src.rows;
int w = src.cols;
int channels = src.channels();
plt::title("My Demo");
plt::imshow(buff, h, w, channels);
plt::show();

图像转为HSV色彩空间,对H通道显示对应的直方图曲线

直方图Bar

从数据绘制各种图表

代码语言:javascript
复制
// Prepare data.
int n = 5000; // number of data points
vector<double> x(n), y(n);
for (int i = 0; i<n; ++i) {
    double t = 2 * CV_PI*i / n;
    x.at(i) = 16 * sin(t)*sin(t)*sin(t);
    y.at(i) = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t);
}

// plot() takes an arbitrary number of (x,y,format)-triples. 
// x must be iterable (that is, anything providing begin(x) and end(x)),
// y must either be callable (providing operator() const) or iterable. 
plt::plot(x, y, "r-", x, [](double d) { return 12.5 + abs(sin(d)); }, "k-");


// show plots
plt::show();

显示如下:

来个3D的数据可视化

代码语言:javascript
复制
std::vector<std::vector<double>> x, y, z;
for (double i = -5; i <= 5;  i += 0.25) {
    std::vector<double> x_row, y_row, z_row;
    for (double j = -5; j <= 5; j += 0.25) {
        x_row.push_back(i);
        y_row.push_back(j);
        z_row.push_back(::std::sin(::std::hypot(i, j)));
    }
    x.push_back(x_row);
    y.push_back(y_row);
    z.push_back(z_row);
}

plt::plot_surface(x, y, z);
plt::show();

显示如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档