स्विफ्ट iOS में OpenCV का उपयोग करना




swift image-processing (2)

अपने xcode प्रोजेक्ट में OpenCV 2 फ्रेमवर्क को जोड़ने के बाद, मैंने स्विफ्ट के साथ एकीकरण के लिए नमूने या ट्यूटोरियल खोजने की कोशिश की।

क्या इसके लिए कोई अच्छा ट्यूटोरियल है?


OpenCV C ++ में लिखा गया एक ढांचा है। Apple का reference हमें बताता है कि

आप C ++ कोड को सीधे स्विफ्ट में आयात नहीं कर सकते। इसके बजाय, C ++ कोड के लिए एक उद्देश्य-सी या सी आवरण बनाएं।

इसलिए आप OpenCV को सीधे स्विफ्ट प्रोजेक्ट में आयात और उपयोग नहीं कर सकते हैं, लेकिन यह वास्तव में बिल्कुल भी बुरा नहीं है क्योंकि आप (आवश्यकता) फ्रेमवर्क के C ++ सिंटैक्स का उपयोग करना जारी रखते हैं जो नेट पर बहुत अच्छी तरह से प्रलेखित है।

तो आप कैसे आगे बढ़ते हैं?

  1. C ++ OpenCV को कॉल करने के लिए एक नया Objective-C ++ class (.h .mm ) बनाएं

OpenCVWrapper.h

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

@interface OpenCVWrapper : NSObject

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

@end

OpenCVWrapper.mm (फ़ाइल का उपयोग करें -> नया ... उद्देश्य-सी के लिए विज़ार्ड और .m फ़ाइल का नाम बदलकर।)

#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 जैसी नई कक्षाएं बनाने के विकल्प के रूप में, आप 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. अपने नए बनाए गए रैपर ( #import "OpenCVWrapper.h" ) का आयात करके स्विफ्ट को उपलब्ध कराई गई सभी उद्देश्य-सी ++ कक्षाएं बनाने के लिए Bridging-Header को अपडेट करें।

  2. अपनी स्विफ्ट फ़ाइलों में अपने आवरण का उपयोग करें:

    चलो छवि = UIImage (नाम: "image.jpeg") संसाधित होने दें = OpenCVWrapper.processImageWithOpenCV (छवि)

ब्रिज हेडर में शामिल सभी ऑब्जेक्टिव-सी ++ कक्षाएं सीधे स्विफ्ट से उपलब्ध हैं।


मेरे पास github पर एक डेमो है:

https://github.com/foundry/OpenCVSwiftStitch

यह दिखाता है कि स्विफ्ट-आधारित परियोजना से ओपनसीवी सीवर का उपयोग कैसे किया जाता है। OpenCV पक्ष के लिए बहुत कुछ नहीं है, यह वास्तव में सिर्फ एक डेमो है कि विभिन्न टुकड़ों को एक साथ कैसे रखा जाए।

जैसा कि स्विफ्ट सी ++ से सीधे बात नहीं करेगा, यह आईओएस पक्ष और ओपन वीवी साइड के बीच मध्यस्थता करने के लिए एक पतली उद्देश्य-सी ++ आवरण का उपयोग करता है।

इन सवालों के जवाब में बनाया गया:
क्या मैं स्विफ्ट को C ++ के साथ मिला सकता हूं? ऑब्जेक्टिव की तरह - सी .एमएम फाइलें
आईओएस 6 में पैनोरमा को कैप्चर करने के लिए लाइब्रेरी








image-processing