1// 2// DetectionBasedTracker.mm 3// 4// Created by Giles Payne on 2020/04/05. 5// 6 7#import "DetectionBasedTracker.h" 8#import "Mat.h" 9#import "Rect2i.h" 10#import "CVObjcUtil.h" 11 12class CascadeDetectorAdapter: public cv::DetectionBasedTracker::IDetector 13{ 14public: 15 CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector):IDetector(), Detector(detector) {} 16 17 void detect(const cv::Mat &Image, std::vector<cv::Rect> &objects) 18 { 19 Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize); 20 } 21 22 virtual ~CascadeDetectorAdapter() {} 23 24private: 25 CascadeDetectorAdapter(); 26 cv::Ptr<cv::CascadeClassifier> Detector; 27}; 28 29 30struct DetectorAgregator 31{ 32 cv::Ptr<CascadeDetectorAdapter> mainDetector; 33 cv::Ptr<CascadeDetectorAdapter> trackingDetector; 34 cv::Ptr<cv::DetectionBasedTracker> tracker; 35 DetectorAgregator(cv::Ptr<CascadeDetectorAdapter>& _mainDetector, cv::Ptr<CascadeDetectorAdapter>& _trackingDetector):mainDetector(_mainDetector), trackingDetector(_trackingDetector) { 36 CV_Assert(_mainDetector); 37 CV_Assert(_trackingDetector); 38 cv::DetectionBasedTracker::Parameters DetectorParams; 39 tracker = cv::makePtr<cv::DetectionBasedTracker>(mainDetector, trackingDetector, DetectorParams); 40 } 41}; 42 43@implementation DetectionBasedTracker { 44 DetectorAgregator* agregator; 45} 46 47- (instancetype)initWithCascadeName:(NSString*)cascadeName minFaceSize:(int)faceSize { 48 self = [super init]; 49 if (self) { 50 auto mainDetector = cv::makePtr<CascadeDetectorAdapter>(cv::makePtr<cv::CascadeClassifier>(cascadeName.UTF8String)); 51 auto trackingDetector = cv::makePtr<CascadeDetectorAdapter>( 52 cv::makePtr<cv::CascadeClassifier>(cascadeName.UTF8String)); 53 agregator = new DetectorAgregator(mainDetector, trackingDetector); 54 if (faceSize > 0) { 55 agregator->mainDetector->setMinObjectSize(cv::Size(faceSize, faceSize)); 56 } 57 } 58 return self; 59} 60 61- (void)dealloc 62{ 63 delete agregator; 64} 65 66- (void)start { 67 agregator->tracker->run(); 68} 69 70- (void)stop { 71 agregator->tracker->stop(); 72} 73 74- (void)setFaceSize:(int)size { 75 agregator->mainDetector->setMinObjectSize(cv::Size(size, size)); 76} 77 78- (void)detect:(Mat*)imageGray faces:(NSMutableArray<Rect2i*>*)faces { 79 std::vector<cv::Rect> rectFaces; 80 agregator->tracker->process(*((cv::Mat*)imageGray.nativePtr)); 81 agregator->tracker->getObjects(rectFaces); 82 CV2OBJC(cv::Rect, Rect2i, rectFaces, faces); 83} 84 85@end 86