在我的xcode项目中添加OpenCV 2框架后,我try 搜索SAMLPE或教程,以便与swift集成.

这方面有什么好的教程吗?

推荐答案

OpenCV是一个用C++编写的框架.苹果reference强告诉我们

不能直接将C++代码导入SWIFT.相反,为C++代码创建Objto-C或C包装器.

因此,您不能直接在快速项目中导入和使用OpenCV,但这实际上并不坏,因为您需要继续使用整个网络中完全有文档记录的框架的C++语法.

那你该怎么做呢?

  1. 创建一个新的ObjuleC++类(.h,.mm),用于调用C++ OpenCV

OpenCVWrapper.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface OpenCVWrapper : NSObject

    + (UIImage *)processImageWithOpenCV:(UIImage*)inputImage;

@end

OpenCVWrapper.mm(对Objective-C使用文件->;新建…向导,并将.m文件重命名为.mm)

#include "OpenCVWrapper.h"
#import "UIImage+OpenCV.h" // See below to create this

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

@implementation OpenCVWrapper : NSObject

    + (UIImage *)processImageWithOpenCV:(UIImage*)inputImage {
        Mat mat = [inputImage CVMat];
        
        // do your processing here
        ...
        
        return [UIImage imageWithCVMat:mat];
    }

@end

作为创建新类(例如示例OpenCVWrapper)的替代方案.h/mm您可以使用Objective-C类别,通过OpenCV功能扩展现有的Objective-C类.例如UIImage+OpenCV类别:

UIImage+OpenCV.h

#import <UIKit/UIKit.h>
#import <opencv2/opencv.hpp>

@interface UIImage (OpenCV)

    //cv::Mat to UIImage
+ (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat;
- (id)initWithCVMat:(const cv::Mat&)cvMat;

    //UIImage to cv::Mat
- (cv::Mat)CVMat;
- (cv::Mat)CVMat3;  // no alpha channel
- (cv::Mat)CVGrayscaleMat;

@end

UIImage+OpenCV.mm

https://github.com/foundry/OpenCVSwiftStitch/blob/master/SwiftStitch/UIImage%2BOpenCV.mm

  1. 通过导入我们新创建的包装器(#import "OpenCVWrapper.h"),更新Bridging-Header,使您创建的所有Objective-C++类可供Swift使用

  2. 在Swift文件中使用包装器:

    let image = UIImage(named: "image.jpeg")
    let processedImage = OpenCVWrapper.processImageWithOpenCV(image)
    

bridge header中包含的所有Objective-C++类都可以直接从Swift获得.

Swift相关问答推荐

多个提取来计算核心数据中的记录

如何消除SwiftUI中SF符号的填充

依赖于@Environment的init@StateObject

将NavigationSplitView更改为NavigationStack

为什么这个快速代码不显示文本字段?

使用 @resultBuilder 的通用 buildList 函数

当模式以编程方式关闭时在父视图控制器中触发操作

无论玩家移动到视图内的哪个位置,如何使用 SpriteKit 让敌人向玩家emits 子弹?

如何在闭包中使用构造 await sync

memcpy 复制带偏移量的数组

在领域 SwiftUI 异常中使用 Apple 登录:无法识别的 Select 器发送到实例

Swift - 给定一个像 30 的 Int 如何将范围数乘以 7?

有什么方法可以快速为泛型参数分配默认值?

来自数据的 SwiftUI 图像

引用类型(类)不需要但 struct 需要的可识别 id

(SwiftLint)如果有正文,如何编写规则(可能是自定义),在{之后总是\n(换行)?

subscribeOn 和 observeOn 的顺序重要吗?

UITableViewAlertForLayoutOutsideViewHierarchy 错误:仅警告一次(iOS 13 GM)

如何以编程方式读取 wkwebview 的控制台日志(log)

SwiftUI:将多个 BindableObjects 放入环境