contour.h
Go to the documentation of this file.
00001 
00010 #ifndef CONTOUR_H
00011 #define CONTOUR_H
00012 
00013 #include <vector>
00014 #include <valarray>
00015 
00016 #include <opencv/cv.h>
00017 
00018 namespace tuw {
00019 
00020 
00024 class Contour {
00025 public:
00026 
00027     Contour();
00028     ~Contour();
00033     static const int ANGLE_8U;
00038     static const int ANGLE_32F;
00043     static const int ANGLE_64F;
00044 
00048     static const int MODE_SIMPLE;
00052     static const int MODE_CONTOUR;
00056     static const int MODE_GRAIDENT;
00060     static const int MODE_COMPLEX;
00061 
00062 
00063 
00074     void Init ( unsigned int iImgWidth, unsigned int iImgHeight, bool bAllowToModifyTheSources = false, unsigned char iEdgeToProcess = 0xFF, unsigned char iEdgeInProcess = 0xFF-1, unsigned char iEdgeProcessed = 0xFF-2, unsigned char iEdgeStrengthRemoved = 0 );
00089     void Perform ( unsigned char* pImgEdgeStrength, int defEdgeLinkMode = MODE_CONTOUR, void* pImgEdgeDirection = NULL, int defImgEdgeDirectionType = ANGLE_8U );
00090 
00095     void Draw( unsigned char* pImgRGB );
00096 
00102     unsigned int GetNrOfEdges() {
00103         return mNrOfEdges;
00104     };
00105 
00112     int GetEdgeListSplittedXY (std::vector<cv::Point_<int> > &rEdges, std::vector<unsigned char> **ppAngle8Bit = NULL);
00113     
00120     int getContours( std::vector<std::vector<cv::Point> > &contours, unsigned min_length = 0);
00121 
00126     std::vector<cv::Range> getSegmentIndexes();
00127     
00132     void GetAbnormitiesInEdgesImage ( IplImage *ptImgEdge, std::vector<CvPoint> *pAbnormities, uchar iEdgeStrength = 0 );
00133 
00134 private:
00135     unsigned char *mpImgEdge;
00136     void *mpImgEdgeDirection;
00137     int mdImgEdgeDirectionType;
00138     int mdefEdgeLinkMode;
00139     int mImgWidth;
00140     int mImgHeight;
00141     bool mbAllowToModifyTheSources;
00142     unsigned char mEdgeToProcess;
00143     unsigned char mEdgeInProcess;
00144     unsigned char mEdgeProcessed;
00145     static const int pppDirectionWeightsField[4][3][3];
00146     static const int ppGradientWeightsField[4][9];
00147     static const int pppCommingFromEdgeWeightsField[9][3][3];
00148     static const int ppContourWeightsField[9][9];
00149     static const float fPi;
00150     static const double dPi;
00151     //CvPoint *mpEdges;
00152     std::vector<CvPoint> mEdges;
00153     std::vector<unsigned char> mAngle8Bit;
00154     unsigned int mNrOfEdges;
00155     std::vector<cv::Range> mSegments;
00156 
00157     void AllocateMemory();
00158     void RelaseMemory();
00159     void Linking_Simple();
00160     int GetImgDirectionIndex ( CvPoint tPoint );
00161     void Trace_Simple ( CvPoint tPoint, int *pEnd );
00162     void Linking_Complex();
00163     void Trace_Complex ( CvPoint tPoint, int *pEnd, unsigned int iCommingFromEdge );
00164     void Linking_Contour();
00165     void Trace_Contour ( CvPoint tPoint, int *pEnd, unsigned int iCommingFromEdge );
00166     void Linking_Gradient();
00167     void Trace_Gradient ( CvPoint tPoint, int *pEnd );
00168 
00169     static const CvPoint GetNeighborPoint ( CvPoint pPtrCenter, int iNeighborIndex );
00170     static const void SortArrayIndexes ( int *pArray, int *pIndexes, const int iSize );
00171 
00172 //Inlines
00173     inline unsigned char* getImgEdge ( CvPoint tPoint ) {
00174         return mpImgEdge + ( tPoint.y * mImgWidth + tPoint.x );
00175     };
00176     inline void SumArrayMatrix ( int *pMatrixA, int *pMatrixB, int *pSum, const int iSize ) {
00177         for ( int i = 0; i < iSize; i++ ) pSum[i] = pMatrixA[i] + pMatrixB[i];
00178     };
00179     inline bool isInImage( const CvPoint &p){
00180         return ( ( p.x > 0 ) && ( p.x < mImgWidth-1 ) && ( p.y > 0 ) && ( p.y < mImgHeight-1 ) );
00181     }
00182     inline void markNeighborEdgesAsProcessed(unsigned char *pPix){
00183         pPix[ mImgWidth-1] = mEdgeProcessed;
00184         pPix[ mImgWidth  ] = mEdgeProcessed;
00185         pPix[ mImgWidth+1] = mEdgeProcessed;
00186         pPix[-1] = mEdgeProcessed;
00187         pPix[ 1] = mEdgeProcessed;
00188         pPix[-mImgWidth-1] = mEdgeProcessed;
00189         pPix[-mImgWidth  ] = mEdgeProcessed;
00190         pPix[-mImgWidth+1] = mEdgeProcessed;
00191     }
00192 };
00193 
00194 }
00195 
00196 #endif //CONTOUR_H
00197 // kate: indent-mode cstyle; space-indent on; indent-width 4; 


tuw_ellipses
Author(s):
autogenerated on Sun May 29 2016 02:50:24