Swift on ollut kanssamme jo jonkin aikaa, ja iteraatioidensa avulla se on tuonut meille kaikki modernin olio-ohjelmointikielen ominaisuudet. Näitä ovat lisävarusteet, geneeriset tuotteet, tuplit, menetelmiä tukevat rakenteet, laajennukset ja protokollat ja paljon muuta. Mutta jos sovelluksesi perustuu kirjastoon, joka on kirjoitettu C ++: lla, et voi enää luottaa Swiftiin. Onneksi Objective-C ++ on täällä auttamassa meitä.
Perustamisestaan lähtien Swiftillä on ollut hyvä yhteentoimivuus Objective-C: n kanssa, ja käytämme Objective-C: tä yhdistämään Swift C ++: n kanssa. Objective-C ++ ei ole muuta kuin Objective-C, jolla on mahdollisuus muodostaa yhteys C ++ -koodiin, ja käyttämällä tätä luomme tässä blogiviestissä yksinkertaisen sovelluksen, joka tunnistaa ApeeScape-logon kuvan sisällä OpenCV: n avulla. Kun havaitsemme kyseisen logon, avamme ApeeScape-kotisivun.
Kuten OpenCV: ssä todettiin Nettisivu :
'OpenCV on suunniteltu laskentatehokkuuteen ja keskittynyt voimakkaasti reaaliaikaisiin sovelluksiin. Optimoidulla C / C ++: lla kirjoitettu kirjasto voi hyödyntää monisydämistä prosessointia. '
Tämä on loistava ratkaisu, jos haluat nopeasti kehittyvän ja luotettavan tietokonenäön.
Tässä opetusohjelmassa suunnittelemme sovelluksen, joka sopii yhteen ApeeScape-logon kuvan sisällä ja avaa ApeeScape Nettisivu . Aloita luomalla uusi Xcode-projekti ja määrittämällä CocoaPodit käyttämällä pod init
. Lisää OpenCV Podfileen pod 'OpenCV
ja suorita pod install
terminaalissa. Muista kommentoida use_frameworks
! lausunto Podfilen sisällä.
Nyt kun meillä on OpenCV Xcode-projektin sisällä, meidän on yhdistettävä se Swiftiin. Tässä on lyhyt kuvaus vaiheista:
Vaihe 1: Luo uusi Objective-C -luokka OpenCVWrapper
Kun Xcode kysyy Haluatko määrittää Objective-C-silloitusotsikon? 'Valitse' Luo siltaava otsikko . ” Siltaava otsikko on paikka, johon tuot Objective-C-luokat, ja sitten ne näkyvät Swiftissä.
Vaihe 2: Jotta voisimme käyttää C ++: ta Objective-C: ssä, meidän on vaihdettava tiedostopääte arvosta OpenCVWrapper.m
kohteeseen OpenCVWrapper.mm
Voit tehdä sen yksinkertaisesti nimeämällä tiedoston uudelleen Xcode-projektinavigaattorissa. Lisätään .mm
laajennuksena muuttaa tiedostotyypin Objective-C: stä Objective-C ++: ksi.
Vaihe 3: Tuo OpenCV tiedostoon OpenCVWrapper.mm
käyttämällä seuraavaa tuontia. On tärkeää kirjoittaa annettu tuonti yllä #import 'OpenCVWrapper.h'
koska tällä tavoin vältämme tunnettua BOOLia konflikti . OpenCV sisältää enumin, jolla on arvo NO
mikä aiheuttaa ristiriidan Objective-C BOOL NO
: n kanssa arvo. Jos et tarvitse luokkia, jotka käyttävät tällaista enumia, tämä on yksinkertaisin tapa. Muussa tapauksessa BOOL on määriteltävä ennen OpenCV: n tuomista.
#ifdef __cplusplus #import #import #import #endif
Vaihe 4: Lisää #import 'OpenCVWrapper.h'
siltaavaan otsikkoon.
Avaa OpenCVWrapper.mm
ja luo yksityinen käyttöliittymä, jossa ilmoitamme yksityiset kiinteistöt:
@interface OpenCVWrapper() @property (strong, nonatomic) CvVideoCamera *videoCamera; @property (assign, nonatomic) cv::Mat logoSample; @end
Luodaksesi CvVideoCamera
, meidän on päästävä UIImageView
siihen, ja teemme sen nimeämämme alustusohjelman avulla.
- (instancetype)initWithParentView:(UIImageView *)parentView delegate:(id)delegate { if (self = [super init]) { self.delegate = delegate; parentView.contentMode = UIViewContentModeScaleAspectFill; self.videoCamera = [[CvVideoCamera alloc] initWithParentView:parentView]; self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack; self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPresetHigh; self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait; self.videoCamera.defaultFPS = 30; self.videoCamera.grayscaleMode = [NSNumber numberWithInt:0].boolValue; self.videoCamera.delegate = self; // Convert UIImage to Mat and store greyscale version UIImage *templateImage = [UIImage imageNamed:@'toptal']; cv::Mat templateMat; UIImageToMat(templateImage, templateMat); cv::Mat grayscaleMat; cv::cvtColor(templateMat, grayscaleMat, CV_RGB2GRAY); self.logoSample = grayscaleMat; [self.videoCamera start]; } return self; }
Sen sisällä määritämme CvVideoCamera
joka näyttää videon annetussa parentView
: ssa ja edustajan kautta lähettää meille cv::Mat
kuva analyysia varten.
processImage:
menetelmä on peräisin CvVideoCameraDelegate
protokolla, ja sen sisällä teemme mallien sovituksen.
- (void)processImage:(cv::Mat&)image { cv::Mat gimg; // Convert incoming img to greyscale to match template cv::cvtColor(image, gimg, CV_BGR2GRAY); // Get matching cv::Mat res(image.rows-self.logoSample.rows+1, self.logoSample.cols-self.logoSample.cols+1, CV_32FC1); cv::matchTemplate(gimg, self.logoSample, res, CV_TM_CCOEFF_NORMED); cv::threshold(res, res, 0.5, 1., CV_THRESH_TOZERO); double minval, maxval, threshold = 0.9; cv::Point minloc, maxloc; cv::minMaxLoc(res, &minval, &maxval, &minloc, &maxloc); // Call delegate if match is good enough if (maxval >= threshold) { // Draw a rectangle for confirmation cv::rectangle(image, maxloc, cv::Point(maxloc.x + self.logoSample.cols, maxloc.y + self.logoSample.rows), CV_RGB(0,255,0), 2); cv::floodFill(res, maxloc, cv::Scalar(0), 0, cv::Scalar(.1), cv::Scalar(1.)); [self.delegate openCVWrapperDidMatchImage:self]; } }
Ensin muunnetaan annettu kuva harmaasävykuvaksi, koska init-menetelmän sisällä muunnimme ApeeScape-logomallipohjan vastaavan kuvan harmaasävyksi. Seuraava vaihe on tarkistaa ottelut tietyllä kynnyksellä, joka auttaa meitä skaalaus ja kulmat. Meidän on tarkistettava kulmat, koska voit kaapata valokuvan eri kulmista, joissa haluamme edelleen tunnistaa logon. Annetun kynnyksen saavuttamisen jälkeen kutsumme edustajan ja avaamme ApeeScapen verkkosivun.
Älä unohda lisätä NSCameraUsageDescription
Info.plistisi muuten, sovelluksesi kaatuu heti soitettuasi [self.videoCamera start];
Toistaiseksi keskityimme Objective-C ++: een, koska kaikki logiikat tehdään sen sisällä. Swift-koodimme on melko yksinkertainen:
ViewController.swift
, luo UIImageView
missä CvVideoCamera
tekee sisällön.OpenCVWrapper
-esiintymä ja ohita UIImageView
esimerkiksi siihen.OpenCVWrapperDelegate
protokolla ApeeScapen verkkosivun avaamiseksi, kun havaitsemme logon. class ViewController: UIViewController { var wrapper: OpenCVWrapper! @IBOutlet var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. wrapper = OpenCVWrapper.init(parentView: imageView, delegate: self) } } extension ViewController: OpenCVWrapperDelegate { //MARK: - OpenCVWrapperDelegate func openCVWrapperDidMatchImage(_ wrapper: OpenCVWrapper) { UIApplication.shared.open(URL.init(string: 'https://toptal.com')!, options: [:], completionHandler: nil) } }
Tässä artikkelissa olemme osoittaneet, kuinka voit integroida C ++ -koodin Swiftin kanssa ja luoda kääreluokkia, jotka ovat täällä C ++ -koodin yhdistämiseksi Swiftin kanssa. Kun havaitsemme ApeeScape-logon kameran kautta, avataan ApeeScape-kotisivu.
Tulevia päivityksiä varten kannattaa ehkä suorittaa CV-mallien sovitus taustaketjussa. Tällä tavalla et estä pääketjua ja käyttöliittymä pysyy reagoivana. Koska tämä on yksinkertainen esimerkki OpenCV: stä, mallien sovitus ei välttämättä ole erityisen onnistunut, mutta tämän artikkelin tarkoituksena oli näyttää, kuinka voit aloittaa sen käytön.
Jos olet edelleen kiinnostava oppimaan OpenCV: n ja sen monimutkaisemman käytön iOS: ssä, suosittelen Reaaliaikainen objektitunnistus MSER: n avulla iOS: ssä , joka opastaa sinut kuvan tunnistuksessa iPhonen takakameralla.
OpenCV (avoimen lähdekoodin tietokonenäkökirjasto) on avoimen lähdekoodin tietokonenäkö- ja koneoppimisohjelmistokirjasto, joka sisältää yli 2500 optimoitua algoritmia
OpenCV-algoritmeja voidaan käyttää kasvojen havaitsemiseen ja tunnistamiseen, esineiden tunnistamiseen, ihmisten toimien luokittelemiseen videoissa, kameran liikkeiden seuraamiseen, liikkuvien kohteiden seuraamiseen, esineiden 3D-mallien purkamiseen, vastaavien kuvien etsimiseen kuvatietokannoista, punasilmäisyyden poistamiseen salamalla otetuista kuvista, seuraa silmän liikkeitä ja paljon muuta.
Joo. OpenCV on BSD-lisensoitu tuote, mikä tarkoittaa, että sitä voidaan käyttää avoimen ja suljetun lähdekoodin projekteissa, harrastus- tai kaupallisissa tuotteissa.
Vaikka dokumentaatiossa ei mainita suoraan, että OpenCV: n sisäinen ei käytä koneoppimista, OpenCV: tä voidaan käyttää koneoppimismallien kouluttamiseen. Se tukee syvällisiä oppimiskehyksiä, kuten TensorFlow, Torch / PyTorch ja Caffe.
OpenCV on alustojen välinen kirjasto, joka on kirjoitettu C / C ++: lla, ja siinä on liitännät C ++: lle, Pythonille ja MatLabille.
Tällä hetkellä tuetut työpöytäympäristöt ovat Windows, Linux, MacOS, FreeBSD ja OpenBSD. Mobiilialustat ovat Android, Maemo ja iOS.
Joo. Vuonna 2010 oli uusi moduuli, joka tarjosi GPU-kiihdytyksen. Se kattaa merkittävän osan kirjaston toiminnallisuudesta ja on edelleen aktiivisessa kehityksessä.
Joo. Vuonna 2011 kirjastoon lisättiin uusi moduuli, joka tarjoaa OpenCL-kiihdytyksiä OpenCV-algoritmeille, ja tämä mahdollisti OpenCV-pohjaisen koodin hyödyntämällä heterogeenistä laitteistoa.