Skip to content

Commit 5f01d59

Browse files
Median filter sample.
1 parent 491e9f5 commit 5f01d59

File tree

10 files changed

+89
-20
lines changed

10 files changed

+89
-20
lines changed

include/auxiliaries.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
#pragma once
22

3-
int parseArguments(int argc, char **argv);
3+
#include <string>
4+
5+
int parseArguments(int argc, char **argv, std::string &fileName);

include/img_proc.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
using namespace cv;
88

9-
int getFrame(Mat& src);
9+
int getFrame(const std::string &fileName, Mat& src);
1010

1111
int processFrame(const Mat& src, Mat& dst);
1212

13-
int show(const Mat& src, const Mat& dst);
13+
int show(const std::string &caption, const Mat& src, const Mat& dst);

samples/sample_template.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,30 @@ using namespace cv;
99

1010
int main(int argc, char **argv)
1111
{
12-
if (parseArguments(argc, argv) != 0)
12+
const std::string caption = "Median filter";
13+
std::string fileName;
14+
if (parseArguments(argc, argv, fileName) != 0)
1315
{
14-
cout << "Incorrect input parameters!" << endl;
16+
cout << "practice2 <img_name>" << endl;
17+
cout << "<img_name> - image name for filtering" << endl;
1518
return 1;
1619
}
1720

1821
Mat src, dst;
1922

20-
if (getFrame(src) != 0)
23+
if (getFrame(fileName, src) != 0)
2124
{
2225
cout << "Error: \'src\' image is null or empty!" << endl;
2326
return 2;
2427
}
2528

26-
processFrame(src, dst);
29+
if (processFrame(src, dst) != 0)
30+
{
31+
cout << "Error: Filtering failed!" << endl;
32+
return 3;
33+
}
2734

28-
show(src, dst);
35+
show(caption, src, dst);
2936

3037
return 0;
3138
}

src/auxiliaries.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
#include "auxiliaries.hpp"
22

3-
int parseArguments(int argc, char **argv)
3+
int parseArguments(int argc, char **argv, std::string &fileName)
44
{
5+
if (argc < 2)
6+
{
7+
return 1;
8+
}
9+
fileName = std::string(argv[1]);
510
return 0;
611
}

src/img_proc.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,38 @@
11
#include "img_proc.hpp"
22

3-
int getFrame(Mat& src)
3+
int getFrame(const std::string &fileName, Mat& src)
44
{
5+
src = imread(fileName);
6+
if (src.empty())
7+
{
8+
return 1;
9+
}
510
return 0;
611
}
712

813
int processFrame(const Mat& src, Mat& dst)
914
{
15+
const int kSize = 11;
16+
medianBlur(src, dst, kSize);
1017
return 0;
1118
}
1219

13-
int show(const Mat& src, const Mat& dst)
20+
int show(const std::string &caption, const Mat& src, const Mat& dst)
1421
{
22+
if (src.rows != dst.rows || src.cols != dst.cols)
23+
{
24+
return 1;
25+
}
26+
27+
Mat display(src.rows, src.cols + dst.cols, src.type());
28+
Mat srcRoi = display(Rect(0, 0, src.cols, src.rows));
29+
src.copyTo(srcRoi);
30+
Mat dstRoi = display(Rect(src.cols, 0, dst.cols, dst.rows));
31+
dst.copyTo(dstRoi);
32+
33+
namedWindow(caption);
34+
imshow(caption, display);
35+
waitKey();
36+
1537
return 0;
1638
}

test/CMakeLists.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/gtest")
88
ADD_EXECUTABLE(${target} ${srcs} ${hdrs})
99
TARGET_LINK_LIBRARIES(${target} gtest ${PRACTICE2_LIBRARY})
1010

11-
#add_custom_command(
12-
# TARGET ${PRACTICE2_TESTS}
13-
# POST_BUILD
14-
# COMMAND ln -fns "${CMAKE_SOURCE_DIR}/testdata" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/testdata"
15-
# COMMENT "Adding a symbolic link to testdata"
16-
#)
11+
add_custom_command(
12+
TARGET ${PRACTICE2_TESTS}
13+
POST_BUILD
14+
COMMAND ln -fns "${CMAKE_SOURCE_DIR}/testdata" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/testdata"
15+
COMMENT "Adding a symbolic link to testdata"
16+
)

test/aux_test.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
#include <gtest/gtest.h>
22
#include "auxiliaries.hpp"
33

4-
TEST(practice2, parseArguments)
4+
TEST(practice2, parse_empty_arguments)
55
{
66
int argc = 0;
77
char **argv = 0;
8-
int res = parseArguments(argc, argv);
8+
std::string fileName;
9+
int res = parseArguments(argc, argv, fileName);
10+
11+
EXPECT_EQ(1, res);
12+
}
13+
14+
TEST(practice2, parse_incorrect_arguments)
15+
{
16+
int argc = 2;
17+
char *argv[] = { "", "image.jpg" };
18+
std::string fileName;
19+
int res = parseArguments(argc, argv, fileName);
920

1021
EXPECT_EQ(0, res);
11-
}
22+
}

test/img_proc_test.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include <gtest/gtest.h>
2+
#include "img_proc.hpp"
3+
4+
TEST(practice2, median_filter_test)
5+
{
6+
std::string input = "./testdata/image.jpg";
7+
std::string expOutput = "./testdata/image_median_1.jpg";
8+
9+
Mat src, expDst, dst;
10+
getFrame(input, src);
11+
getFrame(expOutput, expDst);
12+
if (expDst.empty())
13+
{
14+
FAIL() << "Can't read" + expOutput + " image";
15+
}
16+
17+
Mat diff = abs(expDst - dst);
18+
Mat mask = diff.reshape(1) > 1;
19+
20+
EXPECT_EQ(0, countNonZero(mask));
21+
22+
}

testdata/image.jpg

76.9 KB
Loading

testdata/image_median_11.jpg

31.2 KB
Loading

0 commit comments

Comments
 (0)