2013-06-11 26 views

回答

0

我发现cvplot有用,尽管非常有限:http://code.google.com/p/cvplot/

此外,它是相当容易嵌入蟒和饲料matplotlib它从C命令++。我用它来制作漂亮的图表,这绝对不会从cvplot获得。 这里是一个快速和脏类,随后的例子,但是没有DOCO(当然有DOCO的用于matplotlib堆):

// Interface to Python's Matplotlib 
#include <Python.h>  
using namespace std; 

class PyPlot 
{ 
private: 
    // Singleton Constructor 
    PyPlot() : locked(false) 
    { 
     Py_SetProgramName("argv[0]"); /* optional but recommended */ 
     Py_Initialize(); 

     PyRun_SimpleString(
      "import numpy as np\n" 
      "import matplotlib.pyplot as plt\n" 
      "import matplotlib.text as text\n" 
      "import matplotlib as mpl\n" 
      ); 
    } 

    ~PyPlot() 
    { 
     Py_Finalize(); 
    } 


    // prevent copies of singleton 
    PyPlot(PyPlot const&); // No implemention 
    void operator=(PyPlot const&); // No implemention 


    string to_string(double dval) 
    { 
     return std::to_string(long double(dval)); 
    } 

    string to_string(int ival) 
    {  
     return std::to_string(long long(ival)); 
    } 


public: 
    // get singleton instance 
    static PyPlot& getInstance() 
    { 
     static PyPlot instance; // Guaranteed to be destroyed. 
     // Instantiated on first use. 
     return instance; 
    } 

    // prevent reentry to Matplotlib's show() 
    bool locked; 


    inline void print_time() 
    { 
     PyRun_SimpleString("from time import time,ctime\n" 
        "print 'Today is',ctime(time())\n"); 
    } 

    inline void exec(string command) 
    { 
     PyRun_SimpleString(command.c_str()); 
    } 

    inline void show() 
    { 
     locked = true; 
     exec("plt.show()\n"); 
     locked = false; 
    } 

    inline void title(string s, string args = "") 
    { 
     string command = "plt.title(r'" + s + "'"; 
     if(args.length() != 0) 
      command += ", " + args; 
     command += ")\n"; 
     exec(command); 
    } 

    inline void xlabel(string s, string args = "") 
    { 
     string command = "plt.xlabel(r'" + s + "'"; 
     if(args.length() != 0) 
      command += ", " + args; 
     command += ")\n"; 
     exec(command); 
    } 

    inline void ylabel(string s, string args = "") 
    { 
     string command = "plt.ylabel(r'" + s + "'"; 
     if(args.length() != 0) 
      command += ", " + args; 
     command += ")\n"; 
     exec(command); 
    } 

    inline void legend(string args = "") 
    { 
     string command = "plt.legend("; 
     if(args.length() != 0) 
      command += args; 
     command += ")\n"; 
     exec(command); 
    } 

    template <typename T> 
    inline void define_vector(string name, vector<T> values) 
    { 
      string command = name + " = ["; 

      vector<T>::iterator it; 
      for(it = values.begin(); it != values.end(); it++) 
      { 
       command += to_string(*it); 

       if(it + 1 != values.end()) 
        command += ", "; 
      } 
      command += "]\n"; 
      exec(command); 
    } 

    template <typename T> 
    inline void plot(vector<T> x, vector<T> y, string args = "") 
    { 
     define_vector("x", x); 
     define_vector("y", y); 

     string command = "plt.plot(x, y"; 
     if(args.length() != 0) 
      command += ", " + args; 
     command += ")\n"; 
     exec(command); 
    } 

    template <typename T> 
    inline void plot(vector<T> y, string args = "") 
    { 
     define_vector("y", y); 
     vector<int> x; 
     for(unsigned int i = 0; i < y.size(); i ++) 
      x.push_back(i); 

     define_vector("x", x); 

     string command = "plt.plot(x, y"; 
     if(args.length() != 0) 
      command += ", " + args; 
     command += ")\n"; 
     exec(command); 
    } 

    inline void example() 
    { 
     double xa[] = {0.5, 0.7, 0.9 , 1.3 , 1.7 , 1.8}; 
     vector<double> x; 
     x.assign(xa, xa + 6); 

     double ya[] = {0.1 , 0.2 , 0.75 , 1.5 , 2.1 , 2.4}; 
     vector<double> y; 
     y.assign(ya, ya + 6); 

     plot(x, y); 
     plot(x, y, "'go', markersize=20"); 

     exec(
      "plt.xticks(np.arange(0,3))\n" 
      "plt.yticks(np.arange(0,2.5,0.2))\n" 
      ); 
     xlabel("x axis"); 
     ylabel("y axis"); 
     title("My Plot Example"); 
     show(); 
    } 
}; 

#endif 

然后使用这样的:

PyPlot &plt = PyPlot::getInstance(); 

std::vector<int> values; 

plt.exec("mpl.rcParams['font.family']='Times New Roman'\n" 
     "mpl.rcParams['lines.linewidth'] = 2\n" 
      "mpl.rcParams['axes.linewidth'] = 3\n" 
      "mpl.rc('xtick', labelsize=12)\n" 
      "mpl.rc('ytick', labelsize=12)\n" 
      "ax = plt.gca()\n" 
      "ax.set_ylim(0, 100)\n" 
      ); 

plt.plot(values, "'go-', label='values'"); 
plt.ylabel("Value", "fontsize=14"); 
plt.xlabel("Index", "fontsize=14"); 
plt.show(); 

这有matplotlib命令需要创建一个直方图: http://matplotlib.org/examples/api/histogram_demo.html

当然,你需要Python安装。所有与Python 2.7.3/Win 7/VS2010/OpenCV 2.4.4工作正常