OpenCV是否提供了如何绘制和绘制图形的功能?
我发现Shervin Emami http://www.shervinemami.info/graphs.html的链接是由他自己创建的。
答案 0 :(得分:11)
答案 1 :(得分:8)
从我所看到的,OpenCV没有提供一个函数作为其绘制和绘制图形的API的一部分,以cvDrawPlot(cvMat * data,其他args ...)的形式。
大多数绘图样本仅使用OpenCV函数调用看到,这些调用涉及使用cvCreateImage
创建任何其他图像。
然后,他们遍历数据,并使用OpenCV图像填充图像,例如cvRectangle
,cvLine
,cvCircle
和cvPoint
。
然后他们调用cvShowImage
来显示创建的情节图像。
如果您找到的库符合您的要求,那么您可以使用它。
您还可以将数据写入文件并调用外部绘图工具(如gnuplot)或调用函数,使用其他可视化或绘图库(如VTK或plplot)绘制和绘制图形。
您找到的另一个图书馆是cvplot。
答案 2 :(得分:4)
一个相当粗略但是自己动手的方法,需要在cv :: Mat图像上绘制线图:
template <typename T>
cv::Mat plotGraph(std::vector<T>& vals, int YRange[2])
{
auto it = minmax_element(vals.begin(), vals.end());
float scale = 1./ceil(*it.second - *it.first);
float bias = *it.first;
int rows = YRange[1] - YRange[0] + 1;
cv::Mat image = Mat::zeros( rows, vals.size(), CV_8UC3 );
image.setTo(0);
for (int i = 0; i < (int)vals.size()-1; i++)
{
cv::line(image, cv::Point(i, rows - 1 - (vals[i] - bias)*scale*YRange[1]), cv::Point(i+1, rows - 1 - (vals[i+1] - bias)*scale*YRange[1]), Scalar(255, 0, 0), 1);
}
return image;
}
用法示例:
vector<int> numbers(100);
std::iota (numbers.begin(), numbers.end(), 0);
int range[2] = {0, 100};
cv::Mat lineGraph = plotGraph(numbers, range);
然后可以使用imshow
或Image Watch查看图表
答案 3 :(得分:2)
看看https://github.com/leonardvandriel/cvplot。您可以绘制配置较少的图形,并在单个窗口中支持多个图形。 (注:公然自我推销)。
答案 4 :(得分:1)
不。它不是。有一个plot contrib module,但这是非常基本的。
您可以尝试Profactor CvPlot https://github.com/Profactor/cv-plot。 (我是开发商)。完全基于opencv的集成非常容易,并且可以使用自定义控件进行扩展。这是您可以绘制到cv :: Mat或使用交互式查看器显示图的方法:
#include <CvPlot/cvplot.h>
std::vector<double> x(20*1000), y1(x.size()), y2(x.size()), y3(x.size());
for (size_t i = 0; i < x.size(); i++) {
x[i] = i * CV_2PI / x.size();
y1[i] = std::sin(x[i]);
y2[i] = y1[i] * std::sin(x[i]*50);
y3[i] = y2[i] * std::sin(x[i]*500);
}
auto axes = CvPlot::makePlotAxes();
axes.create<CvPlot::Series>(x, y3, "-g");
axes.create<CvPlot::Series>(x, y2, "-b");
axes.create<CvPlot::Series>(x, y1, "-r");
//plot to a cv::Mat
cv::Mat mat = axes.render(300, 400);
//or show with interactive viewer
CvPlot::show("mywindow", axes);
您可能还想尝试Leonardvandriel's cvplot。它的工作原理类似,但是不能使用自定义绘图对象进行扩展。