在OpenCV中绘制和绘制图形

时间:2012-02-12 15:43:13

标签: opencv

OpenCV是否提供了如何绘制和绘制图形的功能?

我发现Shervin Emami http://www.shervinemami.info/graphs.html的链接是由他自己创建的。

5 个答案:

答案 0 :(得分:11)

你可以试试这个: https://code.google.com/p/cvplot/

基于highgui的OpenCV的Matlab样式绘图函数。 顺便说一下,它只适用于C ++。

它是开源的。

答案 1 :(得分:8)

从我所看到的,OpenCV没有提供一个函数作为其绘制和绘制图形的API的一部分,以cvDrawPlot(cvMat * data,其他args ...)的形式。

大多数绘图样本仅使用OpenCV函数调用看到,这些调用涉及使用cvCreateImage创建任何其他图像。

然后,他们遍历数据,并使用OpenCV图像填充图像,例如cvRectanglecvLinecvCirclecvPoint

然后他们调用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);

然后可以使用imshowImage 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);

CvPlot

您可能还想尝试Leonardvandriel's cvplot。它的工作原理类似,但是不能使用自定义绘图对象进行扩展。