OpenCV 2.4.3 проблема компилятора iOS framework с распознаванием некоторых заголовков c++
openCV 2.4.3 / Xcode 4.5.2 / mac osx 10.8.2
Я пытаюсь заставить openCV работать с iOS. Я пытаюсь использовать prebuilt 2.4.3 framework из openCV.org - ... Однако я получаю следующие ошибки сборки проекта xcode, которые предполагают, что компилятор не знает, что он имеет дело с C++, например
#include <list> !'list' file not found
namespace cv !unknown type name 'namespace'
это касается только следующего заголовка файлы:
"opencv2 / несвободный / features2d.ГЭС"
"opencv2 / несвобода / несвобода.ГЭС"
"opencv2/видео/Видео.ГЭС"
если я не включу эти три файла в opencv.hpp (или где-либо еще) я, похоже, могу компилировать и использовать openCV ok. Проблема в том, что мне нужны несвободные файлы, поскольку я экспериментирую с SURF, который недавно был перемещен в несвободный.
это действительно двойной вопрос (Извините ; -)
- как мне убедить компилятор, что это заголовки c++?
- какие заголовки именно мне нужно использовать SURF?
обновление
я клонировал репозиторий openCV git и построил из него новую структуру. Раньше этот подход не работал, но сегодня я понял, что не использую текущую версию CMAKE. Я использовал CMAKE 2.8.2, и это не смогло бы построить opencv для ios. Текущая версия CMAKE 2.8.10 строит его без каких-либо проблем (это предметный урок в подчинении документам, которые говорят CMAKE min. П2.8.8 требуется).
теперь, когда я добавляю эту текущую сборку платформы opencv в проект Xcode, я могу включить features2d и несвободные и построить гладко. Единственная проблема остается с одним заголовком: video/background_segm.hpp
, который все еще дает:
#include <list> !'list' file not found
если я комментарий это line out я получаю сообщение об ошибке в следующей строке:
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
добавить следующую строку
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
(должно идти выше the #ifdef __OBJC__
строка)
этого достаточно, чтобы заставить большую часть openCV работать. Однако это очень хорошая идея, чтобы избежать "objective-C++" (смешивание кода c++ в тех же файлах, что и ваш objective-C). Для управления этим вы создаете тонкую " обертку" объект (который будет obj-C++) для посредничества между вашими классами obj-C и кодом C++. Оболочка по существу имеет только две роли: для перевода форматов данных (например, UIImage cv:: Mat) и для перевода между методами obj-C и вызовами функций c++. См.мой ответ на этот вопрос для деталей (и GitHub-размещенный пример проекта)
чтобы получить серфинг (и просеять), требуется несколько дополнительных шагов, так как SURF несколько устарел из-за лицензирования вопросы (он был перемещен в nonfree
, который не загружается автоматически).
они включают в себя должны быть добавлены в файлы, где вы используете SURF
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/compat.hpp>
код, с которым я работаю, использует интерфейсы C для SURF (например,cvExtractSURF
), поэтому нам также нужно добавить эту строку перед вызовом этих функций:
cv::initModule_nonfree();
другая часть моего вопроса, как заставить Xcode компилироваться как C++, была немного отвлекающей (должно быть, что-то проблема совместимости с сборкой openCV, которую я использовал) - и больше не требуется для этого решения. Однако ответ Первый, чтобы переименовать ваш .M файлов .мм (для objective-C++) или .cpp (для чистого C++) ... но если это не работает, вы можете заставить проблему в инспекторе файлов, изменив "тип файла".
обновление
вам также необходимо позаботиться о том, чтобы стандартная библиотека C++ была правильно установлена в любых проектах, использующих платформу openCV. Более старый версии openCV (to.2.4.2) хочу!--11--> новые (2.4.3+) ожидать libc++
. Подробности здесь:
https://stackoverflow.com/a/14186883/1375695
обновление 2
openCV теперь устанавливается с cocoaPods. Цитата SebastienThiebaud
OpenCV доступно на Cocoapods. Добавьте одну строку в свой Подфайл: pod 'OpenCV'. Довольно легкий.
"довольно легко" ... учитывая все наши предыдущие неприятности, это может быть преуменьшение [прошлого] года...
класс реализации openCV просто добавьте .m to .mm как файл реализации.
#import <UIKit/UIKit.h>
#import <opencv2/opencv.hpp>
@interface ViewController : UIViewController
@end
.файл mm запустить в компиляторе C++ в iOS, так это не показать ошибку.