使用 Swift 语言将 OpenCV 集成到 Xcode 中

Integrate OpenCV into Xcode using Swift Language

本文关键字:Xcode 集成 OpenCV Swift 语言 使用      更新时间:2023-10-16

我尝试按照本教程将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,并且我已经根据上述要求检查了其设置。

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

感谢您的任何帮助

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. 第一个转换调用将UIImage转换为垫子以供 OpenCV 处理
  2. 第二个转换调用将CGRect转换为cv::Rect2f
  3. self.basicPts->crop(src, rect_2f( 函数使用指向我的类的指针来访问上面的裁剪函数
  4. 最后,我有一个闭包,它采用OpenCV给我的Mat对象并将其转换为iOS使用的UIImage

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

一旦你有了它,那么调用这个函数就变得微不足道了:

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

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