2012-02-12 20 views
11

में ग्राफ ड्राइंग और प्लॉटिंग ग्राफ क्या ओपनसीवी ग्राफ को आकर्षित करने और साजिश करने के तरीके पर एक फ़ंक्शन प्रदान करता है?ओपनसीवी

मुझे शेरविन इमामी http://www.shervinemami.info/graphs.html द्वारा यह लिंक मिला जो स्वयं द्वारा बनाया गया था।

+0

कृपया लिंक से बचें .. –

उत्तर

8

जो मैं देख सकता हूं उससे ओपनसीवी सीवीड्राप्लॉट (सीवीएमएटी * डेटा, अन्य तर्क ...) के रूप में ग्राफ को आकर्षित करने और साजिश करने के लिए अपने एपीआई के हिस्से के रूप में एक फ़ंक्शन प्रदान नहीं करता है।

अधिकतर साजिश नमूने केवल ओपनसीवी फ़ंक्शन कॉल का उपयोग करके देखे गए हैं, जिसमें साजिश बनाने के लिए cvCreateImage के साथ कोई अन्य छवि थी।

तब वे डेटा के माध्यम से पुनरावृति और cvRectangle, cvLine, cvCircle और cvPoint तरह OpenCV primites के साथ छवि भरें।

फिर वे बनाई गई साजिश छवि को प्रदर्शित करने के लिए cvShowImage पर कॉल करें।

यदि आपको मिली लाइब्रेरी जो आप चाहते हैं तो आप इसका उपयोग कर सकते हैं।

आप फ़ाइल को डेटा भी लिख सकते हैं और बाहरी प्लॉटिंग टूल जैसे कि gnuplot या कॉल फ़ंक्शंस को कॉल कर सकते हैं जो अन्य विज़ुअलाइज़ेशन या वीटीके या प्लप्लॉट जैसी लाइब्रेरीज़ की साजिश का उपयोग करके आलेख खींचते हैं और प्लॉट करते हैं।

आपके द्वारा पाई गई एक अन्य लाइब्रेरी cvplot है। highgui के आधार पर OpenCV के लिए https://code.google.com/p/cvplot/

मैटलैब शैली साजिश काम करता है,:

10

आप इस कोशिश कर सकते हैं। वैसे, यह केवल सी ++ के लिए है।

यह खुला स्रोत है।

+0

मुझे यकीन नहीं है कि cvplot का उपयोग कैसे करें। लेकिन धन्यवाद। शेरविन पर मैंने जिस कार्यक्रम की कोशिश की वह पूरी तरह से काम करता है। यह सिर्फ मैं एक्स और वाई अक्ष मूल्यों को देख सकता हूं। – 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

ध्यान रखें कि एपीआई बदल गई है (मैं ओपनसीवी 3.0 का उपयोग कर रहा हूं) और 'सीवी :: लाइन' 'cvLine' बन गया। विधि हस्ताक्षर भी बदल गया। –

+1

मैं इसे नए दस्तावेज़ में जांचता हूं। क्या तुम इसके बारे में निश्चित हो? http://docs.opencv.org/3.0-beta/modules/imgproc/doc/drawing_functions.html#line –

+1

मुझे लगता है ... यह वास्तव में अजीब लगता है, क्योंकि मेरे सी ++ प्रोग्राम में यह 'लाइन' कहता है: पहचानकर्ता नहीं मिला –

2

देखने पर https://github.com/leonardvandriel/cvplot पर एक नजर डालें। आप छोटे कॉन्फ़िगरेशन वाले ग्राफ़ प्लॉट कर सकते हैं और यह एक ही विंडो में एकाधिक ग्राफ का समर्थन करता है। (नोट: ब्लैटेंट स्व-पदोन्नति)।