Tôi thấy cvplot hữu ích, mặc dù rất hạn chế:http://code.google.com/p/cvplot/
Ngoài ra, việc nhúng python và nhập các lệnh của nó vào matplotlib từ C++ khá dễ dàng. Tôi đã sử dụng nó để tạo ra đồ họa đẹp mắt mà bạn không bao giờ có được từ cvplot. Đây là một lớp nhanh và bẩn, theo sau là một ví dụ, nhưng không có tài liệu (tất nhiên có rất nhiều tài liệu matplotlib):
// Giao diện với Matplotlib của Python
#include
using namespace std;
lớp PyPlot
{
private:
// Hàm tạo Singleton
PyPlot() : bị khóa (sai)
{
Py_SetProgramName("argv[0]"); /* tùy chọn nhưng được khuyến nghị */
Py_Initialize();
PyRun_SimpleString(
"nhập numpy dưới dạng np\n"
"nhập matplotlib.pyplot dưới dạng plt\n"
"nhập matplotlib.text dưới dạng văn bản\n"
"nhập matplotlib dưới dạng mpl\n"
);
}
~PyPlot()
{
Py_Finalize();
}
// ngăn chặn các bản sao của singleton
PyPlot(PyPlot const&); // Không triển khai
void operator=(PyPlot const&); // Không thực hiện
chuỗi to_string(dval kép)
{
return std::to_string(dài gấp đôi(dval));
}
chuỗi to_string(int ival)
{
return std::to_string(long long(ival));
}
public:
// lấy cá thể đơn lẻ
PyPlot tĩnh & getInstance()
{
phiên bản PyPlot tĩnh; // Đảm bảo sẽ bị hủy.
// Khởi tạo ngay lần sử dụng đầu tiên.
return instance;
}
// ngăn việc quay lại show() của Matplotlib
bool bị khóa;
nội tuyến void print_time()
{
PyRun_SimpleString("từ thời điểm nhập thời gian,ctime\n"
"print 'Hôm nay là',ctime(time())\n");
}
inline void exec(lệnh chuỗi)
{
PyRun_SimpleString(command.c_str());
}
hiển thị khoảng trống nội tuyến ()
{
bị khóa = đúng;
exec("plt.show()\n");
bị khóa = sai;
}
tiêu đề void nội tuyến(chuỗi s, chuỗi args = "")
{
lệnh chuỗi = "plt.title(r'" + s + "'";
if(args.length() != 0)
lệnh += "," + args;
lệnh += ")\n";
thực thi (lệnh);
}
inline void xlabel(string s, string args = "")
{
lệnh chuỗi = "plt.xlabel(r'" + s + "'";
if(args.length() != 0)
lệnh += "," + args;
lệnh += ")\n";
thực thi (lệnh);
}
inline void ylabel(chuỗi s, chuỗi args = "")
{
lệnh chuỗi = "plt.ylabel(r'" + s + "'";
if(args.length() != 0)
lệnh += "," + args;
lệnh += ")\n";
thực thi (lệnh);
}
chú thích void nội tuyến (chuỗi args = "")
{
lệnh chuỗi = "plt.legend(";
if(args.length() != 0)
lệnh += đối số;
lệnh += ")\n";
thực thi (lệnh);
}
mẫu
inline void defin_vector(tên chuỗi, giá trị vector)
{
lệnh chuỗi = tên + " = [";
vector::iterator nó;
for(it = value.begin(); it != value.end(); it++)
{
lệnh += to_string(*it);
if(it + 1 != value.end())
lệnh += ", ";
}
lệnh += "]\n";
thực thi (lệnh);
}
mẫu
sơ đồ void nội tuyến(vector x, vector y, string args = "")
{
định nghĩa_vector("x", x);
định nghĩa_vector("y", y);
lệnh chuỗi = "plt.plot(x, y";
if(args.length() != 0)
lệnh += "," + args;
lệnh += ")\n";
thực thi (lệnh);
}
mẫu
biểu đồ void nội tuyến(vector y, string args = "")
{
định nghĩa_vector("y", y);
vectơ x;
for(unsigned int i = 0; i < y.size(); i ++)
x.push_back(i);
định nghĩa_vector("x", x);
lệnh chuỗi = "plt.plot(x, y";
if(args.length() != 0)
lệnh += "," + args;
lệnh += ")\n";
thực thi (lệnh);
}
ví dụ về khoảng trống nội tuyến()
{
double xa[] = {0,5, 0,7, 0,9, 1,3, 1,7, 1,8};
vectơ x;
x.sign(xa, xa + 6);
nhân đôi ya[] = {0,1, 0,2, 0,75, 1,5, 2,1, 2,4};
vector y;
y.sign(ya, ya + 6);
lô(x, y);
cốt truyện(x, y, "'go', markersize=20");
thực thi(
"plt.xticks( np.arange(0,3) )\n"
"plt.yticks( np.arange(0,2.5,0.2) )\n"
);
xlabel("trục x");
ylabel("trục y");
title("Ví dụ về cốt truyện của tôi");
trình diễn();
}
};
#endif
Sau đó sử dụng nó như thế này:
PyPlot &plt = PyPlot::getInstance();
giá trị std::vector;
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("Giá trị", "fontsize=14");
plt.xlabel("Chỉ mục", "fontsize=14");
plt.show();
Cái này có các lệnh matplotlib cần thiết để tạo biểu đồ: http://matplotlib.org/examples/api/histogram_demo.html
Tất nhiên bạn cần cài đặt Python. Mọi thứ đều hoạt động tốt trong Python 2.7.3/Win 7/VS2010/OpenCV 2.4.4
Tôi là một lập trình viên xuất sắc, rất giỏi!