【问题标题】:Using opencv fonctions with swift4.2 on ios在ios上使用带有swift4.2的opencv函数
【发布时间】:2019-05-05 18:13:23
【问题描述】:

我想知道如何使用 swift 4.2 制作高动态范围成像功能

我在 OpenCVWrapper.h 中创建函数:

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

第一个问题是如何在params中设置vector而不是array?

在我创建了函数的 OpenCVWrapper.mm 文件之后:

#import <opencv2/opencv.hpp>
#import "OpenCVWrapper.h"
#import <UIKit/UIKit.h>
#include <opencv2/photo.hpp>
#include <opencv2/highgui/ios.h>

@implementation OpenCVWrapper

+(UIImage *) hdrImaging:(/* HERE PUT VECTOR PARAMS */)images :(/* HERE PUT VECTOR PARAMS */)times{

    Mat response; 
    //here to declare Mat it's cv::Mat response;

    //I don't know how to declare and use Ptr function and what file import to use this function
    Ptr<CalibrateDebevec> calibrate = createCalibrateDebevec();
    calibrate->process(images, response, times);


    Mat hdr;
    Ptr<MergeDebevec> merge_debevec = createMergeDebevec();
    merge_debevec->process(images, hdr, times, response);
    Mat ldr;
    Ptr<TonemapDurand> tonemap = createTonemapDurand(2.2f);
    tonemap->process(hdr, ldr);
    Mat fusion;
    Ptr<MergeMertens> merge_mertens = createMergeMertens();
    merge_mertens->process(images, fusion);

    response = fusion * 255;

    return MatToUIImage(response);
}

@end

有人可以帮我在我的.mm 文件中创建这个函数吗,如何在函数中传递向量参数以及该代码运行什么文件导入?

谢谢!

【问题讨论】:

    标签: ios swift opencv


    【解决方案1】:

    回答你的问题:-

    • 如果是轮廓,您可以使用“std::vector&lt;std::vector&lt;cv::Point&gt; &gt;”类型作为函数参数,或者使用“std::vector&lt;cv::Point2f&gt;”作为点。还有其他类型,但我没有在我的项目中使用更多的东西

    • 确保在标题中包含“#import&lt;opencv2/imgcodecs/ios.h&gt;

    • 使用 'cv::Mat' 而不是 'Mat' 并尝试在大多数无法识别的类型和函数之前添加前缀 'cv::'(这主要是有效的?)

    你的函数应该是这样的(测试并且没有错误):-

    +(UIImage *) hdrImaging:(std::vector<std::vector<cv::Point> >)images :(std::vector<std::vector<cv::Point> >)times{
    
    cv::Mat response;   
    
    cv::Ptr<cv::CalibrateDebevec> calibrate = cv::createCalibrateDebevec();
    calibrate->process(images, response, times);
    
    
    cv::Mat hdr;
    cv::Ptr<cv::MergeDebevec> merge_debevec = cv::createMergeDebevec();
    merge_debevec->process(images, hdr, times, 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(images, fusion);
    
    response = fusion * 255;
    
    return MatToUIImage(response);
    

    }

    确保将参数类型更改为与您的用例相匹配的类型,因为我只是举个例子

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回答,使用 'cv::Ptr calibrate = createCalibrateDebevec();'我有以下错误: - C++ 需要所有声明的类型说明符 - 使用未声明的标识符“CalibrateDebevec” - 使用未声明的标识符“createCalibrateDebevec”
    • 和#import ---> #import
    • 似乎我共享的头文件仅在最近的 OpenCV 库中可用。我已经使用了 pod,它对我来说很好用。
    • 很高兴它有帮助!而且,此错误是由于内存问题引起的,并且通常发生在您有大量实例使内存过载导致异常时。除非您知道导致它的来源,否则没有特别的解决方法。因此建议您了解您的代码在此处的作用并采取相应措施
    • 非常感谢@Lok SN 你的帮助救了我!
    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 2015-09-26
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多