如何最简单地绘制一个std::vector<double>?

4
我正在寻找类似以下内容的东西:
 std::vector<double> X = some_math_function( );
 somenamespace :: plot(  Wrapper( X ) ); // pop-up and display a graph of X on y-axis, 1 to X.size() on x-axis. 

显然,有一些更重的方法,比如设置gnu-plot或其他东西,我已经使用了VTK图表中的内容。我只想让一个愚蠢、贫民窟的绘图出现。这是为了粗略地调试检查诸如“向量是否在改变?当我移动相机时它是否会突然抖动?”等问题。


我不确定这与OpenCV有什么关系。 - karlphillip
1
这并不是特定于opencv的问题,但是1)数据流来自于opencv函数,2)opencv可以轻松地显示图像,因此一个巧妙的解决方案是将向量写入空图像中,从而创建一个非常简陋的绘图函数。 - peter karasev
5个回答

6
如果这只是用于调试,为什么不将向量输出到一个分隔文件中,并在 Excel 或 Gnuplot 中进行绘制,作为单独的步骤呢?因此可以像这样做:
//untested
ofstream myfilestream("myfile");
std::copy(X.begin(), X.end(), std::ostream_iterator<double>(myfilestream, '\n');

那么只需在您喜欢的任何工具中绘制文件,例如:
gnuplot
plot "myfile" with lines

这在处理X中的快速数据流时行不通。我打算使用OpenCV的imshow()函数自己编写一个绘图器,因为它已经链接进来了... - peter karasev
我们需要处理多少数据?如果数据流速度很快,写入操作只需要缓冲足够的数据来应对。显然,在某些速度和数量上,这种方法会失效,但你真的处于那种情况吗? - jk.
但是如果这样,gnuplot会“监视”临时文件吗?还是你的意思是我应该调用一个shell并执行$watch -n 0.2 "gnuplot -onelinearg? "myfile" with lines"? - peter karasev
不,我的意思是一次性转储所有数据,然后在测试之后作为附加步骤绘制它。如果您需要将图形与实际操作时间相关联,请输出时间。即将其视为记录练习。 - jk.

3

这个主题似乎有很多关于此事的建议。我还没有看到任何一个简单的库符合你所需的目的。

以下是一些轻量级的示例,但我认为如果你必须学习足够的知识来支持任何库,那么你可能也可以使用像gnuplot这样备受尊重的库。在许多情况下,通过使用更复杂的库而花费时间比较多,但你可以通过社区的支持和(相对)无错的成熟产品来弥补它们。

koolplot

GOBLIN


2
您可以使用MathGL(跨平台GPL绘图库)。代码如下:
mglGraphZB gr;// create canvas
mglData d; d.Set(X);  // convert to internal format
gr.YRange(d); // set range for y-axis
gr.Plot(d);   // plot it
gr.Axis();    // draw axis if you need
gr.WritePNG("1.png"); // save it

1

使用C++11: 我建议使用matplotlibcpp,它使用Python进行绘图。这个库非常容易使用,你只需要将头文件复制到你的代码仓库中。

代码看起来像这样:

#include "matplotlibcpp.h"
#include <vector>
#include <algorithm> // for std::iota

int main()
{
  std::vector <double> y = {0.1, 0.2, 0.4, 0.8, 1.6};
  std::vector <int> x(y.size());
  std::iota(x.begin(), x.end(), 0);

  matplotlibcpp::plot(x, y);
  matplotlibcpp::show();
  plt::save("plot.png");
}

在你的 cmake 中:
find_package(PythonLibs 2.7)
target_include_directories(myproject PRIVATE ${PYTHON_INCLUDE_DIRS})
target_link_libraries(myproject ${PYTHON_LIBRARIES})

将其直接传递给编译器:
g++ main.cpp -std=c++11 -I/usr/include/python2.7 -lpython2.7

-1

我记得很久以前用PHP的gd轻松绘制曲线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接