2012-02-12 122 views

回答

8

從我所看到的OpenCV不提供函數作爲其API的一部分繪製和繪製圖形,以cvDrawPlot(cvMat * data,other args ...)的形式。

大多數繪圖樣本僅使用OpenCV函數調用,涉及繪製一個繪圖,就好像其他圖像使用cvCreateImage

然後,他們通過數據迭代並用的OpenCV primites像cvRectanglecvLinecvCirclecvPoint填充圖像。

然後他們撥打cvShowImage顯示創建的繪圖圖像。

如果你找到的圖書館做了你想要的,那麼你可以使用它。

您也可以將數據寫入文件並調用外部繪圖工具,如gnuplot或調用使用其他可視化或繪圖(如VTK或plplot)的圖形來繪製圖形的函數。

除了您找到的另外一個庫是cvplot

10

你可以試試這個: https://code.google.com/p/cvplot/

Matlab的風情節功能OpenCV的基礎上highgui。順便說一下,它僅適用於C++。

它是開源的。

+0

我不知道如何使用cvplot。但是謝謝。我在Shervin上試過的程序也完美無缺。只是我可以查看x和y軸的值。 – Mzk 2012-03-11 02:57:04

4

一個相當粗糙,但做它自己的方式,將意味着對心血管繪製線圖::墊圖像:

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查看圖表

+0

請記住,API已經改變(我使用的是OpenCV 3.0),'cv :: line'變成'cvLine'。方法簽名也改變了。 – 2015-11-10 11:08:03

+1

我在新文檔中檢查了這一點。你確定嗎? http://docs.opencv.org/3.0-beta/modules/imgproc/doc/drawing_functions.html#line – 2015-11-10 13:14:33

+1

我看到......這聽起來很奇怪,因爲在我的C++程序中它說''line':identifier not發現' – 2015-11-10 13:26:48