1#include "../test_precomp.hpp"
2#include "opencv2/ts/ocl_test.hpp"
3
4#ifdef HAVE_OPENCL
5
6#if defined(HAVE_XINE)     || \
7defined(HAVE_GSTREAMER)    || \
8defined(HAVE_QUICKTIME)    || \
9defined(HAVE_AVFOUNDATION) || \
10defined(HAVE_FFMPEG)       || \
11defined(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
20namespace cvtest {
21namespace ocl {
22
23//////////////////////////Mog2_Update///////////////////////////////////
24
25namespace
26{
27    IMPLEMENT_PARAM_CLASS(UseGray, bool)
28    IMPLEMENT_PARAM_CLASS(DetectShadow, bool)
29}
30
31PARAM_TEST_CASE(Mog2_Update, UseGray, DetectShadow)
32{
33    bool useGray;
34    bool detectShadow;
35    virtual void SetUp()
36    {
37        useGray = GET_PARAM(0);
38        detectShadow = GET_PARAM(1);
39    }
40};
41
42OCL_TEST_P(Mog2_Update, Accuracy)
43{
44    string inputFile = string(TS::ptr()->get_data_path()) + "video/768x576.avi";
45    VideoCapture cap(inputFile);
46    ASSERT_TRUE(cap.isOpened());
47
48    Ptr<BackgroundSubtractorMOG2> mog2_cpu = createBackgroundSubtractorMOG2();
49    Ptr<BackgroundSubtractorMOG2> mog2_ocl = createBackgroundSubtractorMOG2();
50
51    mog2_cpu->setDetectShadows(detectShadow);
52    mog2_ocl->setDetectShadows(detectShadow);
53
54    Mat frame, foreground;
55    UMat u_foreground;
56
57    for (int i = 0; i < 10; ++i)
58    {
59        cap >> frame;
60        ASSERT_FALSE(frame.empty());
61
62        if (useGray)
63        {
64            Mat temp;
65            cvtColor(frame, temp, COLOR_BGR2GRAY);
66            swap(temp, frame);
67        }
68
69        OCL_OFF(mog2_cpu->apply(frame, foreground));
70        OCL_ON (mog2_ocl->apply(frame, u_foreground));
71
72        if (detectShadow)
73            EXPECT_MAT_SIMILAR(foreground, u_foreground, 15e-3);
74        else
75            EXPECT_MAT_NEAR(foreground, u_foreground, 0);
76    }
77}
78
79//////////////////////////Mog2_getBackgroundImage///////////////////////////////////
80
81PARAM_TEST_CASE(Mog2_getBackgroundImage, DetectShadow)
82{
83    bool detectShadow;
84    virtual void SetUp()
85    {
86        detectShadow = GET_PARAM(0);
87    }
88};
89
90OCL_TEST_P(Mog2_getBackgroundImage, Accuracy)
91{
92    string inputFile = string(TS::ptr()->get_data_path()) + "video/768x576.avi";
93    VideoCapture cap(inputFile);
94    ASSERT_TRUE(cap.isOpened());
95
96    Ptr<BackgroundSubtractorMOG2> mog2_cpu = createBackgroundSubtractorMOG2();
97    Ptr<BackgroundSubtractorMOG2> mog2_ocl = createBackgroundSubtractorMOG2();
98
99    mog2_cpu->setDetectShadows(detectShadow);
100    mog2_ocl->setDetectShadows(detectShadow);
101
102    Mat frame, foreground;
103    UMat u_foreground;
104
105    for (int i = 0; i < 10; ++i)
106    {
107        cap >> frame;
108        ASSERT_FALSE(frame.empty());
109
110        OCL_OFF(mog2_cpu->apply(frame, foreground));
111        OCL_ON (mog2_ocl->apply(frame, u_foreground));
112    }
113
114    Mat background;
115    OCL_OFF(mog2_cpu->getBackgroundImage(background));
116
117    UMat u_background;
118    OCL_ON (mog2_ocl->getBackgroundImage(u_background));
119
120    EXPECT_MAT_NEAR(background, u_background, 1.0);
121}
122
123///////////////////////////////////////////////////////////////////////////////////////////
124
125OCL_INSTANTIATE_TEST_CASE_P(OCL_Video, Mog2_Update, Combine(
126                                    Values(UseGray(true), UseGray(false)),
127                                    Values(DetectShadow(true), DetectShadow(false)))
128                           );
129
130OCL_INSTANTIATE_TEST_CASE_P(OCL_Video, Mog2_getBackgroundImage, (Values(DetectShadow(true), DetectShadow(false)))
131                           );
132
133}}// namespace cvtest::ocl
134
135    #endif
136#endif
137