Ask Your Question
9

how do you plot graphs in opencv projects?

asked 2015-10-14 15:03:40 -0500

theodore gravatar image

updated 2015-10-14 15:37:06 -0500

Hey guys, I was just wondering, there are cases where sometimes you need to plot a graph in real time within a project in order to keep track or evaluate data or for any other possible reason.

At the moment OpenCV does not support such a functionality - right? please correct me if I am wrong here, maybe the 3.x version introduced something that I am not aware - and from a thorough search that I did I only found this two libraries, [1] and [2] that somehow try to simulate such a wanna be plotting functionality with the use of OpenCV. However though I appreciate the effort of their authors, both are quite old, meaning they are using the old C api and for sure they are not something close to functional, like matlab, gnuplot, etc... So, here comes my question how do you guys do it?

I was looking also at QWT and some examples but it does not seem that convenient regarding also that you need to include Qt libraries and create a project in a form of application since you need to start a QApplication object.

My wonder was that OpenCV as a mature and really known library in computer vision and image processing fields should have such a functionality or to embed it from another external library which is specifically for that reason, since I thing such a functionality is quite some times necessary.

Moreover, I was also thinking on starting something from scratch based on the first two libraries that I pointed here, but I am not that confident that I would be able to provide a solution and reach it in such a level that I would be also able to contribute it to the main OpenCV's source code. So if someone is interested we could also arrange a group that will start such a task in our spare time and when we reach it in a good level to contribute it to OpenCV.

So I would like to hear your opinions and why not enlighten and advice me, regarding what you are using or how you do it in general or if you are interested to create something together if there is a need about it. Be aware though that I am not talking about offline plotting since this is quite easy to manage and there are a lot of tools out there that make the drill in more than a perfect way ;-).

edit retag flag offensive close merge delete

Comments

LBerger gravatar imageLBerger ( 2015-10-14 15:11:40 -0500 )edit

@LBerger thanks for the plplot library. Let's see if someone else has any other proposal.

theodore gravatar imagetheodore ( 2015-10-15 04:36:08 -0500 )edit

+1. It would be a great feature to have into OpenCV.

I used a library call ViSP (dedicated to virtual visual servoing tasks) for my work and I used the built-in plotter class but usually it is only for debugging and I saved the plain results into a text file to generate later the figure.

Eduardo gravatar imageEduardo ( 2015-10-15 04:59:24 -0500 )edit

I think that's to plot graph with opencv library should be compatible with cmake C++ python and java ios and android QT (of windows, mac, linux). I don't know an open source library with all these things.

plplot is not compatible with android and ios and not optimize for real time. @Eduardo what's about ViSP?

LBerger gravatar imageLBerger ( 2015-10-15 09:13:45 -0500 )edit

As far as I know, ViSP is compatible only with Linux, MacOs and Windows. The plotting class seems to use the display (displayX, displayGDI, displayGTK, ...) to draw the curves and the text, but I don't have much information about it.

Maybe it is possible to enable the plotting class only on compatible or suitable environment ?

Eduardo gravatar imageEduardo ( 2015-10-15 13:04:47 -0500 )edit

3 answers

Sort by ยป oldest newest most voted
6

answered 2015-10-16 04:43:03 -0500

Guys actually plotting functionality is awaiting its entrance in the library!

  1. Nuno Moutinho started embedding plotting functionality in OpenCV. I have been using it ever since and am happily awaiting the final merge. Take a look at the plot module.
  2. I recently added markers to support even more plotting possibilities in the future right here.

So what I suggest is that if you want to built further on plotting functionality for OpenCV, that we work together to improve this module and add functionality to it.

edit flag offensive delete link more

Comments

@StevenPuttemans thanks for pointing. This is what I was meaning when I was saying that might be something that I am not aware :-). Perfect!!! This one seems to be what I was looking for, and I guess the same case is for other users. Super!!!!!

theodore gravatar imagetheodore ( 2015-10-16 05:18:49 -0500 )edit

however, from a quick overview it seems that it has stuck for some reason, and the author is quite some time since he gave any feedback. Do you have any clue why?

theodore gravatar imagetheodore ( 2015-10-16 05:33:56 -0500 )edit
1

Contrib had problems with new functionality and correct buildbot checks. There is still the need of a dev to focus on it and merge it. Let me remind them to continue.

StevenPuttemans gravatar imageStevenPuttemans ( 2015-10-16 05:40:35 -0500 )edit

@StevenPuttemans can you provide an example, how you are using it. I downloaded the files from github and I was trying to use it but without success so far.

theodore gravatar imagetheodore ( 2015-10-16 15:37:14 -0500 )edit

@theodore I should dig it up again on how I did it exactly, when he first committed the functionality. That was before the big 3.0 changes I think ... so it might be that it is not working as expected. Might take a look again in the near future! Or you can simply ask him for a code sample on his github repo?

StevenPuttemans gravatar imageStevenPuttemans ( 2015-10-20 02:49:50 -0500 )edit
2

@everyone, the plot module has just been merged officially!

StevenPuttemans gravatar imageStevenPuttemans ( 2015-12-14 06:53:13 -0500 )edit
1

nice news, thanks ;-)

theodore gravatar imagetheodore ( 2015-12-14 15:21:31 -0500 )edit
1

@theodore have you try it already? Hope you find it useful ;) it still has a lot to improve though.

m0utinho gravatar imagem0utinho ( 2015-12-27 06:49:54 -0500 )edit
1

@m0utinho could you share a simple code to test it ?

sturkmen gravatar imagesturkmen ( 2015-12-27 07:57:44 -0500 )edit
1

