integral_image/main.cpp

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