87 lines
1.8 KiB
C++
87 lines
1.8 KiB
C++
#include <vector>
|
|
#include <string>
|
|
#include <sstream>
|
|
#include <iostream>
|
|
#include <stdexcept>
|
|
|
|
#include <omp.h>
|
|
|
|
#include <opencv2/opencv.hpp>
|
|
|
|
|
|
namespace {
|
|
|
|
struct Arguments
|
|
{
|
|
int thread_number = 0;
|
|
std::vector<std::string> 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;
|
|
}
|