2012-02-12 132 views

Trả lời

8

Từ những gì tôi có thể thấy OpenCV không cung cấp chức năng như một phần của API để vẽ và vẽ biểu đồ, dưới dạng cvDrawPlot (dữ liệu cvMat *, args khác ...).

Hầu hết các mẫu âm mưu chỉ nhìn thấy bằng cách sử dụng các cuộc gọi hàm OpenCV liên quan đến việc vẽ đồ thị như thể là bất kỳ hình ảnh nào khác với cvCreateImage.

Sau đó, chúng lặp lại thông qua dữ liệu và điền hình ảnh với các primite OpenCV như cvRectangle, cvLine, cvCirclecvPoint.

Sau đó, họ gọi cvShowImage để hiển thị hình ảnh lô đã tạo.

Nếu thư viện bạn tìm thấy làm những gì bạn muốn thì bạn có thể sử dụng nó.

Bạn cũng có thể ghi dữ liệu vào tệp và gọi công cụ vẽ bên ngoài như gnuplot hoặc chức năng gọi vẽ và vẽ biểu đồ bằng cách sử dụng các thư viện trực quan hóa hoặc vẽ sơ đồ khác như VTK hoặc plplot.

Một thư viện khác với thư viện bạn đã tìm thấy là cvplot.

10

bạn có thể thử này: https://code.google.com/p/cvplot/

Matlab chức năng cốt truyện phong cách cho OpenCV, dựa trên highgui. Nhân tiện, nó chỉ dành cho C++.

Đó là mã nguồn mở.

+0

Tôi không chắc chắn cách sử dụng cvplot. nhưng cảm ơn. Chương trình tôi đã thử trên Shervin cũng hoạt động hoàn hảo. Nó chỉ là tôi có thể xem các giá trị trục x và y. – Mzk

4

Một do-it-mình cách tiếp cận khá thô nhưng, sẽ kéo theo những âm mưu đồ thị dòng trên cv :: Mat ảnh:

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

Cách sử dụng Ví dụ:

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

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

Một sau đó có thể sử dụng imshow hoặc Image Watch để xem biểu đồ

+0

Hãy nhớ rằng API đã thay đổi (tôi đang sử dụng OpenCV 3.0) và 'cv :: line' trở thành' cvLine'. Chữ ký phương thức cũng thay đổi. –

+1

Tôi kiểm tra điều này trong tài liệu mới. Bạn có chắc về điều này? http://docs.opencv.org/3.0-beta/modules/imgproc/doc/drawing_functions.html#line –

+1

Tôi hiểu ... Điều này thực sự có vẻ lạ, bởi vì trong chương trình C++ của tôi nó nói '' dòng ': định danh không find' –

2

Hãy xem https://github.com/leonardvandriel/cvplot. Bạn có thể vẽ đồ thị với cấu hình nhỏ và nó hỗ trợ nhiều đồ thị trong một cửa sổ duy nhất. (Lưu ý: tự quảng cáo trắng trợn).

Các vấn đề liên quan