1 #include "../perf_precomp.hpp"
2 #include "opencv2/ts/ocl_perf.hpp"
3 
4 #ifdef HAVE_OPENCL
5 
6 #if defined(HAVE_XINE)     || \
7 defined(HAVE_GSTREAMER)    || \
8 defined(HAVE_QUICKTIME)    || \
9 defined(HAVE_AVFOUNDATION) || \
10 defined(HAVE_FFMPEG)       || \
11 defined(WIN32)
12 
13 #  define BUILD_WITH_VIDEO_INPUT_SUPPORT 1
14 #else
15 #  define BUILD_WITH_VIDEO_INPUT_SUPPORT 0
16 #endif
17 
18 #if BUILD_WITH_VIDEO_INPUT_SUPPORT
19 
20 namespace cvtest {
21 namespace ocl {
22 
23 //////////////////////////// Mog2//////////////////////////
24 
25 typedef tuple<string, int> VideoMOG2ParamType;
26 typedef TestBaseWithParam<VideoMOG2ParamType> MOG2_Apply;
27 typedef TestBaseWithParam<VideoMOG2ParamType> MOG2_GetBackgroundImage;
28 
cvtFrameFmt(vector<Mat> & input,vector<Mat> & output)29 static void cvtFrameFmt(vector<Mat>& input, vector<Mat>& output)
30 {
31     for(int i = 0; i< (int)(input.size()); i++)
32     {
33         cvtColor(input[i], output[i], COLOR_RGB2GRAY);
34     }
35 }
36 
prepareData(VideoCapture & cap,int cn,vector<Mat> & frame_buffer)37 static void prepareData(VideoCapture& cap, int cn, vector<Mat>& frame_buffer)
38 {
39     cv::Mat frame;
40     std::vector<Mat> frame_buffer_init;
41     int nFrame = (int)frame_buffer.size();
42     for(int i = 0; i < nFrame; i++)
43     {
44         cap >> frame;
45         ASSERT_FALSE(frame.empty());
46         frame_buffer_init.push_back(frame);
47     }
48 
49     if(cn == 1)
50         cvtFrameFmt(frame_buffer_init, frame_buffer);
51     else
52         frame_buffer = frame_buffer_init;
53 }
54 
55 OCL_PERF_TEST_P(MOG2_Apply, Mog2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1,3)))
56 {
57     VideoMOG2ParamType params = GetParam();
58 
59     const string inputFile = getDataPath(get<0>(params));
60 
61     const int cn = get<1>(params);
62     int nFrame = 5;
63 
64     vector<Mat> frame_buffer(nFrame);
65 
66     cv::VideoCapture cap(inputFile);
67     ASSERT_TRUE(cap.isOpened());
68     prepareData(cap, cn, frame_buffer);
69 
70     UMat u_foreground;
71 
OCL_TEST_CYCLE()72     OCL_TEST_CYCLE()
73     {
74         Ptr<cv::BackgroundSubtractorMOG2> mog2 = createBackgroundSubtractorMOG2();
75         mog2->setDetectShadows(false);
76         u_foreground.release();
77         for (int i = 0; i < nFrame; i++)
78         {
79             mog2->apply(frame_buffer[i], u_foreground);
80         }
81     }
82     SANITY_CHECK(u_foreground);
83 }
84 
85 OCL_PERF_TEST_P(MOG2_GetBackgroundImage, Mog2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(3)))
86 {
87     VideoMOG2ParamType params = GetParam();
88 
89     const string inputFile = getDataPath(get<0>(params));
90 
91     const int cn = get<1>(params);
92     int nFrame = 5;
93 
94     vector<Mat> frame_buffer(nFrame);
95 
96     cv::VideoCapture cap(inputFile);
97     ASSERT_TRUE(cap.isOpened());
98     prepareData(cap, cn, frame_buffer);
99 
100     UMat u_foreground, u_background;
101 
OCL_TEST_CYCLE()102     OCL_TEST_CYCLE()
103     {
104         Ptr<cv::BackgroundSubtractorMOG2> mog2 = createBackgroundSubtractorMOG2();
105         mog2->setDetectShadows(false);
106         u_foreground.release();
107         u_background.release();
108         for (int i = 0; i < nFrame; i++)
109         {
110             mog2->apply(frame_buffer[i], u_foreground);
111         }
112         mog2->getBackgroundImage(u_background);
113     }
114     SANITY_CHECK(u_background);
115 }
116 
117 }}// namespace cvtest::ocl
118 
119     #endif
120 #endif