2012-02-12 20 views

Respuesta

8

Según lo que puedo ver, OpenCV no proporciona una función como parte de su API para dibujar y trazar gráficos, en forma de cvDrawPlot (datos cvMat *, otros argumentos ...).

La mayoría de las muestras de trazado se han visto utilizando solo las llamadas a la función OpenCV que implican hacer un trazado como si fuera cualquier otra imagen con cvCreateImage.

Luego iterar a través de los datos y llenar la imagen con primites OpenCV como cvRectangle, cvLine, cvCircle y cvPoint.

Luego llaman al cvShowImage para mostrar la imagen del trazado creado.

Si la biblioteca que encontró hace lo que quiere, entonces puede usarla.

También puede escribir los datos en un archivo y llamar a una herramienta de trazado externa como gnuplot o llamar a funciones que dibujan y trazan gráficos utilizando otra visualización o trazado de bibliotecas como VTK o plplot.

Otra biblioteca que no sea la que ha encontrado es cvplot.

10

puede probar esto: https://code.google.com/p/cvplot/

Matlab funciones de estilos de trazado para OpenCV, basado en highgui. Por cierto, es solo para C++.

Es de código abierto.

+0

No estoy seguro de cómo usar el cvplot. pero gracias. El programa que probé en Shervin funciona perfectamente también. Es solo que puedo ver los valores del eje xey. – Mzk

4

un do-it-yourself enfoque bastante crudo, pero, sería implicar el trazado de la línea gráfico en cv :: imagen Estera: ejemplo

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; 
} 

Uso:

vector<int> numbers(100); 
std::iota (numbers.begin(), numbers.end(), 0); 

int range[2] = {0, 100}; 
cv::Mat lineGraph = plotGraph(numbers, range); 

Entonces se puede utilizar imshow o Image Watch para ver el gráfico

+0

Tenga en cuenta que API ha cambiado (estoy usando OpenCV 3.0) y 'cv :: line' se convirtió en' cvLine'. La firma del método también cambió. –

+1

Lo comprobo en la nueva documentación. ¿Estas seguro acerca de esto? http://docs.opencv.org/3.0-beta/modules/imgproc/doc/drawing_functions.html#line –

+1

Ya veo ... Esto realmente suena extraño, porque en mi programa C++ dice ''línea ': el identificador no found' –