Merge pull request #2887 from ilya-lavrenov:ipp_morph_fix
[platform/upstream/opencv.git] / samples / cpp / dbt_face_detection.cpp
1 #if defined(__linux__) || defined(LINUX) || defined(__APPLE__) || defined(ANDROID)
2
3 #include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
4 #include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
5 #include <opencv2/highgui/highgui.hpp>  // OpenCV window I/O
6 #include <opencv2/features2d/features2d.hpp>
7 #include <opencv2/contrib/detection_based_tracker.hpp>
8
9 #include <stdio.h>
10 #include <string>
11 #include <vector>
12
13 using namespace std;
14 using namespace cv;
15
16 const string WindowName = "Face Detection example";
17
18 class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector
19 {
20     public:
21         CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector):
22             IDetector(),
23             Detector(detector)
24         {
25             CV_Assert(detector);
26         }
27
28         void detect(const cv::Mat &Image, std::vector<cv::Rect> &objects)
29         {
30             Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);
31         }
32
33         virtual ~CascadeDetectorAdapter()
34         {}
35
36     private:
37         CascadeDetectorAdapter();
38         cv::Ptr<cv::CascadeClassifier> Detector;
39  };
40
41 int main(int , char** )
42 {
43     namedWindow(WindowName);
44
45     VideoCapture VideoStream(0);
46
47     if (!VideoStream.isOpened())
48     {
49         printf("Error: Cannot open video stream from camera\n");
50         return 1;
51     }
52
53     std::string cascadeFrontalfilename = "../../data/lbpcascades/lbpcascade_frontalface.xml";
54     cv::Ptr<cv::CascadeClassifier> cascade = makePtr<cv::CascadeClassifier>(cascadeFrontalfilename);
55     cv::Ptr<DetectionBasedTracker::IDetector> MainDetector = makePtr<CascadeDetectorAdapter>(cascade);
56
57     cascade = makePtr<cv::CascadeClassifier>(cascadeFrontalfilename);
58     cv::Ptr<DetectionBasedTracker::IDetector> TrackingDetector = makePtr<CascadeDetectorAdapter>(cascade);
59
60     DetectionBasedTracker::Parameters params;
61     DetectionBasedTracker Detector(MainDetector, TrackingDetector, params);
62
63     if (!Detector.run())
64     {
65         printf("Error: Detector initialization failed\n");
66         return 2;
67     }
68
69     Mat ReferenceFrame;
70     Mat GrayFrame;
71     vector<Rect> Faces;
72
73     while(true)
74     {
75         VideoStream >> ReferenceFrame;
76         cvtColor(ReferenceFrame, GrayFrame, COLOR_RGB2GRAY);
77         Detector.process(GrayFrame);
78         Detector.getObjects(Faces);
79
80         for (size_t i = 0; i < Faces.size(); i++)
81         {
82             rectangle(ReferenceFrame, Faces[i], Scalar(0,255,0));
83         }
84
85         imshow(WindowName, ReferenceFrame);
86
87         if (waitKey(30) >= 0) break;
88     }
89
90     Detector.stop();
91
92     return 0;
93 }
94
95 #else
96
97 #include <stdio.h>
98 int main()
99 {
100     printf("This sample works for UNIX or ANDROID only\n");
101     return 0;
102 }
103
104 #endif