web-dev-qa-db-ja.com

OpenCVをSwift iOSで使用する

XcodeプロジェクトにOpenCV2フレームワークを追加した後、Swiftと統合するためのサンプルとチュートリアルを検索してみました。

同じための良いチュートリアルはありますか?

50

OpenCVは、C++で記述されたフレームワークです。 Appleの 参照

C++コードをSwiftに直接インポートすることはできません。代わりに、C++コード用のObjective-CまたはCラッパーを作成します。

したがって、SwiftプロジェクトでOpenCVを直接インポートして使用することはできませんが、これは実際には悪いことではありません。すべてが十分に文書化されているフレームワークのC++構文を使用する必要があるためです)ネットの上。

では、どのように進めますか?

  1. C++ OpenCVを呼び出すための新しいObjective-C++クラス(.h、。mm)を作成します

OpenCVWrapper.h

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

@interface OpenCVWrapper : NSObject

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

@end

OpenCVWrapper.mm(File-> New ... Wizardを使用し、.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カテゴリを使用して、既存のObjective-CクラスをOpenCV機能で拡張できます。たとえば、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. Bridging-Header を更新して、作成したすべてのObjective-C++クラスをSwiftに新しく作成したラッパー(#import "OpenCVWrapper.h"

  2. Swiftファイルでラッパーを使用:

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

ブリッジヘッダーに含まれるすべてのObjective-C++クラスは、Swiftから直接利用できます。

64
Tomas Camin

Githubにデモがあります:

https://github.com/foundry/OpenCVSwiftStitch

SwiftベースのプロジェクトからOpenCVスティッチャーを使用する方法を示します。 openCV側にはそれほど多くはありません。実際には、さまざまなピースをどのように組み合わせるかを示すデモにすぎません。

SwiftはC++を直接話さないため、薄いObjective-C++ラッパーを使用してiOS側とopenCV側を仲介します。

これらの質問に答えて作られました:
Swift C++と組み合わせて使用​​できますか?Objective-C .mmファイルのように
iOS 6のCAPTUREパノラマのライブラリ

35
foundry