From 193bf2f51b56f0eb3c197665e6ddf05d7e5b8c64 Mon Sep 17 00:00:00 2001 From: meshtag Date: Mon, 4 Oct 2021 18:02:31 +0530 Subject: [PATCH 1/3] Add test generator file --- CMakeLists.txt | 1 + Tests/CMakeLists.txt | 5 +++ Tests/TestImageGenerator.cpp | 75 ++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 Tests/CMakeLists.txt create mode 100644 Tests/TestImageGenerator.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 21d677ed..b2bd4d12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,3 +83,4 @@ include_directories(${OpenCV_INCLUDE_DIRS}) add_subdirectory(lib) add_subdirectory(benchmarks) +add_subdirectory(Tests) diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt new file mode 100644 index 00000000..eb87b5d7 --- /dev/null +++ b/Tests/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(Tests TestImageGenerator.cpp) + +target_link_libraries(Tests + ${OpenCV_LIBS} + ) diff --git a/Tests/TestImageGenerator.cpp b/Tests/TestImageGenerator.cpp new file mode 100644 index 00000000..bb4b8077 --- /dev/null +++ b/Tests/TestImageGenerator.cpp @@ -0,0 +1,75 @@ +#include +#include +#include + +void FillImage(cv::Mat img) +{ + for (std::ptrdiff_t row = 0; row < img.rows; ++row) + for (std::ptrdiff_t col = 0; col < img.cols; ++col) + img.at(col, row) = row * img.rows + col; +} + +enum class boundaryOption +{ + BORDER_CONSTANT, + BORDER_REPLICATE, + BORDER_REFLECT, + BORDER_REFLECT101 +}; + +void generateExpectedImage(cv::Mat img, cv::Mat expectedImg, int ddepth, cv::Mat kernel, + cv::Point anchor, double delta, boundaryOption option, std::string name) +{ + if (option == boundaryOption::BORDER_CONSTANT) + cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, cv::BORDER_CONSTANT); + else if (option == boundaryOption::BORDER_REPLICATE) + cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, cv::BORDER_REPLICATE); + else if (option == boundaryOption::BORDER_REFLECT) + cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, cv::BORDER_REFLECT); + else if (option == boundaryOption::BORDER_REFLECT101) + cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, cv::BORDER_REFLECT101); + + cv::imwrite(name, expectedImg); +} + +int main(int argc, char **argv) +{ + if (argc != 4) + { + std::cout << "Invalid CLI arguments\nUsage : ImageHeight ImageWidth DestinationFolder\n"; + } + + cv::Mat origImg, expImg; + origImg.create(atoi(argv[1]), atoi(argv[2]), CV_8UC1); + expImg.create(atoi(argv[1]), atoi(argv[2]), CV_8UC1); + + FillImage(origImg); + + double delta = 0; + int ddepth = -1; + cv::Point anchor; + cv::Mat kernel = cv::Mat::ones(3, 3, CV_32F); + + for (std::ptrdiff_t i = 0; i < kernel.rows; ++i) + { + for (std::ptrdiff_t j = 0; j < kernel.cols; ++j) + { + // Put all expected images inside a folder and then test them from there. + std::string partialName; + partialName = std::string(argv[3]) + "/ExpectedImage_" + std::to_string(i) + "_" + std::to_string(j) + "_"; + anchor = cv::Point(i, j); + + generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, + boundaryOption::BORDER_CONSTANT, partialName + "BORDER_CONSTANT.png"); + + generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, + boundaryOption::BORDER_REPLICATE, partialName + "BORDER_RELPICATE.png"); + + generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, + boundaryOption::BORDER_REFLECT, partialName + "BORDER_REFLECT.png"); + + generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, + boundaryOption::BORDER_REFLECT101, partialName + "BORDER_REFLECT101.png"); + } + } +} From b658e903761e1891081af652cfa47e27600ec8d8 Mon Sep 17 00:00:00 2001 From: meshtag Date: Mon, 4 Oct 2021 18:06:42 +0530 Subject: [PATCH 2/3] Apply clang formatting --- Tests/TestImageGenerator.cpp | 64 +++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/Tests/TestImageGenerator.cpp b/Tests/TestImageGenerator.cpp index bb4b8077..2c3ec399 100644 --- a/Tests/TestImageGenerator.cpp +++ b/Tests/TestImageGenerator.cpp @@ -1,42 +1,43 @@ -#include #include +#include #include -void FillImage(cv::Mat img) -{ +void FillImage(cv::Mat img) { for (std::ptrdiff_t row = 0; row < img.rows; ++row) for (std::ptrdiff_t col = 0; col < img.cols; ++col) img.at(col, row) = row * img.rows + col; } -enum class boundaryOption -{ +enum class boundaryOption { BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT, BORDER_REFLECT101 }; -void generateExpectedImage(cv::Mat img, cv::Mat expectedImg, int ddepth, cv::Mat kernel, - cv::Point anchor, double delta, boundaryOption option, std::string name) -{ +void generateExpectedImage(cv::Mat img, cv::Mat expectedImg, int ddepth, + cv::Mat kernel, cv::Point anchor, double delta, + boundaryOption option, std::string name) { if (option == boundaryOption::BORDER_CONSTANT) - cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, cv::BORDER_CONSTANT); + cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, + cv::BORDER_CONSTANT); else if (option == boundaryOption::BORDER_REPLICATE) - cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, cv::BORDER_REPLICATE); + cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, + cv::BORDER_REPLICATE); else if (option == boundaryOption::BORDER_REFLECT) - cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, cv::BORDER_REFLECT); + cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, + cv::BORDER_REFLECT); else if (option == boundaryOption::BORDER_REFLECT101) - cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, cv::BORDER_REFLECT101); + cv::filter2D(img, expectedImg, ddepth, kernel, anchor, delta, + cv::BORDER_REFLECT101); cv::imwrite(name, expectedImg); } -int main(int argc, char **argv) -{ - if (argc != 4) - { - std::cout << "Invalid CLI arguments\nUsage : ImageHeight ImageWidth DestinationFolder\n"; +int main(int argc, char **argv) { + if (argc != 4) { + std::cout << "Invalid CLI arguments\nUsage : ImageHeight ImageWidth " + "DestinationFolder\n"; } cv::Mat origImg, expImg; @@ -50,26 +51,29 @@ int main(int argc, char **argv) cv::Point anchor; cv::Mat kernel = cv::Mat::ones(3, 3, CV_32F); - for (std::ptrdiff_t i = 0; i < kernel.rows; ++i) - { - for (std::ptrdiff_t j = 0; j < kernel.cols; ++j) - { + for (std::ptrdiff_t i = 0; i < kernel.rows; ++i) { + for (std::ptrdiff_t j = 0; j < kernel.cols; ++j) { // Put all expected images inside a folder and then test them from there. std::string partialName; - partialName = std::string(argv[3]) + "/ExpectedImage_" + std::to_string(i) + "_" + std::to_string(j) + "_"; + partialName = std::string(argv[3]) + "/ExpectedImage_" + + std::to_string(i) + "_" + std::to_string(j) + "_"; anchor = cv::Point(i, j); - generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, - boundaryOption::BORDER_CONSTANT, partialName + "BORDER_CONSTANT.png"); + generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, + boundaryOption::BORDER_CONSTANT, + partialName + "BORDER_CONSTANT.png"); - generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, - boundaryOption::BORDER_REPLICATE, partialName + "BORDER_RELPICATE.png"); + generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, + boundaryOption::BORDER_REPLICATE, + partialName + "BORDER_RELPICATE.png"); - generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, - boundaryOption::BORDER_REFLECT, partialName + "BORDER_REFLECT.png"); + generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, + boundaryOption::BORDER_REFLECT, + partialName + "BORDER_REFLECT.png"); - generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, - boundaryOption::BORDER_REFLECT101, partialName + "BORDER_REFLECT101.png"); + generateExpectedImage(origImg, expImg, ddepth, kernel, anchor, delta, + boundaryOption::BORDER_REFLECT101, + partialName + "BORDER_REFLECT101.png"); } } } From 4ba038eb0f2cdc7bf317b7012adb9c321ebbc8db Mon Sep 17 00:00:00 2001 From: meshtag Date: Mon, 4 Oct 2021 18:21:31 +0530 Subject: [PATCH 3/3] Change directory structure --- README.md | 10 ++++++++++ Tests/CMakeLists.txt | 8 +++----- Tests/ImageProcessing/CMakeLists.txt | 5 +++++ Tests/{ => ImageProcessing}/TestImageGenerator.cpp | 0 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Tests/ImageProcessing/CMakeLists.txt rename Tests/{ => ImageProcessing}/TestImageGenerator.cpp (100%) diff --git a/README.md b/README.md index 3ee98c20..b7fd9507 100644 --- a/README.md +++ b/README.md @@ -34,4 +34,14 @@ $ ninja image-processing-benchmark $ cd bin && ./image-processing-benchmark ``` +Run image processing tests: + +``` +$ cd buddy-benchmark +$ mkdir build && cd build +$ cmake -G Ninja .. -DIMAGE_PROCESSING_TESTS=ON +$ ninja Tests +$ cd bin && mkdir TestImages && ./Tests 7 7 TestImages +``` + Note : The convolution implementation in buddy mlir is not feature complete at the moment and it may produce output which differs to some extent from the frameworks used in comparison. diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index eb87b5d7..5f4840e9 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1,5 +1,3 @@ -add_executable(Tests TestImageGenerator.cpp) - -target_link_libraries(Tests - ${OpenCV_LIBS} - ) +if(IMAGE_PROCESSING_TESTS) + add_subdirectory(ImageProcessing) +endif() diff --git a/Tests/ImageProcessing/CMakeLists.txt b/Tests/ImageProcessing/CMakeLists.txt new file mode 100644 index 00000000..eb87b5d7 --- /dev/null +++ b/Tests/ImageProcessing/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(Tests TestImageGenerator.cpp) + +target_link_libraries(Tests + ${OpenCV_LIBS} + ) diff --git a/Tests/TestImageGenerator.cpp b/Tests/ImageProcessing/TestImageGenerator.cpp similarity index 100% rename from Tests/TestImageGenerator.cpp rename to Tests/ImageProcessing/TestImageGenerator.cpp