From b63697723f851460bafd6b0d493642f59bf9d63c Mon Sep 17 00:00:00 2001 From: Vladislav Sovrasov Date: Fri, 23 Sep 2016 15:46:34 +0300 Subject: [PATCH] Refactoring of plot module --- modules/plot/CMakeLists.txt | 2 +- modules/plot/include/opencv2/plot.hpp | 19 ++++++-- modules/plot/src/plot.cpp | 69 ++++++++++++++++----------- 3 files changed, 58 insertions(+), 32 deletions(-) diff --git a/modules/plot/CMakeLists.txt b/modules/plot/CMakeLists.txt index 8edf06b3f..1c879fe36 100644 --- a/modules/plot/CMakeLists.txt +++ b/modules/plot/CMakeLists.txt @@ -1,2 +1,2 @@ set(the_description "Plot function for Mat data.") -ocv_define_module(plot opencv_core opencv_highgui) +ocv_define_module(plot opencv_core opencv_highgui WRAP python) diff --git a/modules/plot/include/opencv2/plot.hpp b/modules/plot/include/opencv2/plot.hpp index 824398500..c9f44c658 100644 --- a/modules/plot/include/opencv2/plot.hpp +++ b/modules/plot/include/opencv2/plot.hpp @@ -68,17 +68,30 @@ namespace cv CV_WRAP virtual void setMaxX(double _plotMaxX) = 0; CV_WRAP virtual void setMaxY(double _plotMaxY) = 0; CV_WRAP virtual void setPlotLineWidth(int _plotLineWidth) = 0; + CV_WRAP virtual void setNeedPlotLine(bool _needPlotLine) = 0; CV_WRAP virtual void setPlotLineColor(Scalar _plotLineColor) = 0; CV_WRAP virtual void setPlotBackgroundColor(Scalar _plotBackgroundColor) = 0; CV_WRAP virtual void setPlotAxisColor(Scalar _plotAxisColor) = 0; CV_WRAP virtual void setPlotGridColor(Scalar _plotGridColor) = 0; CV_WRAP virtual void setPlotTextColor(Scalar _plotTextColor) = 0; CV_WRAP virtual void setPlotSize(int _plotSizeWidth, int _plotSizeHeight) = 0; - CV_WRAP virtual void render(Mat &_plotResult) = 0; + CV_WRAP virtual void render(OutputArray _plotResult) = 0; }; - CV_EXPORTS_W Ptr createPlot2d(Mat data); - CV_EXPORTS_W Ptr createPlot2d(Mat dataX, Mat dataY); + /** + * @brief Creates Plot2d object + * + * @param data \f$1xN\f$ or \f$Nx1\f$ matrix containing \f$Y\f$ values of points to plot. \f$X\f$ values + * will be equal to indexes of correspondind elements in data matrix. + */ + CV_EXPORTS_W Ptr createPlot2d(InputArray data); + /** + * @brief Creates Plot2d object + * + * @param dataX \f$1xN\f$ or \f$Nx1\f$ matrix \f$X\f$ values of points to plot. + * @param dataY \f$1xN\f$ or \f$Nx1\f$ matrix containing \f$Y\f$ values of points to plot. + */ + CV_EXPORTS_W Ptr createPlot2d(InputArray dataX, InputArray dataY); } } diff --git a/modules/plot/src/plot.cpp b/modules/plot/src/plot.cpp index 85bd9569c..60e854929 100644 --- a/modules/plot/src/plot.cpp +++ b/modules/plot/src/plot.cpp @@ -57,8 +57,9 @@ namespace cv { public: - Plot2dImpl(Mat _plotData) + Plot2dImpl(InputArray plotData) { + Mat _plotData = plotData.getMat(); //if the matrix is not Nx1 or 1xN if(_plotData.cols > 1 && _plotData.rows > 1) { @@ -91,8 +92,10 @@ namespace cv } - Plot2dImpl(Mat _plotDataX, Mat _plotDataY) + Plot2dImpl(InputArray plotDataX_, InputArray plotDataY_) { + Mat _plotDataX = plotDataX_.getMat(); + Mat _plotDataY = plotDataY_.getMat(); //f the matrix is not Nx1 or 1xN if((_plotDataX.cols > 1 && _plotDataX.rows > 1) || (_plotDataY.cols > 1 && _plotDataY.rows > 1)) { @@ -143,7 +146,11 @@ namespace cv } void setPlotLineWidth(int _plotLineWidth) { - plotLineWidth=_plotLineWidth; + plotLineWidth = _plotLineWidth; + } + void setNeedPlotLine(bool _needPlotLine) + { + needPlotLine = _needPlotLine; } void setPlotLineColor(Scalar _plotLineColor) { @@ -179,10 +186,12 @@ namespace cv } //render the plotResult to a Mat - void render(Mat &_plotResult) + void render(OutputArray _plotResult) { //create the plot result - plotResult = Mat(plotSizeHeight, plotSizeWidth, CV_8UC3, plotBackgroundColor); + _plotResult.create(plotSizeHeight, plotSizeWidth, CV_8UC3); + plotResult = _plotResult.getMat(); + plotResult.setTo(plotBackgroundColor); int NumVecElements = plotDataX.rows; @@ -201,36 +210,35 @@ namespace cv drawAxis(ImageXzero,ImageYzero, CurrentX, CurrentY, plotAxisColor, plotGridColor); - if(plotLineWidth > 0) + if(needPlotLine) { - //Draw the plot by connecting lines between the points - Point p1; - p1.x = (int)InterpXdata.at(0,0); - p1.y = (int)InterpYdata.at(0,0); + //Draw the plot by connecting lines between the points + Point p1; + p1.x = (int)InterpXdata.at(0,0); + p1.y = (int)InterpYdata.at(0,0); - for (int r=1; r(r,0); + p2.y = (int)InterpYdata.at(r,0); - Point p2; - p2.x = (int)InterpXdata.at(r,0); - p2.y = (int)InterpYdata.at(r,0); + line(plotResult, p1, p2, plotLineColor, plotLineWidth, 8, 0); - line(plotResult, p1, p2, plotLineColor, plotLineWidth, 8, 0); - - p1 = p2; - } + p1 = p2; + } } else { - for (int r=0; r(r,0); - p.y = (int)InterpYdata.at(r,0); + for (int r=0; r(r,0); + p.y = (int)InterpYdata.at(r,0); - circle(plotResult, p, 1, plotLineColor, plotLineWidth, 8, 0); - } + circle(plotResult, p, 1, plotLineColor, plotLineWidth, 8, 0); + } } - - _plotResult = plotResult.clone(); } protected: @@ -264,6 +272,9 @@ namespace cv //the final plot result Mat plotResult; + //flag which enables/disables connection of plotted points by lines + bool needPlotLine; + void plotHelper(Mat _plotDataX, Mat _plotDataY) { plotDataX=_plotDataX; @@ -288,6 +299,8 @@ namespace cv double MinY_plusZero; double MaxY_plusZero; + needPlotLine = true; + //Obtain the minimum and maximum values of Xdata minMaxLoc(plotDataX,&MinX,&MaxX); @@ -423,13 +436,13 @@ namespace cv }; - Ptr createPlot2d(Mat _plotData) + Ptr createPlot2d(InputArray _plotData) { return Ptr (new Plot2dImpl (_plotData)); } - Ptr createPlot2d(Mat _plotDataX, Mat _plotDataY) + Ptr createPlot2d(InputArray _plotDataX, InputArray _plotDataY) { return Ptr (new Plot2dImpl (_plotDataX, _plotDataY)); }