//////////////////////////// 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)
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();
uchar shadowVal;
};
+#ifdef HAVE_OPENCL
+
bool BackgroundSubtractorMOG2Impl::ocl_apply(InputArray _image, OutputArray _fgmask, double learningRate)
{
++nframes;
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;
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 );
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;