All Downloads are FREE. Search and download functionalities are using the official Maven repository.

srcnativelibs.Vision.cvgui.h Maven / Gradle / Ivy

/*
 * Copyright 2010-2014, Sikuli.org, sikulix.com
 * Released under the MIT License.
 *
 */
#ifndef _CVGUI_H_
#define _CVGUI_H_

#include "opencv.hpp"
#include 
#include "tessocr.h"

using namespace cv;

//TODO: Visual Logging ??
#ifdef ENABLE_VISUAL_LOG
   const bool enable_visual_log = true;
#else
   const bool enable_visual_log = false;
#endif

class VisualLogger{

private:

   static int image_i;
   static int step_i;
   static char* prefix;

public:

   static void newImage(){
      if (!enable_visual_log)
         return;

      image_i++;
      step_i = 0;
   }

   static void next(){
      if (!enable_visual_log)
         return;

      image_i++;
      step_i = 0;
   }


   static void setEnabled(bool enabled_){
      //enabled = enabled_;
   }

   static void log(const char* name, const Mat& image){
      //TODO: std::cout << "vlog " << enable_visual_log << " " << name << std::endl;
      if (!enable_visual_log)
         return;

      char buf[200];

      if (prefix){

         sprintf(buf, "%s-%02d-%s.vlog.png", prefix, step_i, name);

      }else{
         sprintf(buf, "%03d-%02d-%s.vlog.png",image_i,step_i,name);
      }

      imwrite(buf, image);

      step_i++;
   }
};

#define VLOG(x,y) VisualLogger::log(x,y)
#define VNEW()    VisualLogger::newImage()

class Blob : public Rect{

public:

   Blob(){};

   Blob(const Rect& rect){
      x = rect.x;
      y = rect.y;
      height = rect.height;
      width = rect.width;
      area = 0;
   }

   bool isContainedBy(Blob& b){
      return x >= b.x && y >= b.y && (x+width) <= (b.x+b.width) && (y+height) <= (b.y+b.height);
   }

   double area;
   int mb;
   int mg;
   int mr;
   int score;
};


class LineBlob : public Blob{

public:

   LineBlob() {};

   void add(Blob& blob);
   void merge(LineBlob& blob);

   void calculateBoundingRectangle();
   vector blobs;

protected:

   void updateBoundingRect(Blob& blob);

};


class ParagraphBlob : public LineBlob {

public:
   void add(LineBlob& lineblob);


   vector::const_iterator begin() const { return lineblobs.begin();};
   vector::const_iterator end() const { return lineblobs.end();};


   vector lineblobs;
};

class Color{
public:
   static Scalar RED;
   static Scalar WHITE;

   static Scalar RANDOM();

};

class Painter {

public:

   static void drawRect(Mat& image, OCRRect r, Scalar color);
   static void drawRect(Mat& image, Rect r, Scalar color);
   static void drawRects(Mat& image, vector& rects, Scalar color);
   static void drawRects(Mat& image, vector& rects);

   static void drawBlobs(Mat& image, vector& blobs);
   static void drawBlobs(Mat& image, vector& blobs, Scalar color);

   static void drawBlobsRandomShading(Mat& image, vector& blobs);

   static void drawLineBlobs(Mat& image, vector& lineblobs, Scalar color);
   static void drawParagraphBlobs(Mat& image, vector blobs, Scalar color);


   static void drawOCRWord(Mat& image, OCRWord ocrword);
   static void drawOCRLine(Mat& image, OCRLine ocrline);
   static void drawOCRParagraph(Mat& image, OCRParagraph ocrparagraph);
   static void drawOCRText(Mat& image, OCRText ocrtext);

};

class Util{

public:

   static void growRect(Rect& rect, int xd, int yd, Rect bounds);
   static void growRect(Rect& rect, int xd, int yd, cv::Mat image);
   static void rgb2grayC3(const Mat& input, Mat& output);

};

class cvgui {

public:

   static void segmentScreenshot(const Mat& screen, vector& text_blobs, vector& image_blobs);
   static void getLineBlobsAsIndividualWords(const Mat& screen, vector& lineblobs);
   static void getParagraphBlobs(const Mat& screen, vector& parablobs);

   static void findBoxes(const Mat& screen, vector& output_blobs);
   static Mat findPokerBoxes(const Mat& screen, vector& output_blobs);

   static Mat findBoxesByVoting(const Mat& screen, int box_width, int box_height, vector& output_blobs);


private:

   static void computeUnitBlobs(const Mat& input, Mat& output);

   static Mat removeGrayBackground(const Mat& input);
   static Mat obtainGrayBackgroundMask(const Mat& input);

   static void findLongLines(const Mat& binary, Mat& dest, int min_length = 100, int extension = 0);
   static void findLongLines_Horizontal(const Mat& binary, Mat& dest, int min_length = 100, int extension = 0);
   static void findLongLines_Vertical(const Mat& binary, Mat& dest, int min_length = 100, int extension = 0);

   static void filterLineSegments(const Mat& src, Mat& dest, int min_length, int max_length);

   static void extractRects(const Mat& src, vector& rects);
   static void extractBlobs(const Mat& src, vector& blobs);



   static void extractSmallRects(const Mat& src, vector& rects);


   static bool hasMoreThanNUniqueColors(const Mat& src, int n);
   static bool areHorizontallyAligned(const vector& rects);


   // voting
   static void voteCenter_Horizontal(const Mat& binary, Mat& dest, int min_length, int tolerance, int distance);
   static void voteCenter_Vertical(const Mat& binary, Mat& dest, int min_length, int tolerance, int distance);



   // linking
   static void linkLineBlobsIntoPagagraphBlobs(vector& blobs, vector& parablobs);
   static void mergeLineBlobs(vector& blobs, vector& merged_blobs);
   static void linkBlobsIntoLineBlobs(vector& blobs, vector& lines, int max_spacing = 8);

   static void run_ocr_on_lineblobs(vector& ocr_input_lineblobs,
                                    Mat& input_image,
                                    vector& ocrlines);


   static void calculateColor(vector& blobs,
                               const Mat& color_image,
                               const Mat& foreground_mask);

};

#endif // _CVGUI_H_




© 2015 - 2025 Weber Informatics LLC | Privacy Policy