Salome HOME
Copyright update 2020
[modules/geom.git] / src / ShapeRecognition / ShapeRec_FeatureDetector.hxx
1 // Copyright (C) 2007-2020  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 // File   : ShapeRec_FeatureDetector.h
24 // Author : Renaud NEDELEC, Open CASCADE S.A.S.
25
26 // OpenCV includes
27 // RNV: Workaround: HAVE_TBB definition from OCCT conflicts with OPENCV, undef it.
28 //      This workaround will be removed after correction of the
29 //      https://tracker.dev.opencascade.org/view.php?id=28457 issue.
30 #ifdef HAVE_TBB
31  #undef HAVE_TBB
32  #include <cv.h>
33  #include <highgui.h>
34  #include <opencv2/imgproc/imgproc.hpp>
35  #include <opencv2/highgui/highgui.hpp>
36  #define HAVE_TBB
37 #else
38  #include <cv.h>
39  #include <highgui.h>
40  #include <opencv2/imgproc/imgproc.hpp>
41  #include <opencv2/highgui/highgui.hpp>
42 #endif
43
44 // Qt
45 #include <QRect>
46
47 #ifdef WIN32
48   #if defined GEOM_SHAPEREC_EXPORTS || defined GEOMShapeRec_EXPORTS
49     #define GEOM_SHAPEREC_EXPORT __declspec( dllexport )
50   #else
51     #define GEOM_SHAPEREC_EXPORT __declspec( dllimport )
52   #endif
53 #else
54    #define GEOM_SHAPEREC_EXPORT
55 #endif
56
57 class GEOM_SHAPEREC_EXPORT ShapeRec_Parameters
58 {
59 public:
60   ShapeRec_Parameters();
61   virtual ~ShapeRec_Parameters();
62
63   int kernelSize;
64   int findContoursMethod;
65 };
66
67 class GEOM_SHAPEREC_EXPORT ShapeRec_CornersParameters : public ShapeRec_Parameters
68 {
69 public:
70   ShapeRec_CornersParameters();
71   virtual ~ShapeRec_CornersParameters();
72
73   double qualityLevel;
74   double minDistance;
75   int typeCriteria;
76   int maxIter;
77   double epsilon;
78 };
79
80 class GEOM_SHAPEREC_EXPORT ShapeRec_CannyParameters : public ShapeRec_Parameters
81 {
82 public:
83   ShapeRec_CannyParameters();
84   virtual ~ShapeRec_CannyParameters();
85   
86   int lowThreshold;
87   int ratio;
88   bool L2gradient;
89 };
90
91 class GEOM_SHAPEREC_EXPORT ShapeRec_ColorFilterParameters : public ShapeRec_Parameters
92 {
93 public:
94   ShapeRec_ColorFilterParameters();
95   virtual ~ShapeRec_ColorFilterParameters();
96
97   int smoothSize;
98   int* histSize;
99   int histType;
100   double threshold;
101   double maxThreshold;
102 };
103
104 class GEOM_SHAPEREC_EXPORT ShapeRec_FeatureDetector
105 {
106 public:
107   
108   typedef std::vector<cv::Point>               CvContour;
109   typedef std::vector<std::vector<cv::Point> > CvContoursArray;
110   
111   ShapeRec_FeatureDetector();                                            // Constructor
112   
113   void                    SetPath( const std::string& );                 // Sets the image path
114   void                    SetROI( const QRect& );                        // Sets a Region Of Interest in the image
115   CvPoint2D32f*           GetCorners()           { return corners;     };
116   CvContoursArray         GetContours()          { return contours;    };
117   std::vector<cv::Vec4i>  GetLines()             { return lines;       };
118   std::vector<cv::Vec4i>  GetContoursHierarchy() { return hierarchy;   };
119   int                     GetCornerCount()       { return cornerCount; };
120   int                     GetImgHeight()         { return imgHeight;   };
121   int                     GetImgWidth()          { return imgWidth;    };
122   
123   std::string             CroppImage();
124   void                    ComputeCorners( bool useROI = false, ShapeRec_Parameters* parameters = 0 );  // Detects the corners from the image located at imagePath
125   bool                    ComputeLines();                                                              // Detects the lines from the image located at imagePath
126   bool                    ComputeContours( bool useROI = false, ShapeRec_Parameters* parameters = 0 ); // Detects the contours from the image located at imagePath
127   
128   
129 private:
130   std::string             imagePath;
131   
132   CvPoint2D32f*           corners;
133   int                     cornerCount;
134   
135   CvContoursArray         contours;
136   std::vector<cv::Vec4i>  hierarchy;
137   std::vector<cv::Vec4i>  lines;
138   int                     imgHeight;
139   int                     imgWidth; 
140   CvRect                  rect;
141 };