【问题标题】:HDR imaging opencv 3.1 and swift 4.2 image rotate of 90 degreesHDR 成像 opencv 3.1 和 swift 4.2 图像旋转 90 度
【发布时间】:2019-05-06 22:56:35
【问题描述】:

我使用 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);
}

编辑

如果你有类似的内存错误:

EXC_RESOURCE RESOURCE_TYPE_MEMORY(限制=650 MB,未使用=0x0) 上线merge_debevec-&gt;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 设置为 8 位,例如:response.convertTo(response, CV_8U);

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

谢谢!

【问题讨论】:

    标签: ios swift opencv camera


    【解决方案1】:

    第一个错误表示您的内存不足,可能是由于图像过大。至于第二个错误,UIImageToMatUIImage 转换为4 通道RGBA 图像。因此,您需要将其转换为 BGRRGB 用于 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多