gpt4 book ai didi

c++ - 在 IOS Swift 项目中使用 OpenCV 进行视频处理

转载 作者:搜寻专家 更新时间:2023-10-30 22:03:23 29 4
gpt4 key购买 nike

我使用桥接头(将 Swift 连接到 Objective C)和 Objective C 包装器(将 Objective C 连接到 C++)将 opencv 集成到 Swift IOS 项目中。使用这种方法,我可以从 Swift 代码传递单个图像,在 C++ 文件中分析它们并取回它们。

I've seen that opencv provides CvVideoCamera object that can be integrated with an Objective C UIViewController.

但由于我的 UIViewController 是用 Swift 编写的,我想知道这是否也可行?

最佳答案

这是我有机会自己玩这个之后对我最初答案的更新。是的,可以使用 CvVideoCamera使用 Swift 编写的 View Controller 。如果您只想使用它在您的应用中显示来自相机的视频,那真的很简单。

#import <opencv2/highgui/cap_ios.h>通过桥接头。然后,在您的 View Controller 中:

class ViewController: UIViewController, CvVideoCameraDelegate {
...
var myCamera : CvVideoCamera!
override func viewDidLoad() {
...
myCamera = CvVideoCamera(parentView: imageView)
myCamera.delegate = self
...
}
}

ViewController实际上不能符合 CvVideoCameraDelegate协议(protocol),但是 CvVideoCamera没有委托(delegate)将无法工作,所以我们通过声明 ViewController 来解决这个问题。在不实现任何方法的情况下采用该协议(protocol)。这将触发编译器警告,但来自摄像机的视频流将显示在 ImageView 中。

当然,您可能想要实现 CvVideoCameraDelegate的(仅)processImage()在显示视频帧之前处理视频帧的方法。你不能在 Swift 中实现它的原因是因为它使用 C++ 类型,Mat .

因此,您需要编写一个 Objective-C++ 类,其实例可以设置为相机的委托(delegate)。 processImage() CvVideoCamera 将调用该 Objective-C++ 类中的方法并将依次调用您的 Swift 类中的代码。以下是一些示例代码片段。在 OpenCVWrapper.h :

// Need this ifdef, so the C++ header won't confuse Swift
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

// This is a forward declaration; we cannot include *-Swift.h in a header.
@class ViewController;

@interface CvVideoCameraWrapper : NSObject
...
-(id)initWithController:(ViewController*)c andImageView:(UIImageView*)iv;
...
@end

在包装器实现中,OpenCVWrapper.mm (它是一个 Objective-C++ 类,因此具有 .mm 扩展名):

#import <opencv2/highgui/cap_ios.h>
using namespace cv;
// Class extension to adopt the delegate protocol
@interface CvVideoCameraWrapper () <CvVideoCameraDelegate>
{
}
@end
@implementation CvVideoCameraWrapper
{
ViewController * viewController;
UIImageView * imageView;
CvVideoCamera * videoCamera;
}

-(id)initWithController:(ViewController*)c andImageView:(UIImageView*)iv
{
viewController = c;
imageView = iv;

videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView];
// ... set up the camera
...
videoCamera.delegate = self;

return self;
}
// This #ifdef ... #endif is not needed except in special situations
#ifdef __cplusplus
- (void)processImage:(Mat&)image
{
// Do some OpenCV stuff with the image
...
}
#endif
...
@end

然后你输入#import "OpenCVWrapper.h"在桥接 header 中,Swift View Controller 可能如下所示:

class ViewController: UIViewController {
...
var videoCameraWrapper : CvVideoCameraWrapper!

override func viewDidLoad() {
...
self.videoCameraWrapper = CvVideoCameraWrapper(controller:self, andImageView:imageView)
...
}

参见 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html关于前向声明和 Swift/C++/Objective-C 互操作。网络上有很多关于 #ifdef __cplusplus 的信息和 extern "C" (如果你需要的话)。

processImage()委托(delegate)方法,您可能需要与某些 OpenCV API 进行交互,您还必须为此编写包装器。您可以在其他地方找到一些相关信息,例如:Using OpenCV in Swift iOS

更新 09/03/2019

应社区要求,请参阅评论,示例代码已放在 GitHub 上 https://github.com/aperedera/opencv-swift-examples .

此外,在撰写本文时,OpenCV iOS 框架的当前版本不再允许 Swift 代码使用声明 CvVideoCameraDelegate 的 header (现在位于 videoio/cap_ios.h 中)。协议(protocol),因此您不能仅将其包含在桥接 header 中并声明 View Controller 符合协议(protocol)以在您的应用中简单地显示相机视频。

关于c++ - 在 IOS Swift 项目中使用 OpenCV 进行视频处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37413951/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com