#if !defined(_COMPONENT_LABELING_H_INCLUDED) #define _COMPONENT_LABELING_H_INCLUDED //#define DEBUG_COMPONENT_LABELLING #include #include #include "BlobContour.h" #include "defines.h" #include "blob.h" #include "opencv2/opencv.hpp" //#include //! forward decl. for "parent" field of CompLabeler. class CompLabelerGroup; //! implementation of F.Chang algorithm (Luca Nardelli) class CompLabeler { public: //! Double pointer so to pass the array of blob pointers CompLabeler(cv::Mat& binImage, BlobContour** lab, cv::Point start = cv::Point(-1, -1), cv::Point end = cv::Point(-1, -1)); ~CompLabeler(); //! Do labeling in region defined by startpoint and endpoint, populating blobs void label(); //! Resets internal buffers void reset(); //! External contours tracer void tracerExt(); //! Internal contours tracer void tracerInt(int startDir = 5); //! Counter clockwise void getNextPointCCW(); //! Clockwise void getNextPointCW(); //! Thread function static void* threadLabeling(void* o); public: BlobVector m_blobs; cv::Mat m_binaryImage; cv::Point m_startPoint, m_endPoint; private: friend class CompLabelerGroup; //! CompLabelerGroup parent, in order to get access to mutexes. CompLabelerGroup* m_parent; BlobContour** m_labels; //! currentLabel int m_currentLabel; int m_r, m_c, m_pos; //! Width& Height of image int m_w, m_h; uchar m_dir; static int m_freemanR[8], m_freemanC[8]; bool m_singlePixBlob; uchar* m_ptrDataBinary; BlobContour** m_ptrDataLabels; int m_tempR, m_tempC; Blob* m_currentBlob; BlobContour* m_currentContour; }; class CompLabelerGroup { public: CompLabelerGroup(); ~CompLabelerGroup(); void doLabeling(BlobVector& blobs); void set(int numThreads, const cv::Mat& img); void reset(); private: void acquireMutex(); void releaseMutex(); public: cv::Mat m_img; private: friend class CompLabeler; CompLabeler** m_labelers; int m_numThreads; std::mutex m_mutexBlob; //pthread_t* m_tIds; //pthread_mutex_t m_mutexBlob; BlobContour** m_labels; }; #endif //!_COMPONENT_LABELING_H_INCLUDED