През последните няколко години средната производителност на мобилния телефон се е увеличила значително. Независимо дали става въпрос за чиста мощност на процесора или капацитет на RAM, сега е по-лесно да се извършват тежки изчисления на мобилен хардуер. Въпреки че тези мобилни технологии се насочват в правилната посока, все още има много да се направи на мобилните платформи, особено с появата на добавена реалност, виртуална реалност и изкуствен интелект.
Основно предизвикателство в компютърното зрение е откриването на обекти, представляващи интерес в изображенията. Човешкото око и мозък вършат изключителна работа и копиране на това в машини все още е мечта. През последните десетилетия бяха разработени подходи, които имитират това в машините, и то се подобрява.
В този урок ще изследваме алгоритъм, използван за откриване на петна в изображения. Също така ще използваме алгоритъма от библиотеката с отворен код, OpenCV, за да внедрим прототип за iPhone приложение който използва задната камера за заснемане на изображения и откриване на обекти в тях.
OpenCV е библиотека с отворен код, която осигурява внедряване на основните алгоритми за компютърно зрение и машинно обучение. Ако искате да внедрите приложение за откриване на лица, игрални карти на покер маса или дори просто приложение за добавяне на ефекти върху произволно изображение, тогава OpenCV е чудесен избор.
OpenCV е написан на C / C ++ и има библиотеки за обвивки за всички основни платформи. Това го прави особено лесен за използване в рамките на iOS среда . За да го използвате в рамките на Objective-C iOS приложение , изтеглете OpenCV iOS Framework от официалния уебсайт . Моля, уверете се, че използвате версия 2.4.11 на OpenCV за iOS (която тази статия предполага, че използвате), тъй като най-новата версия, 3.0, има някои промени, които нарушават съвместимостта в организирането на заглавните файлове. Подробна информация за това как да го инсталирате е документиран на уебсайта си .
MSER , съкратено от Максимално стабилни екстремни региони, е един от многото налични методи за откриване на петна в изображения. С прости думи, алгоритъмът идентифицира непрекъснати набори от пиксели, чиято интензивност на външната граница на пикселите е по-висока (с даден праг) от интензивността на вътрешната граница на пикселите. За такива региони се казва, че са максимално стабилни, ако не се променят много при различен интензитет.
Макар и редица други алгоритми за откриване на петна съществува, MSER е избран тук, защото има доста лека сложност при изпълнение (O log (log (n))), където n е общият брой на пикселите на изображението. Алгоритъмът също така е надежден за размазване и мащабиране, което е изгодно, когато става въпрос за обработка на изображения, получени чрез източници в реално време, като камерата на мобилния телефон.
За целите на този урок ще проектираме приложение за откриване на логото на ApeeScape. Символът има остри ъгли и това може да накара човек да се замисли колко ефективни могат да бъдат алгоритмите за откриване на ъгли при откриване на логото на ApeeScape. В крайна сметка такъв алгоритъм е едновременно лесен за използване и разбиране. Въпреки че методите, базирани на ъгли, могат да имат висока степен на успех, когато става въпрос за откриване на обекти, които са ясно отделени от фона (като черни обекти на бял фон), би било трудно да се постигне откриване в реално време на ApeeScape лого върху изображения от реалния свят, където алгоритъмът непрекъснато ще открива стотици ъгли.
C++ учебни проекти
За всеки кадър от изображението, което приложението придобива чрез камерата, се преобразува първо в скала на сивото. Изображенията в сивата скала имат само един цветен канал, но въпреки това логото ще бъде видимо. Това улеснява алгоритъма да се справи с изображението и значително намалява количеството данни, които алгоритъмът трябва да обработва, за почти никаква допълнителна печалба.
След това ще използваме алгоритъма за реализация на OpenCV, за да извлечем всички MSER. След това всеки MSER ще бъде нормализиран чрез трансформиране на неговия минимален ограничаващ правоъгълник в квадрат. Тази стъпка е важна, тъй като логото може да бъде придобито от различни ъгли и разстояния и това ще увеличи толерантността към изкривяване на перспективата.
Освен това за всеки MSER се изчисляват редица свойства:
google cloud API за естествен език
За да се открие логото на ApeeScape в изображение, свойствата на всички MSER се сравняват с вече научените свойства на логото на ApeeScape. За целите на този урок, максимално допустимите разлики за всяко свойство бяха избрани емпирично.
И накрая, като резултат се избира най-сходният регион.
Използването на OpenCV от iOS е лесно. Ако все още не сте го направили, ето кратко описание на стъпките, свързани с настройването на Xcode за създаване на приложение за iOS и използване на OpenCV в него:
Създайте ново име на проект „SuperCool Logo Detector.“ Като език оставете Objective-C избран.
Добавете нов файл с заглавка на префикс (.pch) и го наречете PrefixHeader.pch
Влезте в проект „Избор на лого на SuperCool Logo Detector“ и в раздела „Настройки за изграждане“ намерете настройката „Префиксни заглавки“. Можете да го намерите в раздела LLVM Language или да използвате функцията за търсене.
Добавете “PrefixHeader.pch” към настройката на заглавките на префикса
На този етап, ако не сте инсталирали OpenCV за iOS 2.4.11, направете го сега.
безплатни хакнати кредитни карти с пари по тях 2017 г
Плъзнете и пуснете изтеглената рамка в проекта. Проверете „Свързани рамки и библиотеки“ в настройките на вашата цел. (Трябва да се добави автоматично, но по-добре, за да бъде в безопасност.)
Освен това свържете следните рамки:
Отворете „PrefixHeader.pch“ и добавете следните 3 реда:
#ifdef __cplusplus #include #endif”
Променете разширенията на автоматично създадени кодови файлове от „ .m “до„ .mm ”. OpenCV е написан на C ++ и с * .mm казвате, че ще използвате Objective-C ++.
Импортирайте “opencv2 / highgui / cap_ios.h” в ViewController.h и променете ViewController, за да съответства на протокола CvVideoCameraDelegate:
#import
Отворете Main.storyboard и поставете UIImageView на контролера за първоначален изглед.
Направете изход към ViewController.mm, наречен “imageView”
Създайте променлива „CvVideoCamera * камера;“ в ViewController.h или ViewController.mm и го инициализирайте с препратка към задната камера:
camera = [[CvVideoCamera alloc] initWithParentView: _imageView]; camera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack; camera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480; camera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait; camera.defaultFPS = 30; camera.grayscaleMode = NO; camera.delegate = self;
Ако изградите проекта сега, Xcode ще ви предупреди, че не сте внедрили метода “processImage” от CvVideoCameraDelegate. Засега и за по-голяма простота просто ще вземем изображенията от камерата и ще ги припокрием с обикновен текст:
[camera start];
Сега, ако стартирате приложението, то ще ви поиска разрешение за достъп до камерата. И тогава трябва да видите видео от камерата.
В метода “processImage” добавете следните два реда:
в какво се пише node js
const char* str = [@'ApeeScape' cStringUsingEncoding: NSUTF8StringEncoding]; cv::putText(image, str, cv::Point(100, 100), CV_FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(0, 0, 255));
Това е почти всичко. Сега имате много просто приложение, което рисува текста „ApeeScape“ върху изображения от камерата. Вече можем да изградим нашето целево приложение за откриване на лого от това по-просто. За краткост в тази статия ще обсъдим само шепа кодови сегменти, които са от решаващо значение за разбирането на това как работи приложението като цяло. Кодът на GitHub има доста коментари, за да обясни какво прави всеки сегмент.
как да компилирам c++11
Тъй като приложението има само една цел, да открие логото на ApeeScape, веднага след стартирането му, характеристиките на MSER се извличат от даденото изображение на шаблона и стойностите се съхраняват в паметта:
cv::Mat logo = [ImageUtils cvMatFromUIImage: templateImage]; //get gray image cv::Mat gray; cvtColor(logo, gray, CV_BGRA2GRAY); //mser with maximum area is std::vector maxMser = [ImageUtils maxMser: &gray]; //get 4 vertices of the maxMSER minrect cv::RotatedRect rect = cv::minAreaRect(maxMser); cv::Point2f points[4]; rect.points(points); //normalize image cv::Mat M = [GeometryUtil getPerspectiveMatrix: points toSize: rect.size]; cv::Mat normalizedImage = [GeometryUtil normalizeImage: &gray withTranformationMatrix: &M withSize: rect.size.width]; //get maxMser from normalized image std::vector normalizedMser = [ImageUtils maxMser: &normalizedImage]; //remember the template self.logoTemplate = [[MSERManager sharedInstance] extractFeature: &normalizedMser]; //store the feature [self storeTemplate];
Приложението има само един екран с бутон Старт / Стоп и цялата необходима информация, като FPS и броя на откритите MSER, се изчертава автоматично върху изображението. Докато приложението не е спряно, за всеки кадър на изображението в камерата се извиква следният метод processImage:
-(void)processImage:(cv::Mat &)image { cv::Mat gray; cvtColor(image, gray, CV_BGRA2GRAY); std::vector msers; [[MSERManager sharedInstance] detectRegions: gray intoVector: msers]; if (msers.size() == 0) { return; }; std::vector *bestMser = nil; double bestPoint = 10.0; std::for_each(msers.begin(), msers.end(), [&] (std::vector &mser) { MSERFeature *feature = [[MSERManager sharedInstance] extractFeature: &mser]; if(feature != nil) { if([[MLManager sharedInstance] isApeeScapeLogo: feature] ) { double tmp = [[MLManager sharedInstance] distance: feature ]; if ( bestPoint > tmp ) { bestPoint = tmp; bestMser = &mser; } } } }); if (bestMser) { NSLog(@'minDist: %f', bestPoint); cv::Rect bound = cv::boundingRect(*bestMser); cv::rectangle(image, bound, GREEN, 3); } else { cv::rectangle(image, cv::Rect(0, 0, W, H), RED, 3); } // Omitted debug code [FPS draw: image]; }
Този метод по същество създава копие на сивото в оригиналното изображение. Той идентифицира всички MSER и извлича съответните им характеристики, оценява всеки MSER за сходство с шаблона и избира най-добрия. И накрая, той очертава зелена граница около най-добрия MSER и наслагва изображението с мета информация.
По-долу са дефинициите на няколко важни класа и техните методи в това приложение. Целите им са описани в коментари.
/* This static class provides perspective transformation function */ @interface GeometryUtil : NSObject /* Return perspective transformation matrix for given points to square with origin [0,0] and with size (size.width, size.width) */ + (cv::Mat) getPerspectiveMatrix: (cv::Point2f[]) points toSize: (cv::Size2f) size; /* Returns new perspecivly transformed image with given size */ + (cv::Mat) normalizeImage: (cv::Mat *) image withTranformationMatrix: (cv::Mat *) M withSize: (float) size; @end
/* Singelton class providing function related to msers */ @interface MSERManager : NSObject + (MSERManager *) sharedInstance; /* Extracts all msers into provided vector */ - (void) detectRegions: (cv::Mat &) gray intoVector: (std::vector &) vector; /* Extracts feature from the mser. For some MSERs feature can be NULL !!! */ - (MSERFeature *) extractFeature: (std::vector *) mser; @end
/* This singleton class wraps object recognition function */ @interface MLManager : NSObject + (MLManager *) sharedInstance; /* Stores feature from the biggest MSER in the templateImage */ - (void) learn: (UIImage *) templateImage; /* Sum of the differences between logo feature and given feature */ - (double) distance: (MSERFeature *) feature; /* Returns true if the given feature is similar to the one learned from the template */ - (BOOL) isApeeScapeLogo: (MSERFeature *) feature; @end
След като всичко е свързано заедно, с това приложение трябва да можете да използвате камерата на вашето iOS устройство, за да откриете логото на ApeeScape от различни ъгли и ориентации.
В тази статия показахме колко лесно е да се открият прости обекти от изображение с помощта на OpenCV. Целият код е на разположение на GitHub . Чувствайте се свободни да разклонявате и изпращате заявки за изпращане, тъй като вноските са добре дошли.
Както е вярно за всички проблеми с машинното обучение, степента на успех на откриването на логото в това приложение може да бъде увеличена чрез използване на различен набор от функции и различен метод за класификация на обектите. Надявам се обаче, че тази статия ще ви помогне да започнете с откриването на обекти с помощта на MSER и приложенията на техниките за компютърно зрение, като цяло.