2012-02-12 4 views

답변

8

내가 볼 수있는 것에서 OpenCV는 cvDrawPlot (cvMat * data, other args ...)의 형태로 그래프를 그리거나 플롯하기위한 API의 일부로 함수를 제공하지 않습니다.

대부분의 플로팅 샘플은 OpenCV 함수 호출을 사용하여 보았을 때 플롯을 cvCreateImage 인 다른 이미지처럼 보이게 만듭니다.

그런 다음 데이터를 반복하고 cvRectangle, cvLine, cvCirclecvPoint과 같은 OpenCV 프리미티브로 이미지를 채 웁니다.

그런 다음 cvShowImage을 호출하여 생성 된 플롯 이미지를 표시합니다.

찾은 라이브러리가 원하는대로 작동하는 경우 사용할 수 있습니다.

또한 데이터를 파일에 쓰고 gnuplot과 같은 외부 플로팅 도구를 호출하거나 VTK 또는 plplot과 같은 다른 시각화 또는 플로팅 라이브러리를 사용하여 그래프를 그리고 그리는 함수를 호출 할 수 있습니다.

찾은 라이브러리 이외의 다른 라이브러리는 cvplot입니다.

10

이 시도 할 수 있습니다 : https://code.google.com/p/cvplot/

matlab에 스타일의 플롯 기능을 OpenCV를 들어, highgui에 따라. 그건 그렇고, 그것은 C++만을위한 것입니다.

오픈 소스입니다.

+0

나는 cvplot을 어떻게 사용하는지 모르겠습니다. 하지만 고마워. Shervin에서 시도한 프로그램도 완벽하게 작동합니다. x 축과 y 축 값을 볼 수 있습니다. – Mzk

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

한 후 사용할 수 있습니다 imshow 또는 Image Watch 그래프를 보려면

+0

API가 변경되었고 (OpenCV 3.0 사용)'cv :: line'이'cvLine'이되었습니다. 메소드 서명도 변경되었습니다. –

+1

새 문서에서이 내용을 확인합니다. 이거 확실하니? http://docs.opencv.org/3.0-beta/modules/imgproc/doc/drawing_functions.html#line –

+1

내가보기 ... 이것은 정말로 이상하게 들린다. 나의 C++ 프로그램에서''line ': 식별자가 아니다. found' –

2

https://github.com/leonardvandriel/cvplot을 살펴보십시오. 거의 구성하지 않고 그래프를 플로팅 할 수 있으며 단일 창에서 여러 그래프를 지원합니다. (참고 : 노골적인 자기 홍보).