HDR-изображения OpenCV 3.1 и Swift 4.2 Поворот изображения на 90 градусов - PullRequest
0 голосов
/ 05 декабря 2018

Я использую swift 4.2 и OpenCV 3.1, я устанавливаю Opencv с Pod.

Итак, в моем файле swift есть вызов функции:

image = OpenCVWrapper.hdrImaging(Arrayimages, Arraytimes)
  • Arrayimagesэто массив UIImage

  • Arraytimes это массив Float64

В моем OpencvWrapper.h я вызываю свою функциюкак это:

+(UIImage *) hdrImaging:(NSArray *)images :(NSArray *)times;

, и я делаю эту функцию в моем OpenCVWrapper.mm

+(UIImage *) hdrImaging:(NSArray *)images :(NSArray *)times{

    cv::Mat response;

    std::vector<cv::Mat> imagesVector;
    std::vector<float> timesVector;

    for (int i = 0; i < images.count; i++) {
        UIImage * imageToMat = images[i];
        cv::Mat rgba, matToInsert;

        UIImageToMat(imageToMat, rgba); // rgba is RGBA
        cv::cvtColor(rgba, matToInsert, cv::COLOR_RGBA2BGR) // matToInsert is 3 channel BGR        

        imagesVector.push_back(matToInsert);
        float time = [times[i] floatValue];
        timesVector.push_back(time);
    }

    cv::Ptr<cv::CalibrateDebevec> calibrate = cv::createCalibrateDebevec();
    calibrate->process(imagesVector, response, timesVector);
    cv::Mat hdr;
    cv::Ptr<cv::MergeDebevec> merge_debevec = cv::createMergeDebevec();
    merge_debevec->process(imagesVector, hdr, timesVector, response);
    cv::Mat ldr;
    cv::Ptr<cv::TonemapDurand> tonemap = cv::createTonemapDurand(2.2f);
    tonemap->process(hdr, ldr);
    cv::Mat fusion;
    cv::Ptr<cv::MergeMertens> merge_mertens = cv::createMergeMertens();
    merge_mertens->process(imagesVector, fusion);

    response = fusion * 255;
    response.convertTo(response, CV_8U);

    return MatToUIImage(response);
}

РЕДАКТИРОВАТЬ

Если у вас есть ошибка памяти, такая как:

EXC_RESOURCE RESOURCE_TYPE_MEMORY (предел = 650 МБ, не используется = 0x0) в строке merge_debevec->process(imagesVector, hdr, timesVector, response);

Вы можете понизить качество вашей фотографии с помощью следующего кода в вашей декларации о захвате: captureSession.sessionPreset = .hd1920x1080 или другое разрешение!

РЕДАКТИРОВАТЬ 2

если у вас есть ошибка о недопустимых битах / компонентах:

CustomCamera[5793:1463869] [Unknown process name] CGImageCreate: invalid image bits/component: 8 bits/pixel 96 alpha info = kCGImageAlphaNone

Не забудьте установить свой ответный мат на 8 бит, например: response.convertTo(response, CV_8U);

Почему мое изображение вращается?Я думаю, это функция MatToUIImage, которая вращает мою картинку, но как установить мою картинку с хорошим вращением?

спасибо!

1 Ответ

0 голосов
/ 05 декабря 2018

Первая ошибка говорит о том, что вам не хватило памяти, возможно, из-за большого размера изображений.Что касается второй ошибки, UIImageToMat преобразует UIImage в 4-канальное RGBA изображение.Так что вам нужно конвертировать это в BGR или RGB для HDR,

for (int i = 0; i < images.count; i++) {
    UIImage * imageToMat = images[i];
    cv::Mat rgba, matToInsert;

    UIImageToMat(imageToMat, rgba); // rgba is RGBA
    cv::cvtColor(rgba, matToInsert, cv::COLOR_RGBA2BGR) // matToInsert is 3 channel BGR        

    imagesVector.push_back(matToInsert);
    float time = [times[i] floatValue];
    timesVector.push_back(time);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...