به نام خدا : ماژول Plot فقط یه یک کلاس ( با نام Plot2d ) داره که برای رسم نمودار بکار میره، کلاس ساده ای هستش ولی خب کاچی به از هیچی! اگه از کنترل هایی که در ماژول High-level GUI ارائه شده استفاده میکنید، این نمودار گزینه خوبی برای شما هستش؛ اگه هم از GUI های دیگه ای ( نظیر QT یا Win32 UI یا GTK یا OpenGL و… ) میخواید استفاده کنید، که دیگه این کلاس بکارتون نمیاد! ( QT، کنترل/ویجت رسم نمودار داره، اما درمورد بقیه موارد، مطمئن نیستم )؛ این ماژول زیر مجموعه ای از بسته opencv_contrib ( ماژول های اضافی OpenCV؛ ماژول هایی که هنوز به بسته اصلی OpenCV راه پیدا نکردن ) هستش.
توجه : این ماژول، در مسیر زیر قرار داره :
[opencv_contrib]/modules/plot
1) تابع create : به کمک این تابع میتونید یه شیء از کلاس Plot2d ایجاد کنید.
1 2 |
CV_WRAP static Ptr<Plot2d> create(InputArray data); CV_WRAP static Ptr<Plot2d> create(InputArray dataX, InputArray dataY); |
توضیح پارامترها :
- data : پارامتر ورودی، حاوی داده های محور Y؛ اندازه این پارامتر باید \( 1 \times N \) یا \( N \times 1 \) باشد؛ که حاوی داده های محور Y باشد، و شماره index داده های محور Y، به عنوان داده های محور X استفاده میشه!
- dataX : پارامتر ورودی، حاوی داده های محور X؛ اندازه این پارامتر باید \( 1 \times N \) یا \( N \times 1 \) باشه.
- dataY : پارامتر ورودی، حاوی داده های محور Y؛ اندازه این پارامتر باید \( 1 \times N \) یا \( N \times 1 \) باشه.
توجه : نوع داده باید double یا CV_64F باشه.
2) تابع render : نمودار رو ایجاد میکنه و در تصویری که بهش میدیم ( به پارامتر _plotResult میدیم )، نمودار رو قرار میده، بعد میتونیم تصویر فوق رو نمایش بدیم ( به کمک تابع cv::imshow ).
1 |
CV_WRAP virtual void render(OutputArray _plotResult) = 0; |
3) تابع setNeedPlotLine : آیا PlotLine نمایش داده بشه یا نه؛ به صورت پیشفرض نمایش داده میشه؛ اگه غیر فعالش کنید، فقط نقاط داده رو نمایش میده و نقاط رو به هم وصل نمیکنه.
1 |
CV_WRAP virtual void setNeedPlotLine(bool _needPlotLine) = 0; |
4) تابع setPlotLineColor : تنظیم رنگ PlotLine؛ به صورت پیشفرض زرد هستش.
1 |
CV_WRAP virtual void setPlotLineColor(Scalar _plotLineColor) = 0; |
5) تابع setPlotBackgroundColor : تنظیم رنگ Background؛ به صورت پیشفرض سیاه هستش.
1 |
CV_WRAP virtual void setPlotBackgroundColor(Scalar _plotBackgroundColor) = 0; |
6) تابع setPlotAxisColor : تنظیم رنگ محورهای X و Y؛ به صورت پیشفرض سیاه هستش.
1 |
CV_WRAP virtual void setPlotAxisColor(Scalar _plotAxisColor) = 0; |
7) setShowGrid : آیا خطوط شطرنجی داخل نمودار نمایش داده بشن یا نه؛ به صورت پیشفرض، نمایش داده میشن.
1 |
CV_WRAP virtual void setShowGrid(bool needShowGrid) = 0; |
8) تابع setGridLinesNumber : تعداد تقسیمات خطوط شطرنجی، مقدار 1 یعنی عدم نمایش خطوط شطرنجی، مقدار N یعنی، صفحه در محور Y و X، به N قسمت تقسیم میشه ( N تا خط در راستای محور X و N تا خط در راستای محور Y !!! )؛ مقدار پیشفرض 10 هستش.
1 |
CV_WRAP virtual void setGridLinesNumber(int gridLinesNumber) = 0; |
9) تابع setPlotGridColor : تنظیم رنگ خطوط شتطرنجی ( Grid )؛ به صورت پیشفرض سفید هستش.
10) تابع setShowText : آیا Text ها نمایش داده بشن یا نه؛ به صورت پیشفرض، نمایش داده میشن.
1 |
CV_WRAP virtual void setShowText(bool needShowText) = 0; |
11) تابع setPlotTextColor : تنظیم رنگ Text ها؛ به صورت پیشفرض سفید هستش.
1 |
CV_WRAP virtual void setPlotTextColor(Scalar _plotTextColor) = 0; |
12) تابع setPlotSize : تنظیم طول و عرض نمودار.
1 |
CV_WRAP virtual void setPlotSize(int _plotSizeWidth, int _plotSizeHeight) = 0; |
13) تابع setPlotLineWidth : تنظیم اندازه خطوط شطرنجی، محورها و نمودار؛ به صورت پیشفرض اندازه اش 1 هستش.
1 |
CV_WRAP virtual void setPlotLineWidth(int _plotLineWidth) = 0; |
14) تابع setInvertOrientation : قرینه کردن نمودار نسبت به محور X؛ به صورت پیشفرض غیرفعال هستش؛ هرچی بررسی کردم باید این تابع رو فعال کنید، تا نمودار رو درست نمایش بده، یه نمودار COS رو تست کردم، حالا نمیدونم شاید اشتباه از من بوده یا نکته ای هستش که من متوجه نشدم.
1 |
CV_WRAP virtual void setInvertOrientation(bool _invertOrientation) = 0; |
15 تا 18) توابع setMinX و setMaxX و setMinY و setMaxY : تنظیم مقادیر min و max محورهای X و Y.
1 2 3 4 |
CV_WRAP virtual void setMinX(double _plotMinX) = 0; CV_WRAP virtual void setMinY(double _plotMinY) = 0; CV_WRAP virtual void setMaxX(double _plotMaxX) = 0; CV_WRAP virtual void setMaxY(double _plotMaxY) = 0; |
19) تابع setPointIdxToPrint : میتونید index داده ای که میخواید مقادیرش در قسمت text نمایش داده بشه، تعیین کنید!
1 |
CV_WRAP virtual void setPointIdxToPrint(int pointIdx) = 0; |
کد نمونه 1 : -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#include <opencv2/highgui.hpp> #include <opencv2/plot.hpp> #include <iostream> #include <math.h> int main() { // Initialize Data std::vector<double> sine; for( int i = 0; i < 360; i++ ) sine.push_back( std::sin( i * CV_PI / 180.0 ) ); cv::Mat data( sine ); // Create Plot Object cv::Ptr<cv::plot::Plot2d> plot = cv::plot::Plot2d::create(data); // Edit Plot plot->setNeedPlotLine(true); plot->setPlotLineColor( cv::Scalar( 0, 255, 0 ) ); // green //--- plot->setPlotBackgroundColor( cv::Scalar( 0, 0, 0 ) ); // black //--- plot->setPlotAxisColor( cv::Scalar( 0, 0, 255 ) ); // red //--- plot->setShowGrid(true); plot->setGridLinesNumber(10); plot->setPlotGridColor( cv::Scalar( 255, 255, 255 ) ); // white //--- plot->setShowText(true); plot->setPlotTextColor( cv::Scalar( 0, 255, 255 ) ); // yellow //--- plot->setPlotSize(600, 400); //--- plot->setPlotLineWidth(1); // PlotLine + PlotGrid + PlotAxis //--- plot->setInvertOrientation(true); // vertical flip? //--- plot->setMinX(-90); plot->setMaxX(+360); plot->setMinY(-2); plot->setMaxY(+2); //--- plot->setPointIdxToPrint(90); // Display the 90th data in the TEXT section // Render Plot Image cv::Mat image; plot->render( image ); // Show Image cv::imshow( "plot", image ); cv::waitKey(); return 0; } |
کد نمونه 2 : -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <opencv2/highgui.hpp> #include <opencv2/plot.hpp> #include <iostream> int main() { cv::Mat data_x( 1, 51, CV_64F ); cv::Mat data_y( 1, 51, CV_64F ); for ( int i = 0; i < data_x.cols; i++ ) { double x = ( i - data_x.cols / 2 ); data_x.at<double>( 0, i ) = x; data_y.at<double>( 0, i ) = x * x * x; } cv::Mat plot_result; cv::Ptr<cv::plot::Plot2d> plot = cv::plot::Plot2d::create( data_x, data_y ); plot->render(plot_result); imshow( "plot_result", plot_result ); cv::waitKey(); return 0; } |
منابع :
تا مطلب بعد اگه زنده بودیم و قسمت شد، یا علی.