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?
Ответы
Ответ 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
.mm запустить файл в компиляторе С++ в iOS, чтобы он не отображал ошибку.