From d8cec20e1b30d04474cf8f64e234c1af554d3769 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 11 Apr 2012 13:47:55 +0000 Subject: [PATCH] Added perf test for calcOpticalFlowPyrLK --- modules/video/perf/perf_main.cpp | 3 + modules/video/perf/perf_optflowpyrlk.cpp | 93 ++++++++++++++++++++++++ modules/video/perf/perf_precomp.cpp | 1 + modules/video/perf/perf_precomp.hpp | 13 ++++ 4 files changed, 110 insertions(+) create mode 100644 modules/video/perf/perf_main.cpp create mode 100644 modules/video/perf/perf_optflowpyrlk.cpp create mode 100644 modules/video/perf/perf_precomp.cpp create mode 100644 modules/video/perf/perf_precomp.hpp diff --git a/modules/video/perf/perf_main.cpp b/modules/video/perf/perf_main.cpp new file mode 100644 index 000000000..2aeb90804 --- /dev/null +++ b/modules/video/perf/perf_main.cpp @@ -0,0 +1,3 @@ +#include "perf_precomp.hpp" + +CV_PERF_TEST_MAIN(video) diff --git a/modules/video/perf/perf_optflowpyrlk.cpp b/modules/video/perf/perf_optflowpyrlk.cpp new file mode 100644 index 000000000..9633ef068 --- /dev/null +++ b/modules/video/perf/perf_optflowpyrlk.cpp @@ -0,0 +1,93 @@ +#include "perf_precomp.hpp" + +using namespace std; +using namespace cv; +using namespace perf; +using std::tr1::make_tuple; +using std::tr1::get; + +typedef tr1::tuple, int> Path_Idx_Cn_NPoints_WSize_t; +typedef TestBaseWithParam Path_Idx_Cn_NPoints_WSize; + +void FormTrackingPointsArray(vector& points, int width, int height, int nPointsX, int nPointsY) +{ + int stepX = width / nPointsX; + int stepY = height / nPointsY; + if (stepX < 1 || stepY < 1) FAIL() << "Specified points number is too big"; + + points.clear(); + points.reserve(nPointsX * nPointsY); + + for( int x = stepX / 2; x < width; x += stepX ) + { + for( int y = stepY / 2; y < height; y += stepY ) + { + Point2f pt(x,y); + points.push_back(pt); + } + } +} + +PERF_TEST_P(Path_Idx_Cn_NPoints_WSize, OpticalFlowPyrLK, testing::Combine( + testing::Values("cv/optflow/frames/VGA_%02d.png", "cv/optflow/frames/720p_%02d.jpg"), + testing::Range(0, 3), + testing::Values(1, 3, 4), + testing::Values(make_tuple(9, 9), make_tuple(15, 15)), + testing::Values(11, 21, 25) + ) + ) +{ + string filename1 = getDataPath(cv::format(get<0>(GetParam()).c_str(), get<1>(GetParam()))); + string filename2 = getDataPath(cv::format(get<0>(GetParam()).c_str(), get<1>(GetParam()) + 1)); + Mat img1 = imread(filename1); + Mat img2 = imread(filename2); + if (img1.empty()) FAIL() << "Unable to load source image " << filename1; + if (img2.empty()) FAIL() << "Unable to load source image " << filename2; + + int cn = get<2>(GetParam()); + int nPointsX = min(get<0>(get<3>(GetParam())), img1.cols); + int nPointsY = min(get<1>(get<3>(GetParam())), img1.rows); + int winSize = get<4>(GetParam()); + int maxLevel = 2; + TermCriteria criteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 5, 0.01); + int flags = 0; + double minEigThreshold = 1e-4; + + Mat frame1, frame2; + switch(cn) + { + case 1: + cvtColor(img1, frame1, COLOR_BGR2GRAY, cn); + cvtColor(img2, frame2, COLOR_BGR2GRAY, cn); + break; + case 3: + frame1 = img1; + frame2 = img2; + break; + case 4: + cvtColor(img1, frame1, COLOR_BGR2BGRA, cn); + cvtColor(img2, frame2, COLOR_BGR2BGRA, cn); + break; + default: + FAIL() << "Unexpected number of channels: " << cn; + } + + vector inPoints; + vector outPoints; + vector status; + vector err; + + FormTrackingPointsArray(inPoints, frame1.cols, frame1.rows, nPointsX, nPointsY); + outPoints.resize(inPoints.size()); + status.resize(inPoints.size()); + err.resize(inPoints.size()); + + declare.in(frame1, frame2, inPoints).out(outPoints); + + TEST_CYCLE_N(30) + { + calcOpticalFlowPyrLK(frame1, frame2, inPoints, outPoints, status, err, + Size(winSize, winSize), maxLevel, criteria, + flags, minEigThreshold); + } +} diff --git a/modules/video/perf/perf_precomp.cpp b/modules/video/perf/perf_precomp.cpp new file mode 100644 index 000000000..8552ac3d4 --- /dev/null +++ b/modules/video/perf/perf_precomp.cpp @@ -0,0 +1 @@ +#include "perf_precomp.hpp" diff --git a/modules/video/perf/perf_precomp.hpp b/modules/video/perf/perf_precomp.hpp new file mode 100644 index 000000000..2dd31c23a --- /dev/null +++ b/modules/video/perf/perf_precomp.hpp @@ -0,0 +1,13 @@ +#ifndef __OPENCV_VIDEO_PRECOMP_HPP__ +#define __OPENCV_VIDEO_PRECOMP_HPP__ + +#include +#include +#include +#include "opencv2/ts/ts.hpp" + +#if GTEST_CREATE_SHARED_LIBRARY +#error no modules except ts should have GTEST_CREATE_SHARED_LIBRARY defined +#endif + +#endif