【问题标题】:Integrate OpenCV into Xcode using Swift Language使用 Swift 语言将 OpenCV 集成到 Xcode 中
【发布时间】:2017-12-12 23:50:44
【问题描述】:

我尝试按照本教程将 OpenCV 集成到 Xcode 中。 https://www.youtube.com/watch?v=ywUBHqxwM5Q

编辑:我尝试了更多教程并且总是看到这些类型的警告。

但是,我在执行此操作后发现了很多警告。我已经解决了其中的一些问题,但仍然存在大量警告。

警告被称为

Apple Mach-O Linker Warning Group:

direct access in function '___cxx_global_var_init' from 
file '/Users/user/Desktop/OpenCV-SwiftTest/OpenCV-
SwiftTest/opencv2.framework/opencv2(flann.o)' to global weak symbol 
'guard variable for 
cvflann::anyimpl::SinglePolicy<cvflann::anyimpl::empty_any>::policy' 
from file 
'/Users/user/Library/Developer/Xcode/DerivedData/OpenCV-
SwiftTest-awmplbufjrmhqrbptnqhlxqxvptp/Build/Intermediates/OpenCV-
SwiftTest.build/Debug-iphonesimulator/OpenCV-SwiftTest.build/Objects-
normal/x86_64/OpenCVWrapper.o' means the weak symbol cannot be 
overridden at runtime.
This was likely caused by different translation units being compiled 
with different visibility settings.

我找到了一些相关的答案,例如

  1.Symbols Hidden by Default
  2.Inline Methods Hidden

由于本教程仅包含一个项目的 OpenCV,并且我已根据上述要求检查了其设置。

这只是一个简单的项目,不同的翻译单元在哪里?

感谢您的帮助

【问题讨论】:

    标签: c++ ios xcode opencv


    【解决方案1】:

    Swift 不能直接使用 C++,因此您至少需要使用 Objective C 包装器来与 OpenCV 进行通信。

    例如,我的 C++ 类中有以下方法:

    cv::Mat crop(const cv::Mat &src, cv::Rect2f &rect);
    

    然后我有一个存在于 Objective-C++ 文件中的 Objective-C 方法(这意味着 XCode 中的文件名有第二个 m(例如:MyWrapper.mm)。

    在 Obj-C 中调用 this 的函数如下所示:

    - (void)crop:(nonnull UIImage *)source
            rect:(CGRect)rect
    completionHandler:(nonnull ImageCompletionHandler)completionHandler {
        MAT src = [Conversion cvMatWithImage:source];
        RECT_2F rect_2f = [Conversion cvRectFromRect:rect];
        MAT dst = self.basicPtr->crop(src, rect_2f);
    
        completionHandler([Conversion imageFromCVMat:dst]);
    }
    
    1. 第一个 Conversion 调用将 UIImage 转换为 Mat 以供 OpenCV 处理
    2. 第二个转换调用将CGRect 转换为cv::Rect2f
    3. self.basicPts->crop(src, rect_2f) 函数使用指向我的类的指针来访问上面的裁剪函数
    4. 最后,我有一个闭包,它接受 OpenCV 给我的 Mat 对象并将其转换为 UIImage 供 iOS 使用

    然后,回到 Swift 领域,您首先需要为 Objective-C 包装器提供一个桥接头,以便 Swift 可以访问它。

    一旦你有了它,那么调用函数就很简单了:

    func crop(with image: UIImage, rect: CGRect) {
        let wrapper = BasicWrapper()
        wrapper.crop(image, rect: rect) { (image) in
            // Handle image
        }
    }
    

    填写所有这些部分需要大量工作,但如果你环顾四周,你可以找到所有你需要的部分(我知道我做到了)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      相关资源
      最近更新 更多