Неисправность компилятора каркаса iOS openCV 2.4.3 при распознавании некоторых заголовков C++
openCV 2.4.3 / Xcode 4.5.2 / mac osx 10.8.2
Я пытаюсь заставить openCV работать с iOS. Я пытаюсь использовать готовый 2.4.3 фреймворк с openCV.org. Однако я получаю следующие ошибки сборки проекта xcode, которые указывают на то, что компилятор не знает, что он имеет дело с C++, например
#include <list> !'list' file not found
namespace cv !unknown type name 'namespace'
Это касается только следующих заголовочных файлов:
"Opencv2/ несвободные / features2d.hpp"
"Opencv2/ несвободные / nonfree.hpp"
"Opencv2/ видео /video.hpp"
если я не включу эти три файла в opencv.hpp (или где-либо еще), я смогу скомпилировать и использовать openCV. Проблема в том, что мне нужны несвободные файлы, так как я экспериментирую с SURF - который недавно был перемещен в несвободные.
Это действительно двойной вопрос (извините;-)
- как мне убедить компилятор, что это заголовки с ++?
- какие именно заголовки мне нужно использовать SURF?
Обновить
Я клонировал git-репозиторий openCV и создал из этого новый фреймворк. Этот подход ранее не работал, но сегодня я понял, что не использую текущую версию CMAKE. Я использовал CMAKE 2.8.2, и я не смог собрать opencv для ios. Текущая версия CMAKE 2.8.10 собирает его без каких-либо проблем (это наглядный урок подчинения документам, которые говорят, что требуется CMAKE min. V2.8.8).
Теперь, когда я добавляю эту текущую сборку фреймворка opencv в проект Xcode, я могу включить features2d и несвободные и выполнять плавную сборку. Единственная проблема остается с одним заголовком: video/background_segm.hpp
, который по-прежнему дает:
#include <list> !'list' file not found
Если я прокомментирую эту строку, я получу ошибку в следующей строке:
namespace cv !unknown type name 'namespace'
Кажется очевидным, что компилятор не распознает это как заголовок C++, даже если он имеет суффикс .hpp
,
В opencv2/video/video.hpp
если я удалю
#include "opencv2/video/background_segm.hpp"
Я могу построить с video.hpp
также (хотя я думаю, что это было бы непригодно на практике).
К сожалению, я до сих пор не могу заставить SURF работать. Когда я запускаю проект, он вылетает с этой ошибкой:
Ошибка OpenCV: функция / функция не реализована (OpenCV был создан без поддержки SURF)
Это срабатывает в legacy/features2d.cpp
:
Ptr<Feature2D> surf = Algorithm::create<Feature2D>("Feature2D.SURF");
if( surf.empty() )
CV_Error(CV_StsNotImplemented, "OpenCV was built without SURF support");
Вопросы остаются...
- как мне убедить компилятор в том, что
background_segm.hpp
такое законный заголовок C++? - как включить поддержку SURF?
2 ответа
У меня все работает сейчас. После того, как я не испытывал радости от встроенной библиотеки iOS, доступной на openCV.org, я сделал это...
скомпилируйте openCV для iOS из клона репозитория gitHub. Бежать
build_framework.py
(вios
папку дистрибутива), указывая на выходной каталог по вашему выбору. Будьте уверены, что у вас есть актуальная копия CMake, иначе вы перестанете, как я.Ваша выходная папка будет иметь две подпапки,
build
а такжеopencv2.framework
, Перетащите последний в ваш проект Xcode
Добавьте следующую строку в project-Prefix.pch
файл
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
(должен идти выше #ifdef __OBJC__
линия)
Этого достаточно, чтобы получить большую часть работы openCV. Тем не менее, это очень хорошая идея, чтобы избежать "target-C++" (смешивая ваш код C++ в тех же файлах, что и ваш target-C). Чтобы справиться с этим, вы создаете тонкий объект-обертку (который будет obj-C++) для посредничества между вашими классами obj-C и кодом C++. По сути, оболочка выполняет только две роли: переводить форматы данных (например, UIImage <-> cv:: Mat) и выполнять перевод между методами obj-C и вызовами функций C++. Смотрите подробности в моем ответе на этот вопрос (и пример проекта, размещенного на github)
Чтобы заставить работать SURF (и SIFT), требуется пара дополнительных шагов, так как SURF несколько устарел из-за проблем с лицензированием (он был перенесен в nonfree
который не загружается автоматически).
Эти включения должны быть добавлены в файлы, где вы используете SURF
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/compat.hpp>
Код, с которым я работаю, использует интерфейсы C для SURF (например, cvExtractSURF
), поэтому нам также нужно добавить эту строку перед вызовом этих функций:
cv::initModule_nonfree();
Другая часть моего вопроса, как заставить XCode компилироваться как C++, была чем-то вроде красной сельди (должно быть, что-то было проблемой совместимости со сборкой openCV, которую я использовал) - и больше не требуется для этого решения. Однако сначала ответом является переименование ваших файлов.m.mm (для Objective-C++) или.cpp (для чистого C++)... но если это не сработает, вы можете вызвать проблему в инспекторе файлов, изменив файл тип'.
Обновить
Вы также должны позаботиться о том, чтобы стандартная библиотека C++ была правильно установлена в любых проектах, использующих каркас openCV. Старые версии openCV (to.2.4.2) хотят libstdc++
, новее (2.4.3+) ожидаем libc++
, Подробности здесь:
/questions/12180830/kak-ustranit-oshibki-ios-link-s-pomoschyu-opencv/12180836#12180836
обновление 2
openCV теперь устанавливается с CocoaPods. Цитировать Себастьена Тибо
OpenCV доступен на Cocoapods. Добавьте одну строку в ваш Podfile: pod 'OpenCV'. Довольно легко.
"Довольно просто" ... учитывая все наши предыдущие неприятности, может быть преуменьшение [прошлого] года...
Класс реализации openCV просто добавьте.m к.mm в качестве файла реализации.
#import <UIKit/UIKit.h>
#import <opencv2/opencv.hpp>
@interface ViewController : UIViewController
@end
.mm файл запускается в компиляторе C++ в iOS, поэтому он не показывает ошибку.