commit 9016f8461e95c0197ec036a91280ad00eae17586 Author: Dmitry Kokorin Date: Tue Sep 4 22:21:33 2018 +0300 initial commit; argument list parser is implemented diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..28c2520 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/* +*.swp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..493940c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 2.8) + +set(PROJECT "integral_image") + +find_package(OpenCV REQUIRED) + +find_package(OpenMP REQUIRED) +if (OPENMP_FOUND) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") +endif() + +set(SOURCES + main.cpp +) + +add_executable(${PROJECT} ${SOURCES}) + +target_link_libraries(${PROJECT} LINK_PUBLIC + ${OpenCV_LIBRARIES}) diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..e69de29 diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..a043864 --- /dev/null +++ b/main.cpp @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include + +#include + +#include + + +namespace { + +struct Arguments +{ + int thread_number = 0; + std::vector file_names; +}; + +Arguments parse_arguments(int argc, char **argv) +{ + const std::string THREAD_ARGUMENT = "-t"; + const std::string IMAGE_ARGUMENT = "-i"; + + Arguments args; + + std::stringstream ss; + + for (int i = 1; i < argc; ++i) { + + if (THREAD_ARGUMENT == argv[i]) { + + if (++i == argc) + throw std::invalid_argument("thread number isn't specified"); + + ss.str(argv[i]); + ss >> args.thread_number; + + if (ss.bad() || args.thread_number < 0) + throw std::invalid_argument("thread number is invalid"); + } + else if (IMAGE_ARGUMENT == argv[i]) { + + if (++i == argc) + throw std::invalid_argument("image file name isn't specified"); + + args.file_names.push_back(argv[i]); + } + else { + + throw std::invalid_argument("unknown argument"); + } + } + + return args; +} + + +} + +int main(int argc, char **argv) +{ + try { + + Arguments args = parse_arguments(argc, argv); + + if (0 == args.thread_number) + args.thread_number = omp_get_max_threads(); + + for (const auto &file_name : args.file_names) { + + auto mat = cv::imread(file_name); + if (mat.data == NULL) { + + std::cerr << "Image file " << file_name << " is absent or damaged, skipping" << std::endl; + continue; + } + } + } + catch (const std::invalid_argument &e) { + + std::cerr << "Invalid argument: " << e.what() << std::endl; + return -1; + } + + return 0; +}