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