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

Другие вопросы по тегам