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.pyios папка дистрибутива), указывая на выходной каталог по вашему выбору. обязательно иметь актуальную копию 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

enter image description here .файл mm запустить в компиляторе C++ в iOS, так это не показать ошибку.