#include <iostream>
#include <vector>
#include <filesystem>
#include <opencv2/opencv.hpp>
#include <future>

namespace fs = std::filesystem;

struct FileInfo {
    fs::path path;
    std::string name;
};

cv::Mat rotateImage(const cv::Mat& image, double angle) {

    cv::Point2f center(image.cols / 2.0, image.rows / 2.0);
    cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, 1.0);
    cv::Mat rotatedImage;
    cv::warpAffine(image, rotatedImage, rotationMatrix, image.size(), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(255, 255, 255));
    return rotatedImage;
}

void addFilesToVector(const fs::path& directoryPath, std::vector<FileInfo>& fileList) {
    try {
        for (const auto& entry : fs::directory_iterator(directoryPath)) {
            if (fs::is_regular_file(entry)) {
                fileList.push_back({ entry.path(), entry.path().filename().string() });
            }
        }
    }
    catch (const fs::filesystem_error& e) {
        std::cerr << "Error accessing directory: " << e.what() << std::endl;
    }
}


void processImage(const FileInfo& fileInfo, const fs::path& outputDir, double angle) {
    cv::Mat image = cv::imread(fileInfo.path.string(), cv::IMREAD_COLOR);
    if (image.empty()) {
        std::cerr << "Error loading image: " << fileInfo.path.string() << std::endl;
        return;
    }

    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

    cv::Mat resizedGray = cv::Mat::zeros(32, 32, CV_8UC1);
    cv::resize(gray, resizedGray, cv::Size(32, 32), 0, 0, cv::INTER_AREA);

    cv::Mat rotatedImage = rotateImage(resizedGray, angle);

    std::string outputFilename = fileInfo.path.stem().string() + "_rotated_" + std::to_string(static_cast<int>(angle)) + fileInfo.path.extension().string();
    fs::path outputPath = outputDir / outputFilename;

    if (!cv::imwrite(outputPath.string(), rotatedImage)) {
        std::cerr << "Error saving rotated image: " << outputPath.string() << std::endl;
    }
}

void processCSV(const FileInfo& fileInfo) {
    cv::Mat image = cv::imread(fileInfo.path.string(), cv::IMREAD_COLOR);
    if (image.empty()) {
        std::cerr << "Error loading image: " << fileInfo.path.string() << std::endl;
        return;
    }


}

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << "Usage: " << argv[0] << " <directory_path>" << std::endl;
        return -1;
    }

    fs::path directoryPath(argv[1]);

    if (!fs::exists(directoryPath) || !fs::is_directory(directoryPath)) {
        std::cerr << "Directory does not exist or is not a directory: " << directoryPath << std::endl;
        return -1;
    }

    std::vector<FileInfo> fileList;
    addFilesToVector(directoryPath, fileList);

    fs::path outputDir = directoryPath / "rotated_images";
    if (!fs::exists(outputDir)) {
        fs::create_directory(outputDir);
    }

    std::vector<std::future<void>> futures;

    for (const auto& fileInfo : fileList) {
        std::cout << "Processing file: " << fileInfo.name << ", path: " << fileInfo.path.string() << std::endl;
        for (double angle = -20.0; angle <= 20.0; angle += 5.0) {
            futures.push_back(std::async(std::launch::async, processImage, fileInfo, outputDir, angle));
        }
    }

    for (auto& f : futures) { f.get(); }

    return 0;
}

Нужно создать функцию ProcessCSV которая будет создовать или дополнять CSV файл

Каждое изображение выражается в виде массива, состоящего из 0 и 1, где белый пиксель изображения – 0, любой отличный от белого – 1.
	На основании всех изображений создается .csv файл (https://ru.wikipedia.org/wiki/CSV), где строками являются:
		массив, содержащий пиксели в формате 0/1;
		класс, к которому относится изображение;
id изображения (представляет собой счетчик, увеличивающийся для каждого нового изображения. Нужен будет для последующих работ).

id берется по последней записи в csv, класс из аргументов которые подают на вход