понедельник, 22 июля 2013 г.

Собираем OpenCV для Windows RT (ARM)

С выходом Windows 8 полку поддерживаемых Windows архитектур прибыло. Новичок в этой компании после x86, AMD64 и Itanium мобильная платформа на ARM-v7a. Недавний выпуск релиз OpenCV порадовал нас более полной поддержкой этой платформы и первым примером использования. Эта заметка - маленькое руководство о том как скомпилировать OpenCV для Windows RT на ARM.
Для счастья нам понадобится десктоп с Windows 8 и только с ней, семёрка не подойдёт. Далее нужны будут Visual Studio 2012, Windows Platform SDK и cmake. Кроме того, понадобится любой из билд инструментов nmake, make, ninja, что у вас есть и что вам по вкусу. Это минимальный набор инструментов. Полезно, но не обязательно иметь под рукой git, если захочется собрать актуальную версию из репозитория или внести свой вклад в библиотеку.
Как только инструмент готов - можно начинать. У меня в качестве билд утилиты ninja, но всё то же самое будут работать и с nmake и make, надо только поменять параметр -G у cmake'a. Ninja работает заметно быстрее, чем названные конкуренты и не имеет проблем с многопоточным билдом, что не может не радовать.
Открываем консоль разработчика и переходим в папочку с исходниками OpenCV. У меня это D:\Projects\OpenCV:
d:
cd Projects\OpenCV
Upd: Обрашаю внимание, здесь на нужна Visual Studio Developer Console, а не обычный cmd.exe. В ней уже выставлены базовые параметры окружения.

Далее создаём здесь билд каталог и переходим в него:
mkdir build_winrt
cd build_winrt
Выставляем правильное окружение командой:
"C:\Program Files\Microsoft Visual Studio 11.0\VC\bin\x86_arm\vcvarsx86_arm.bat"
Дело в том, что cmake пока (версия 2.8.11.1) не подружился с Windows RT, приходится обманывать его и выставлять платформу, компилятор и прочее не средствами cmake, а через переменные окружения.
Когда билд каталог готов и окружение настроено, запускам cmake:
cmake -GNinja -DWITH_TBB=ON -DBUILD_TBB=ON -DBUILD_opencv_gpu=OFF \
-DBUILD_opencv_python=OFF -DBUILD_opencv_java=OFF -DWITH_FFMPEG=OFF \
-DWITH_WIN32UI=OFF -DWITH_VFW=OFF -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=..\platforms\winrt\arm.winrt.toolchain.cmake ..
Хотя я и сказал, что компилятор и платформа выставляются через переменные окружения, для удачной сборки нужны дополнительные флаги компилятору и линкеру, которые выставляются в псевдо-тулчейне.
Далее запускаем make/nmake/ninja и ждём окончания билда. Я запускаю построение для цели install, чтобы потом было удобнее подключать OpenCV к своему проекту.
ninja install
Собственно всё! В директории install мы получили все необходимые заголовки и библиотеки необходимые для создания своего приложения с OpenCV.
У меня все работает отлично и проходят все тесты, но не смотря на это есть некоторое количество нерешённых проблем. Главная из них - Win32 API, используемый в core и highgui. Хотя от highgui можно легко избавится, вопрос с core остаётся открытым. Работа над этой проблемой идёт. Будет наедятся, что следующий релиз библиотеки будет успешно проходить все необходимые проверки.