【问题标题】:what is an easy / easiest way to *plot* a std::vector<double>?什么是*绘制* std::vector<double> 的简单/最简单的方法?
【发布时间】:2011-06-21 16:40:38
【问题描述】:

我正在寻找类似的东西:

 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 有什么关系。
  • 它不是特定于 opencv 的,而是 1)数据流来自 opencv 函数,2)opencv 允许轻松显示 图像,所以一个 hacky 的解决方案是编写向量变成一个空的图像,制作一个非常贫民窟的绘图功能。

标签: c++ opencv plot computer-vision


【解决方案1】:

如果这是为了调试,为什么不将向量输出到分隔文件并在 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() 滚动我自己的绘图仪,因为它已经链接...
  • 我们在谈论多少数据?如果数据流很快,则只需要对写入进行足够的缓冲即可解决此问题。显然,以某种速度和数量,这会发生故障,但你真的处于那种情况吗?
  • 但在这种情况下 gnuplot 会“监视”临时文件吗?或者你的意思是我应该调用一个 shell 并执行 $watch -n 0.2 "gnuplot -onelinearg? \"myfile\" with lines"
  • 不,我的意思是在一个步骤中转储所有数据,然后在测试后将其绘制为附加步骤,如果您需要将绘图与您的物理操作输出时间相关联。即把它当作一个记录练习
【解决方案2】:

This thread 似乎对此事有不少建议。对于您想要的目的,我还没有看到任何作为一个简单库而脱颖而出的东西。

这里有一些轻量级的例子,但在我看来,如果你必须学会​​足够的知识来支持任何库,那么你不妨支持像 gnuplot 这样受人尊敬的库。在许多情况下,您因不得不处理更复杂的库而损失的时间远远超过了社区支持和(相对)无错误......更成熟产品的...。

koolplot

GOBLIN

【讨论】:

    【解决方案3】:

    您可以使用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
    

    【讨论】:

      【解决方案4】:

      使用 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
      

      【讨论】:

        【解决方案5】:

        我记得很容易在 php 中使用gd 绘制曲线,但那是很久以前的事了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-20
          • 2011-01-15
          • 1970-01-01
          • 2019-04-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多