Skip to content

Commit 5d2d8cd

Browse files
committed
chore: add more opencv benches
1 parent 21abd36 commit 5d2d8cd

File tree

6 files changed

+153
-2
lines changed

6 files changed

+153
-2
lines changed

CMakeLists.txt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,16 @@ cmake_minimum_required(VERSION 3.12)
22
project( opencv-benchmarks VERSION 0.0.0 LANGUAGES CXX)
33
find_package( OpenCV REQUIRED )
44
include_directories( ${OpenCV_INCLUDE_DIRS} )
5-
add_executable( cv-bench src/main.cpp src/classifier.cpp)
5+
add_executable(
6+
cv-bench
7+
src/main.cpp
8+
src/classifier.cpp
9+
src/color_conversion.cpp
10+
src/edge_detection.cpp
11+
src/filter.cpp
12+
src/read_image.cpp
13+
src/transform.cpp
14+
)
615
target_link_libraries( cv-bench ${OpenCV_LIBS} )
716

817

@@ -18,4 +27,3 @@ FetchContent_Declare(
1827
)
1928
FetchContent_MakeAvailable(google_benchmark)
2029
target_link_libraries(cv-bench benchmark::benchmark)
21-

src/color_conversion.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include <benchmark/benchmark.h>
2+
#include <opencv2/opencv.hpp>
3+
4+
static void BM_ColorConversion(benchmark::State& state) {
5+
static cv::Mat img = cv::imread("assets/dog_bike_car.jpg");
6+
if (img.empty())
7+
throw std::runtime_error("Cannot open image");
8+
9+
for (auto _ : state) {
10+
cv::Mat gray;
11+
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
12+
benchmark::DoNotOptimize(gray.data);
13+
}
14+
}
15+
BENCHMARK(BM_ColorConversion);

src/edge_detection.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include <benchmark/benchmark.h>
2+
#include <opencv2/opencv.hpp>
3+
4+
static void BM_Canny(benchmark::State& state) {
5+
static cv::Mat img = cv::imread("assets/dog_bike_car.jpg");
6+
if (img.empty())
7+
throw std::runtime_error("Cannot open image");
8+
9+
double low = state.range(0);
10+
double high = state.range(1);
11+
12+
for (auto _ : state) {
13+
cv::Mat edges;
14+
cv::Canny(img, edges, low, high);
15+
benchmark::DoNotOptimize(edges.data);
16+
}
17+
}
18+
19+
BENCHMARK(BM_Canny)->Args({50, 150})->Args({75, 175})->Args({100, 200});

src/filter.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include <benchmark/benchmark.h>
2+
#include <opencv2/opencv.hpp>
3+
4+
// Shared image for all filters in this file
5+
static cv::Mat GetImage() {
6+
static cv::Mat img = cv::imread("assets/dog_bike_car.jpg");
7+
if (img.empty())
8+
throw std::runtime_error("Cannot open image");
9+
return img;
10+
}
11+
12+
static void BM_GaussianBlur(benchmark::State& state) {
13+
cv::Mat img = GetImage();
14+
int kernel_size = state.range(0);
15+
16+
for (auto _ : state) {
17+
cv::Mat blurred;
18+
cv::GaussianBlur(img, blurred, {kernel_size, kernel_size}, 0);
19+
benchmark::DoNotOptimize(blurred.data);
20+
}
21+
}
22+
23+
static void BM_MedianBlur(benchmark::State& state) {
24+
cv::Mat img = GetImage();
25+
int kernel_size = state.range(0);
26+
27+
for (auto _ : state) {
28+
cv::Mat blurred;
29+
cv::medianBlur(img, blurred, kernel_size);
30+
benchmark::DoNotOptimize(blurred.data);
31+
}
32+
}
33+
34+
static void BM_Sobel(benchmark::State& state) {
35+
cv::Mat img = GetImage();
36+
int kernel_size = state.range(0);
37+
38+
for (auto _ : state) {
39+
cv::Mat grad;
40+
cv::Sobel(img, grad, CV_16S, 1, 0, kernel_size);
41+
benchmark::DoNotOptimize(grad.data);
42+
}
43+
}
44+
45+
// Register kernel sizes for all filters
46+
BENCHMARK(BM_GaussianBlur)
47+
->Arg(3)
48+
->Arg(5)
49+
->Arg(7)
50+
->Arg(9)
51+
->Arg(11)
52+
->Arg(13)
53+
->Arg(15);
54+
BENCHMARK(BM_MedianBlur)
55+
->Arg(3)
56+
->Arg(5)
57+
->Arg(7)
58+
->Arg(9)
59+
->Arg(11)
60+
->Arg(13)
61+
->Arg(15);
62+
BENCHMARK(BM_Sobel)->Arg(3)->Arg(5)->Arg(7)->Arg(9)->Arg(11)->Arg(13)->Arg(15);

src/read_image.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include <benchmark/benchmark.h>
2+
#include <opencv2/opencv.hpp>
3+
4+
static void BM_ReadImage(benchmark::State& state) {
5+
for (auto _ : state) {
6+
cv::Mat img = cv::imread("assets/dog_bike_car.jpg");
7+
benchmark::DoNotOptimize(img.data);
8+
benchmark::ClobberMemory();
9+
}
10+
}
11+
BENCHMARK(BM_ReadImage);

src/transform.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include <benchmark/benchmark.h>
2+
#include <opencv2/opencv.hpp>
3+
4+
static cv::Mat GetImage() {
5+
static cv::Mat img = cv::imread("assets/dog_bike_car.jpg");
6+
if (img.empty())
7+
throw std::runtime_error("Cannot open image");
8+
return img;
9+
}
10+
11+
static void BM_Rotate(benchmark::State& state) {
12+
cv::Mat img = GetImage();
13+
double angle = state.range(0);
14+
cv::Point2f center(img.cols / 2.0f, img.rows / 2.0f);
15+
cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
16+
17+
for (auto _ : state) {
18+
cv::Mat rotated;
19+
cv::warpAffine(img, rotated, rot_mat, img.size());
20+
benchmark::DoNotOptimize(rotated.data);
21+
}
22+
}
23+
24+
static void BM_Scale(benchmark::State& state) {
25+
cv::Mat img = GetImage();
26+
double scale = state.range(0) / 100.0;
27+
28+
for (auto _ : state) {
29+
cv::Mat resized;
30+
cv::resize(img, resized, {}, scale, scale);
31+
benchmark::DoNotOptimize(resized.data);
32+
}
33+
}
34+
35+
BENCHMARK(BM_Rotate)->Arg(30)->Arg(45)->Arg(90);
36+
BENCHMARK(BM_Scale)->Arg(50)->Arg(200);

0 commit comments

Comments
 (0)