fixed
authorElena Gvozdeva <elena.gvozdeva@itseez.com>
Wed, 29 Jan 2014 10:10:36 +0000 (14:10 +0400)
committerElena Gvozdeva <elena.gvozdeva@itseez.com>
Wed, 29 Jan 2014 10:27:29 +0000 (14:27 +0400)
modules/video/perf/opencl/perf_bgfg_mog2.cpp
modules/video/src/bgfg_gaussmix2.cpp

index b746437..50814bf 100644 (file)
@@ -23,6 +23,7 @@ namespace ocl {
 //////////////////////////// Mog2//////////////////////////
 
 typedef tuple<string, int> VideoMOG2ParamType;
+typedef TestBaseWithParam<VideoMOG2ParamType> MOG2_Apply;
 typedef TestBaseWithParam<VideoMOG2ParamType> MOG2_GetBackgroundImage;
 
 static void cvtFrameFmt(vector<Mat>& input, vector<Mat>& output)
@@ -51,7 +52,37 @@ static void prepareData(VideoCapture& cap, int cn, vector<Mat>& frame_buffer)
         frame_buffer = frame_buffer_init;
 }
 
-OCL_PERF_TEST_P(MOG2_GetBackgroundImage, Mog2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1,3)))
+OCL_PERF_TEST_P(MOG2_Apply, Mog2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1,3)))
+{
+    VideoMOG2ParamType params = GetParam();
+
+    const string inputFile = getDataPath(get<0>(params));
+
+    const int cn = get<1>(params);
+    int nFrame = 5;
+
+    vector<Mat> frame_buffer(nFrame);
+
+    cv::VideoCapture cap(inputFile);
+    ASSERT_TRUE(cap.isOpened());
+    prepareData(cap, cn, frame_buffer);
+
+    UMat u_foreground;
+
+    OCL_TEST_CYCLE()
+    {
+        Ptr<cv::BackgroundSubtractorMOG2> mog2 = createBackgroundSubtractorMOG2();
+        mog2->setDetectShadows(false);
+        u_foreground.release();
+        for (int i = 0; i < nFrame; i++)
+        {
+            mog2->apply(frame_buffer[i], u_foreground);
+        }
+    }
+    SANITY_CHECK(u_foreground);
+}
+
+OCL_PERF_TEST_P(MOG2_GetBackgroundImage, Mog2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(3)))
 {
     VideoMOG2ParamType params = GetParam();
 
index 947f720..8650de9 100644 (file)
@@ -736,6 +736,8 @@ public:
     uchar shadowVal;
 };
 
+#ifdef HAVE_OPENCL
+
 bool BackgroundSubtractorMOG2Impl::ocl_apply(InputArray _image, OutputArray _fgmask, double learningRate)
 {
     ++nframes;
@@ -791,6 +793,27 @@ bool BackgroundSubtractorMOG2Impl::ocl_apply(InputArray _image, OutputArray _fgm
     return true;
 }
 
+bool BackgroundSubtractorMOG2Impl::ocl_getBackgroundImage(OutputArray _backgroundImage) const
+{
+    CV_Assert(frameType == CV_8UC1 || frameType == CV_8UC3);
+
+    _backgroundImage.create(frameSize, frameType);
+    UMat dst = _backgroundImage.getUMat();
+
+    int idxArg = 0;
+    idxArg = kernel_getBg.set(idxArg, ocl::KernelArg::ReadOnly(u_bgmodelUsedModes));
+    idxArg = kernel_getBg.set(idxArg, ocl::KernelArg::ReadOnlyNoSize(u_weight));
+    idxArg = kernel_getBg.set(idxArg, ocl::KernelArg::ReadOnlyNoSize(u_mean));
+    idxArg = kernel_getBg.set(idxArg, ocl::KernelArg::WriteOnlyNoSize(dst));
+    idxArg = kernel_getBg.set(idxArg, backgroundRatio);
+
+    size_t globalsize[2] = {u_bgmodelUsedModes.cols, u_bgmodelUsedModes.rows};
+
+    return kernel_getBg.run(2, globalsize, NULL, false);
+}
+
+#endif
+
 void BackgroundSubtractorMOG2Impl::apply(InputArray _image, OutputArray _fgmask, double learningRate)
 {
     bool needToInitialize = nframes == 0 || learningRate >= 1 || _image.size() != frameSize || _image.type() != frameType;
@@ -800,12 +823,11 @@ void BackgroundSubtractorMOG2Impl::apply(InputArray _image, OutputArray _fgmask,
 
     if (opencl_ON)
     {
-        if (ocl_apply(_image, _fgmask, learningRate))
-            return;
-        else
-            initialize(_image.size(), _image.type());
+        CV_OCL_RUN(opencl_ON, ocl_apply(_image, _fgmask, learningRate))
+
+        opencl_ON = false;
+        initialize(_image.size(), _image.type());
     }
-    opencl_ON = false;
 
     Mat image = _image.getMat();
     _fgmask.create( image.size(), CV_8U );
@@ -827,31 +849,11 @@ void BackgroundSubtractorMOG2Impl::apply(InputArray _image, OutputArray _fgmask,
                               image.total()/(double)(1 << 16));
 }
 
-bool BackgroundSubtractorMOG2Impl::ocl_getBackgroundImage(OutputArray _backgroundImage) const
-{
-    CV_Assert(frameType == CV_8UC1 || frameType == CV_8UC3);
-
-    _backgroundImage.create(frameSize, frameType);
-    UMat dst = _backgroundImage.getUMat();
-
-    int idxArg = 0;
-    idxArg = kernel_getBg.set(idxArg, ocl::KernelArg::ReadOnly(u_bgmodelUsedModes));
-    idxArg = kernel_getBg.set(idxArg, ocl::KernelArg::ReadOnlyNoSize(u_weight));
-    idxArg = kernel_getBg.set(idxArg, ocl::KernelArg::ReadOnlyNoSize(u_mean));
-    idxArg = kernel_getBg.set(idxArg, ocl::KernelArg::WriteOnlyNoSize(dst));
-    idxArg = kernel_getBg.set(idxArg, backgroundRatio);
-
-    size_t globalsize[2] = {u_bgmodelUsedModes.cols, u_bgmodelUsedModes.rows};
-
-    return kernel_getBg.run(2, globalsize, NULL, false);
-}
-
 void BackgroundSubtractorMOG2Impl::getBackgroundImage(OutputArray backgroundImage) const
 {
     if (opencl_ON)
     {
-        if (ocl_getBackgroundImage(backgroundImage))
-            return;
+        CV_OCL_RUN(opencl_ON, ocl_getBackgroundImage(backgroundImage))
 
         opencl_ON = false;
         return;