1 #include "../test_precomp.hpp" 2 #include "opencv2/ts/ocl_test.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_Update/////////////////////////////////// 24 25 namespace 26 { 27 IMPLEMENT_PARAM_CLASS(UseGray, bool) 28 IMPLEMENT_PARAM_CLASS(DetectShadow, bool) 29 } 30 31 PARAM_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 42 OCL_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 81 PARAM_TEST_CASE(Mog2_getBackgroundImage, DetectShadow) 82 { 83 bool detectShadow; 84 virtual void SetUp() 85 { 86 detectShadow = GET_PARAM(0); 87 } 88 }; 89 90 OCL_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 125 OCL_INSTANTIATE_TEST_CASE_P(OCL_Video, Mog2_Update, Combine( 126 Values(UseGray(true), UseGray(false)), 127 Values(DetectShadow(true), DetectShadow(false))) 128 ); 129 130 OCL_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