Skip to content

Commit be01ea7

Browse files
committed
video(perf): add Mog2/KNN tests, fixed bug in prepareData()
prepareData() bug feeds the same image (the latest) OCL perf test doesn't pass accuracy(!) check now, so this check is disabled.
1 parent 16821b8 commit be01ea7

File tree

4 files changed

+244
-30
lines changed

4 files changed

+244
-30
lines changed

modules/video/perf/opencl/perf_bgfg_mog2.cpp

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
// This file is part of OpenCV project.
2+
// It is subject to the license terms in the LICENSE file found in the top-level directory
3+
// of this distribution and at http://opencv.org/license.html.
4+
15
#include "../perf_precomp.hpp"
26
#include "opencv2/ts/ocl_perf.hpp"
37

48
#ifdef HAVE_OPENCL
59
#ifdef HAVE_VIDEO_INPUT
10+
#include "../perf_bgfg_utils.hpp"
611

712
namespace cvtest {
813
namespace ocl {
@@ -13,31 +18,7 @@ typedef tuple<string, int> VideoMOG2ParamType;
1318
typedef TestBaseWithParam<VideoMOG2ParamType> MOG2_Apply;
1419
typedef TestBaseWithParam<VideoMOG2ParamType> MOG2_GetBackgroundImage;
1520

16-
static void cvtFrameFmt(vector<Mat>& input, vector<Mat>& output)
17-
{
18-
for(int i = 0; i< (int)(input.size()); i++)
19-
{
20-
cvtColor(input[i], output[i], COLOR_RGB2GRAY);
21-
}
22-
}
23-
24-
static void prepareData(VideoCapture& cap, int cn, vector<Mat>& frame_buffer)
25-
{
26-
cv::Mat frame;
27-
std::vector<Mat> frame_buffer_init;
28-
int nFrame = (int)frame_buffer.size();
29-
for(int i = 0; i < nFrame; i++)
30-
{
31-
cap >> frame;
32-
ASSERT_FALSE(frame.empty());
33-
frame_buffer_init.push_back(frame);
34-
}
35-
36-
if(cn == 1)
37-
cvtFrameFmt(frame_buffer_init, frame_buffer);
38-
else
39-
frame_buffer = frame_buffer_init;
40-
}
21+
using namespace opencv_test;
4122

4223
OCL_PERF_TEST_P(MOG2_Apply, Mog2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1,3)))
4324
{
@@ -66,23 +47,26 @@ OCL_PERF_TEST_P(MOG2_Apply, Mog2, Combine(Values("gpu/video/768x576.avi", "gpu/v
6647
mog2->apply(frame_buffer[i], u_foreground);
6748
}
6849
}
69-
SANITY_CHECK(u_foreground);
50+
SANITY_CHECK_NOTHING();
7051
}
7152

72-
OCL_PERF_TEST_P(MOG2_GetBackgroundImage, Mog2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(3)))
53+
OCL_PERF_TEST_P(MOG2_GetBackgroundImage, Mog2, Values(
54+
std::make_pair<string, int>("gpu/video/768x576.avi", 5),
55+
std::make_pair<string, int>("gpu/video/1920x1080.avi", 5)))
7356
{
7457
VideoMOG2ParamType params = GetParam();
7558

7659
const string inputFile = getDataPath(get<0>(params));
7760

78-
const int cn = get<1>(params);
79-
int nFrame = 5;
61+
const int cn = 3;
62+
const int skipFrames = get<1>(params);
63+
int nFrame = 10;
8064

8165
vector<Mat> frame_buffer(nFrame);
8266

8367
cv::VideoCapture cap(inputFile);
8468
ASSERT_TRUE(cap.isOpened());
85-
prepareData(cap, cn, frame_buffer);
69+
prepareData(cap, cn, frame_buffer, skipFrames);
8670

8771
UMat u_foreground, u_background;
8872

@@ -98,6 +82,10 @@ OCL_PERF_TEST_P(MOG2_GetBackgroundImage, Mog2, Combine(Values("gpu/video/768x576
9882
}
9983
mog2->getBackgroundImage(u_background);
10084
}
85+
#ifdef DEBUG_BGFG
86+
imwrite(format("fg_%d_%d_mog2_ocl.png", frame_buffer[0].rows, cn), u_foreground.getMat(ACCESS_READ));
87+
imwrite(format("bg_%d_%d_mog2_ocl.png", frame_buffer[0].rows, cn), u_background.getMat(ACCESS_READ));
88+
#endif
10189
SANITY_CHECK_NOTHING();
10290
}
10391

modules/video/perf/perf_bgfg_knn.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// This file is part of OpenCV project.
2+
// It is subject to the license terms in the LICENSE file found in the top-level directory
3+
// of this distribution and at http://opencv.org/license.html.
4+
5+
#include "perf_precomp.hpp"
6+
7+
#ifdef HAVE_VIDEO_INPUT
8+
#include "perf_bgfg_utils.hpp"
9+
10+
namespace opencv_test { namespace {
11+
12+
//////////////////////////// KNN//////////////////////////
13+
14+
typedef tuple<std::string, int> VideoKNNParamType;
15+
typedef TestBaseWithParam<VideoKNNParamType> KNN_Apply;
16+
typedef TestBaseWithParam<VideoKNNParamType> KNN_GetBackgroundImage;
17+
18+
PERF_TEST_P(KNN_Apply, KNN, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1,3)))
19+
{
20+
VideoKNNParamType params = GetParam();
21+
22+
const string inputFile = getDataPath(get<0>(params));
23+
24+
const int cn = get<1>(params);
25+
int nFrame = 5;
26+
27+
vector<Mat> frame_buffer(nFrame);
28+
29+
cv::VideoCapture cap(inputFile);
30+
ASSERT_TRUE(cap.isOpened());
31+
prepareData(cap, cn, frame_buffer);
32+
33+
Mat foreground;
34+
35+
TEST_CYCLE()
36+
{
37+
Ptr<cv::BackgroundSubtractorKNN> knn = createBackgroundSubtractorKNN();
38+
knn->setDetectShadows(false);
39+
foreground.release();
40+
for (int i = 0; i < nFrame; i++)
41+
{
42+
knn->apply(frame_buffer[i], foreground);
43+
}
44+
}
45+
SANITY_CHECK_NOTHING();
46+
}
47+
48+
PERF_TEST_P(KNN_GetBackgroundImage, KNN, Values(
49+
std::make_pair<string, int>("gpu/video/768x576.avi", 5),
50+
std::make_pair<string, int>("gpu/video/1920x1080.avi", 5)))
51+
{
52+
VideoKNNParamType params = GetParam();
53+
54+
const string inputFile = getDataPath(get<0>(params));
55+
56+
const int cn = 3;
57+
const int skipFrames = get<1>(params);
58+
int nFrame = 10;
59+
60+
vector<Mat> frame_buffer(nFrame);
61+
62+
cv::VideoCapture cap(inputFile);
63+
ASSERT_TRUE(cap.isOpened());
64+
prepareData(cap, cn, frame_buffer, skipFrames);
65+
66+
Mat foreground, background;
67+
68+
TEST_CYCLE()
69+
{
70+
Ptr<cv::BackgroundSubtractorKNN> knn = createBackgroundSubtractorKNN();
71+
knn->setDetectShadows(false);
72+
foreground.release();
73+
background.release();
74+
for (int i = 0; i < nFrame; i++)
75+
{
76+
knn->apply(frame_buffer[i], foreground);
77+
}
78+
knn->getBackgroundImage(background);
79+
}
80+
#ifdef DEBUG_BGFG
81+
imwrite(format("fg_%d_%d_knn.png", frame_buffer[0].rows, cn), foreground);
82+
imwrite(format("bg_%d_%d_knn.png", frame_buffer[0].rows, cn), background);
83+
#endif
84+
SANITY_CHECK_NOTHING();
85+
}
86+
87+
}}// namespace
88+
89+
#endif