@sturkmen check bellow:

Mat data; 
Mat plot_result;
//-------------------------------//
//     fill your data here
//-------------------------------//
Ptr<plot::Plot2d> plot;
plot = plot::createPlot2d(data);
plot->render(plot_result);
//-------------------------------//
//         show the plot
//-------------------------------//
imshow("plot",plot_result );

it's also in the instructions in github. @m0utinho yes I tried it and it seems quite nice. However, I think that still needs some work and some features to be added. I do not know how much time can you spend to it, I remember that you were busy with your Phd thesis, I would like to help though if I get some time.

theodore gravatar imagetheodore ( 2015-12-27 08:07:29 -0500 )edit
6

answered 2015-12-27 17:05:41 -0500

updated 2017-11-11 15:17:47 -0500

i tried to understand usage of Plot2d class maybe the code below will be useful for someone who want to try.

#include <opencv2/highgui.hpp>
#include <opencv2/plot.hpp>

using namespace cv;

int main(int argc, char** argv)
{
   // Plot data must be a 1xN or Nx1 matrix.
   // Plot data type must be double (CV_64F) 
    Mat data( 30, 1, CV_64F );
    randu( data, 0, 500 ); // random values

    Mat plot_result;

    Ptr<plot::Plot2d> plot = plot::Plot2d::create(data);
    plot->setPlotBackgroundColor( Scalar( 50, 50, 50 ) );
    plot->setPlotLineColor( Scalar( 50, 50, 255 ) );
    plot->render( plot_result );

    imshow( "plot", plot_result );
    waitKey();

    plot->setPlotLineColor( Scalar( 50, 255, 255 ) );
    data = data / 3;
    plot->render( plot_result );

    imshow( "plot", plot_result );
    waitKey();

    plot->setPlotGridColor( Scalar( 255, 0, 255 ) );
    data = data * 4;
    plot->render( plot_result );

    imshow( "plot", plot_result );
    waitKey();

    plot->setPlotTextColor( Scalar( 255, 0, 0 ) );
    randu( data, 100, 400 );
    plot->render( plot_result );

    imshow( "plot", plot_result );
    waitKey();

    return 0;
}

sample java code

import org.opencv.core.Core;
import org.opencv.core.Scalar;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.plot.Plot2d;
public class test
{
   public static void main( String[] args )
   {
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      Mat data = new Mat(1, 20, CvType.CV_64F);
      Core.randu(data, 1, 10);
      Plot2d plot = Plot2d.create(data);
      Mat mplot = new Mat();
      plot.setPlotLineColor(new Scalar(0,0,255));
      plot.render(mplot);
      Imgcodecs.imwrite("e:/test.png", mplot);
   }
}

image description


image description


image description


image description

edit flag offensive delete link more

Comments

2

@sturkmen add also the result images for visualization purposes

theodore gravatar imagetheodore ( 2015-12-27 18:35:27 -0500 )edit
1

I haven't try OpenCV 3.1 yet, do you know if you can do real-time plotting ?

Eduardo gravatar imageEduardo ( 2015-12-29 17:49:11 -0500 )edit
2

yes, you can do it by adding new values to your data matrix and update with plot->render and imshow

sturkmen gravatar imagesturkmen ( 2015-12-29 18:12:30 -0500 )edit

@m0utinho what is your opininon to adding feature of drawing multiple data series

sturkmen gravatar imagesturkmen ( 2016-01-23 12:52:29 -0500 )edit
1

@sturkmen I am going to create a thread specifically for this module so we can discuss and suggest ad-ons to the Plot2d module. That is one of my list ;) whenever I have time I will start improving this module with all the suggestions. If you want you can create the thread and start the discussion, it is ok to me :) I will then use it as a TODO list.

m0utinho gravatar imagem0utinho ( 2016-01-24 12:06:11 -0500 )edit

i did not try but seems good. http://research.project-10.de/dgm/doc...

sturkmen gravatar imagesturkmen ( 2016-08-20 15:03:39 -0500 )edit

niiiice one

azdoud.y gravatar imageazdoud.y ( 2017-01-03 05:58:35 -0500 )edit

I cannot import the plot import: org.opencv.plot.Plot2d; (java code) even though I have the latest version of OpenCV. Any ideas of why this might be happening?

EleDiam gravatar imageEleDiam ( 2017-11-21 05:17:07 -0500 )edit

you need to compile the latest source. because plot module is available with a PR recently after OpenCV 3.3.1 released

sturkmen gravatar imagesturkmen ( 2017-11-21 05:52:41 -0500 )edit

@sturkmen, how can I compile the latest source? The link you have sent me has instructions for cmake and cmake-gui command. Can I build opencv with extra modules in Android(java) sdk? If yes, do you know how I could do it? cc @berak

EleDiam gravatar imageEleDiam ( 2017-11-21 08:03:14 -0500 )edit
2

answered 2017-12-21 22:18:30 -0500

leenvand gravatar image

updated 2017-12-23 01:23:42 -0500

Try this cvplot framework. You can plot in real time and and have multiple plots in a single window.

image description

edit flag offensive delete link more

Comments

Nice framework!

StevenPuttemans gravatar imageStevenPuttemans ( 2017-12-31 06:48:02 -0500 )edit

really impressive work!!! nice :-)

theodore gravatar imagetheodore ( 2018-04-07 16:32:51 -0500 )edit
Login/Signup to Answer

Question Tools

5 followers

Stats

Asked: 2015-10-14 15:03:40 -0500

Seen: 18,647 times

Last updated: Dec 23 '17