#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; }