首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HDR成像opencv 3.1和快速4.2图像旋转90度

HDR成像opencv 3.1和快速4.2图像旋转90度
EN

Stack Overflow用户
提问于 2018-12-05 11:22:37
回答 1查看 406关注 0票数 2

我使用快速4.2和OpenCV 3.1,我用Pod安装Opencv。

因此,在我的快速文件中有我的函数调用:

代码语言:javascript
复制
image = OpenCVWrapper.hdrImaging(Arrayimages, Arraytimes)
  • Arrayimages是一个UIImage数组
  • Arraytime是Float64的数组。

在我的OpencvWrapper.h中,我这样调用我的函数:

代码语言:javascript
复制
+(UIImage *) hdrImaging:(NSArray *)images :(NSArray *)times;

我在我的OpenCVWrapper.mm中做了这个函数

代码语言:javascript
复制
+(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 (limit=650 MB,unused=0x0)行merge_debevec->process(imagesVector, hdr, timesVector, response);上的

您可以在捕获会话声明中使用以下代码来保证图片的质量:captureSession.sessionPreset = .hd1920x1080或其他简历解决方案!

编辑2

如果有关无效位/组件的错误:

代码语言:javascript
复制
CustomCamera[5793:1463869] [Unknown process name] CGImageCreate: invalid image bits/component: 8 bits/pixel 96 alpha info = kCGImageAlphaNone

不要忘记将您的响应Mat设置为8位,类似于:response.convertTo(response, CV_8U);

为什么我的照片旋转?我认为MatToUIImage函数是谁旋转我的图片,但如何设置我的图片与良好的旋转?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-12-05 15:20:48

第一个错误是内存不足,可能是由于图像的大小。对于第二个错误,UIImageToMatUIImage转换为4通道RGBA图像。所以你需要把它转换成BGR或者RGB

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53631174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档