2015-06-18 13 views
48

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

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

उत्तर

62

ओपनसीवी सी ++ में लिखा गया एक ढांचा है। ऐप्पल का reference हमें बताएं कि

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

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

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

  1. सी ++ OpenCV

OpenCVWrapper.h

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

@interface OpenCVWrapper : NSObject 

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

@end 

OpenCVWrapper.mm फोन करने के लिए एक नया ऑब्जेक्टिव-सी ++ वर्ग (ज, .mm) बनाएँ (फ़ाइल -> नया ... उद्देश्य-सी के लिए विज़ार्ड का उपयोग करें और .m फ़ाइल को .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 

ओपनसीवीWrapper.h/mm उदाहरण जैसे नए वर्ग बनाने के विकल्प के रूप में आप ओपनसीवी कार्यक्षमता के साथ मौजूदा उद्देश्य-सी कक्षाओं को विस्तारित करने के लिए उद्देश्य-सी श्रेणियों का उपयोग कर सकते हैं। उदाहरण 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 अद्यतन करें जो आपके द्वारा बनाए गए सभी उद्देश्य-सी ++ वर्गों को आयात करके स्विफ्ट में उपलब्ध कराए गए हैं हमारे नव निर्मित रैपर (#import "OpenCVWrapper.h")

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

    देना छवि = UIImage (नाम: "image.jpeg") जाने processedImage = OpenCVWrapper.processImageWithOpenCV (छवि)

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

+0

हैलो मैं OpenCV के लिए नया हूँ। क्या आप कृपया मुझे बता सकते हैं कि UIImage + OpenCV श्रेणी में क्या होना चाहिए ?? क्या मुझे इसे कहीं से डाउनलोड करना चाहिए? – GMHSJ

+0

@ जीएमएचएसजे: यह यूआईएममेज का विस्तार है जो सीवी :: मैट स्ट्रक्चर से यूआईएममेज में कनवर्ट करने में मदद करता है। इसलिए आपको इसे अपनी परियोजना में बनाना होगा। – Shrawan

+2

# शामिल बाकी सब से पहले शामिल किया जाना चाहिए। यदि कुछ संघर्ष नहीं दिखाई देंगे। – Pochi

34

मैं GitHub पर एक डेमो है:

https://github.com/foundry/OpenCVSwiftStitch

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

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

इन सवालों के जवाब में निर्मित:
Can I mix Swift with C++? Like the Objective - C .mm files
libraries to CAPTURE panorama in iOS 6

+0

@ कशिफ, मैंने आपकी वेबसाइट पर संपर्क विवरण के माध्यम से जवाब दिया है। – foundry

+3

जीथ्यूब पर यह डेमो (ओपनसीवीएसविफ्टस्टीच) ओपनसीवी के साथ स्विफ्ट को एकीकृत करने के लिए अब तक का सबसे अच्छा ट्यूटोरियल और व्यावहारिक डेमो है। यह प्रश्नों का उत्तर देता है, निर्देश स्थापित करता है और दिखाता है कि UIImage + OpenCV श्रेणी कार्यान्वयन में क्या रखा जाए। इसे पढ़ने के बाद मैं अंततः जा रहा हूं, यूआईएममेज प्रारूप से ओपनसीवी मैट में एक छवि को परिवर्तित कर सकता हूं, कुछ प्रोसेसिंग कर सकता हूं, वापस कन्वर्ट कर सकता हूं और छवि को प्रदर्शित कर सकता हूं – Paulus

+0

@ पॉलस - फीडबैक के लिए धन्यवाद। मुझे खुशी है कि आपको यह उपयोगी लगता है। – foundry

संबंधित मुद्दे