Using OpenCV in Swift iOS

前端 未结 2 744
长发绾君心
长发绾君心 2020-12-07 07:58

After adding the OpenCV 2 framework in my xcode project, I tried searching for samlpes or tutorials for integration with swift.

Are there any good tutorials for the

相关标签:
2条回答
  • 2020-12-07 08:17

    I have a demo on github:

    https://github.com/foundry/OpenCVSwiftStitch

    It shows how to use the OpenCV stitcher from a Swift-based project. There is not a lot to the openCV side, it's really just a demo of how to put the various pieces together.

    As Swift won't talk C++ directly, it uses a thin Objective-C++ wrapper to mediate between the iOS side and the openCV side.

    Made in answer to these questions:
    Can I mix Swift with C++? Like the Objective - C .mm files
    libraries to CAPTURE panorama in iOS 6

    0 讨论(0)
  • 2020-12-07 08:25

    OpenCV is a framework written in C++. Apple's reference tell us that

    You cannot import C++ code directly into Swift. Instead, create an Objective-C or C wrapper for C++ code.

    so you cannot directly import and use OpenCV in a swift project, but this is actually not bad at all because you (need) continue to use the C++ syntax of the framework which is pretty well documented all over the net.

    So how do you proceed?

    1. Create a new Objective-C++ class (.h, .mm) for calling C++ OpenCV

    OpenCVWrapper.h

    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    
    @interface OpenCVWrapper : NSObject
    
        + (UIImage *)processImageWithOpenCV:(UIImage*)inputImage;
    
    @end
    

    OpenCVWrapper.mm (use the File -> New... Wizard for Objective-C and rename the .m file to .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
    

    As an alternative to creating new classes such as the example OpenCVWrapper.h/mm you can use Objective-C categories to extend existing Objective-C classes with OpenCV functionality. For instance UIImage+OpenCV category:

    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

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

    1. Update the Bridging-Header to make all Objective-C++ classes you created available to Swift by importing our newly created wrappers (#import "OpenCVWrapper.h")

    2. Use your wrapper in your Swift files:

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

    All Objective-C++ classes included in the bridge header are available directly from Swift.

    0 讨论(0)
提交回复
热议问题