modules/video/perf/perf_bgfg_mog2.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// This file is part of OpenCV project.
2+
// It is subject to the license terms in the LICENSE file found in the top-level directory
3+
// of this distribution and at http://opencv.org/license.html.
4+
5+
#include "perf_precomp.hpp"
6+
7+
#ifdef HAVE_VIDEO_INPUT
8+
#include "perf_bgfg_utils.hpp"
9+
10+
namespace opencv_test { namespace {
11+
12+
//////////////////////////// Mog2//////////////////////////
13+
14+
typedef tuple<std::string, int> VideoMOG2ParamType;
15+
typedef TestBaseWithParam<VideoMOG2ParamType> MOG2_Apply;
16+
typedef TestBaseWithParam<VideoMOG2ParamType> MOG2_GetBackgroundImage;
17+
18+
PERF_TEST_P(MOG2_Apply, Mog2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1,3)))
19+
{
20+
VideoMOG2ParamType params = GetParam();
21+
22+
const string inputFile = getDataPath(get<0>(params));
23+
24+
const int cn = get<1>(params);
25+
int nFrame = 5;
26+
27+
vector<Mat> frame_buffer(nFrame);
28+
29+
cv::VideoCapture cap(inputFile);
30+
ASSERT_TRUE(cap.isOpened());
31+
prepareData(cap, cn, frame_buffer);
32+
33+
Mat foreground;
34+
35+
TEST_CYCLE()
36+
{
37+
Ptr<cv::BackgroundSubtractorMOG2> mog2 = createBackgroundSubtractorMOG2();
38+
mog2->setDetectShadows(false);
39+
foreground.release();
40+
for (int i = 0; i < nFrame; i++)
41+
{
42+
mog2->apply(frame_buffer[i], foreground);
43+
}
44+
}
45+
SANITY_CHECK_NOTHING();
46+
}
47+
48+
PERF_TEST_P(MOG2_GetBackgroundImage, Mog2, Values(
49+
std::make_pair<string, int>("gpu/video/768x576.avi", 5),
50+
std::make_pair<string, int>("gpu/video/1920x1080.avi", 5)))
51+
{
52+
VideoMOG2ParamType params = GetParam();
53+
54+
const string inputFile = getDataPath(get<0>(params));
55+
56+
const int cn = 3;
57+
const int skipFrames = get<1>(params);
58+
int nFrame = 10;
59+
60+
vector<Mat> frame_buffer(nFrame);
61+
62+
cv::VideoCapture cap(inputFile);
63+
ASSERT_TRUE(cap.isOpened());
64+
prepareData(cap, cn, frame_buffer, skipFrames);
65+
66+
Mat foreground, background;
67+
68+
TEST_CYCLE()
69+
{
70+
Ptr<cv::BackgroundSubtractorMOG2> mog2 = createBackgroundSubtractorMOG2();
71+
mog2->setDetectShadows(false);
72+
foreground.release();
73+
background.release();
74+
for (int i = 0; i < nFrame; i++)
75+
{
76+
mog2->apply(frame_buffer[i], foreground);
77+
}
78+
mog2->getBackgroundImage(background);
79+
}
80+
#ifdef DEBUG_BGFG
81+
imwrite(format("fg_%d_%d_mog2.png", frame_buffer[0].rows, cn), foreground);
82+
imwrite(format("bg_%d_%d_mog2.png", frame_buffer[0].rows, cn), background);
83+
#endif
84+
SANITY_CHECK_NOTHING();
85+
}
86+
87+
}}// namespace
88+
89+
#endif
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// This file is part of OpenCV project.
2+
// It is subject to the license terms in the LICENSE file found in the top-level directory
3+
// of this distribution and at http://opencv.org/license.html.
4+
5+
namespace opencv_test {
6+
7+
//#define DEBUG_BGFG
8+
9+
using namespace testing;
10+
using namespace cvtest;
11+
using namespace perf;
12+
13+
namespace {
14+
15+
using namespace cv;
16+
17+
static void cvtFrameFmt(std::vector<Mat>& input, std::vector<Mat>& output)
18+
{
19+
for(int i = 0; i< (int)(input.size()); i++)
20+
{
21+
cvtColor(input[i], output[i], COLOR_RGB2GRAY);
22+
}
23+
}
24+
25+
static void prepareData(VideoCapture& cap, int cn, std::vector<Mat>& frame_buffer, int skipFrames = 0)
26+
{
27+
std::vector<Mat> frame_buffer_init;
28+
int nFrame = (int)frame_buffer.size();
29+
for (int i = 0; i < skipFrames; i++)
30+
{
31+
cv::Mat frame;
32+
cap >> frame;
33+
}
34+
for (int i = 0; i < nFrame; i++)
35+
{
36+
cv::Mat frame;
37+
cap >> frame;
38+
ASSERT_FALSE(frame.empty());
39+
frame_buffer_init.push_back(frame);
40+
}
41+
42+
if (cn == 1)
43+
cvtFrameFmt(frame_buffer_init, frame_buffer);
44+
else
45+
frame_buffer.swap(frame_buffer_init);
46+
}
47+
48+
}}

0 commit comments

Comments
 (0)