繁体   English   中英

HDR成像opencv 3.1和swift 4.2图像旋转90度

[英]HDR imaging opencv 3.1 and swift 4.2 image rotate of 90 degrees

我使用swift 4.2和OpenCV 3.1,并在Pod中安装Opencv。

所以在我的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);
}

编辑

如果您遇到类似以下的内存错误:

merge_debevec->process(imagesVector, hdr, timesVector, response);行上的EXC_RESOURCE RESOURCE_TYPE_MEMORY(限制= 650 MB,未使用= 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

不要忘记将您的响应Mat设置为8bit,如: response.convertTo(response, CV_8U);

为什么我的图片旋转? 我认为是MatToUIImage函数可以旋转我的图片,但是如何通过良好的旋转来设置我的图片呢?

谢谢 !

第一个错误是您可能由于图像大而用完了内存。 至于第二个错误, UIImageToMatUIImage转换为4通道RGBA图像。 所以您需要将其转换为HDR的BGRRGB

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM