Подтвердить что ты не робот

OpenCV 2.4.3 Исходный компилятор iOS не распознает некоторые заголовки С++

openCV 2.4.3/Xcode 4.5.2/mac osx 10.8.2

Я пытаюсь открыть openCV с iOS. Я пытаюсь использовать предустановленную структуру 2.4.3 с openCV.org. Однако я получаю следующие ошибки построения проекта xcode, которые предполагают, что компилятор не знает, что он имеет дело с С++, например

#include <list>       !'list' file not found

namespace cv          !unknown type name 'namespace'

Это похоже только на следующие заголовочные файлы:
"Opencv2/несвободные/features2d.hpp"
"Opencv2/несвободные/nonfree.hpp"
"opencv2/video/video.hpp"

Если я не включу эти три файла в opencv.hpp(или где-нибудь еще), я, похоже, могу скомпилировать и использовать openCV ok. Беда в том, что мне нужны бесполезные файлы, поскольку я экспериментирую с SURF, который недавно был перенесен в незащищенный.

Это действительно двоякий вопрос (извините; -)

  • Как мне убедить компилятор, что это заголовки С++?
  • который содержит заголовки, нужно ли мне использовать SURF?

Обновление

Я клонировал репозиторий openCV git и создал из него новую структуру. Этот подход не работал ранее, но сегодня я понял, что не использовал текущую версию CMAKE. Я использовал CMAKE 2.8.2, и это не смогло бы создать opencv для ios. Текущая версия CMAKE 2.8.10 строит ее без каких-либо проблем (требуется, чтобы объектный урок в соответствии с документами, которые говорят, что требуется CMAKE min. V2.8.8).

Теперь, когда я добавляю эту текущую сборку opencv framework в проекте Xcode, я могу включить функции2d, а также без ограничений и построить плавно. Единственная проблема остается с одним заголовком: video/background_segm.hpp, который все еще дает:

#include <list>       !'list' file not found

Если я прокомментирую эту строку, я получаю сообщение об ошибке на следующей строке:

namespace cv          !unknown type name 'namespace'

Кажется очевидным, что компилятор не распознает это как заголовок С++, хотя он суффикс .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 является законным заголовком С++?
  • Как включить поддержку SURF?
4b9b3361

Ответ 1

У меня все работает сейчас. После того, как я не получил радости от встроенной библиотеки 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. Однако очень рекомендуется избегать "objective-C ++" (смешение вашего кода на С++ в тех же файлах, что и ваш objective-C). Чтобы управлять этим, вы создаете тонкий объект "обертка" (который будет obj-С++) для посредничества между вашими объектами obj-C и кодом С++. Обертка по существу имеет только две роли: переводить форматы данных (например, UIImage ↔ cv:: Mat) и переводить между obj-C-методами и вызовами функций С++. См. мой ответ на этот вопрос для получения подробной информации (и пример проекта с поддержкой github)

Для работы SURF (и SIFT) требуется несколько дополнительных шагов, так как SURF несколько устарел из-за проблем с лицензированием (это было переместился в nonfree, который не загружается автоматически).

Они включают необходимость добавления в файлы, в которых вы используете SURF

#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/compat.hpp>

В коде, который я использую, используются интерфейсы C для SURF (например, cvExtractSURF), поэтому нам также нужно добавить эту строку перед вызовом этих функций:

   cv::initModule_nonfree();

Другая часть моего вопроса, как заставить Xcode компилироваться как С++, была немного красной селедкой (должно быть, была проблема совместимости с конструкцией openCV, которую я использовал) - и больше не требуется для этого решение. Однако сначала нужно переименовать ваши .m файлы .mm(для objective-C ++) или .cpp(для чистого С++)... но если это не сработает, вы можете принудительно вызвать проблему в инспекторе файлов, изменив 'тип файла'.

update

Вам также необходимо позаботиться о том, чтобы стандартная библиотека С++ была правильно настроена в любых проектах, использующих инфраструктуру openCV. Старые версии openCV (to.2.4.2) хотят libstdc++, новее (2.4.3+) ожидать libc++. Подробности здесь:

fooobar.com/questions/115321/...

update 2

openCV теперь устанавливается с помощью cocoaPods. Чтобы процитировать SebastienThiebaud

OpenCV доступен на Cocoapods. Добавьте одну строку в свой подфайл: pod 'OpenCV'. Довольно легко.

"Довольно легко"... учитывая все наши предыдущие неприятности, может быть преуменьшением [последнего] года...

Ответ 2

класс реализации openCV просто добавляет .m в .mm как файл реализации.

#import <UIKit/UIKit.h>
#import <opencv2/opencv.hpp>

@interface ViewController : UIViewController

@end

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