170.63
Rating
22 May 2015

Установка OpenCV 3.0.0-rc1 (с использованием IPP и TBB) на Intel Edison Yocto. USB-камера в OpenCV

Intel corporate blogImage processing
Translation
Tutorial
Original author: JON J K. (Intel)
Плата Intel Edison обладает достаточной вычислительной мощностью, поэтому было бы логично использовать все её возможности. Одна из ресурсоемких задач это компьютерное зрение.
В этой статье мы опишем, как собрать и установить библиотеку OpenCV на плату Intel Edison и подключить USB-камеру. OpenCV мы соберём с включенным IPP и TBB, что позволит библиотеке полностью использовать оба ядра Intel Edison.

Примечание от переводчика


Оригинальная статья описывает работу с предыдущей версией образа Yocto Intel Edison. Сейчас доступен новый вариант образа (edison-image-ww05-15.zip), работа с которым намного проще, так как большинство нужных пакетов уже установлено. В новом образе уже есть cmake, UVC и разделы имеют правильный размер, поэтому описание этих шагов вы можете пропустить. Дополнительно, в перевод добавлен исходный код двух простых примеров для работы с OpenCV и с USB камерой в OpenCV.

Сборка OpenCV на Intel Edison потребует как минимум 2 Гб дополнительной памяти, поэтому надо будет установить microSD карту необходимого объема в слот на плате.

Подготовка образа (старый образ)


Приготовьте стандартный (или специальный с дополнительными пакетами) образ Edison’а используя Board Support Package и Startup Guide. Можете использовать оригинальный образ или настроить свой с дополнительными пакетами.

Включение UVC (USB Video device Class) в ядре Linux (старый образ)


Если вы хотите использовать обычную USB камеру, тогда понадобится включить UVC в ядре Linux’а. Если вы закончили построение своего собственного образа (сделали 'bitbake edison-image'), то теперь вы готовы настроить Linux ядро. Введите на хост машине:

~/edison-src> bitbake virtual/kernel -c menuconfig

Затем найдите и активируйте Device Drivers -> Multimedia support -> Media USB Adapters. Когда настройка будет закончена, замените defconfig содержимым .config, который вы только что изменили. Введите:

~/edison-src> cp /build/tmp/work/edison-poky-linux/linuxyocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standardbuild/.config build/tmp/work/edison-poky-linux/linuxyocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6er0/defconfig

Напоследок выполним bitbake ещё раз:

~/edison-src> bitbake virtual/kernel -c configure -f –v
~/edison-src> bitbake edison-image

Изменение разделов (старый образ)


Если у вас старый образ, рекомендуем изменить стандартное разбиение разделов, потому что размер корневой файловой системы всего 512 Мб, большая часть которой будет занята сразу же. '/home' – занимает всё, что осталось после присоединения заданных разделов, и обычно это более 2 Гб. Поэтому создание обоих разделов по 1.3 Гб будет более разумно.

Посмотрите в файл 'edison-src/device-software/meta-edison-distro/recipes-bsp/u-boot/files/edison.env' (для нового релиза исходников это файл 'edison-src/device-software/meta-edison/recipes-bsp/u-boot/files/edison.env') измените размер Rootfs с 512 Мб до 1312 Мб. В результате размер /home будет сокращен автоматически. Ещё одно изменение надо будет сделать перед повторной записью образа. Это размер rootfs, который устанавливается в 'edison-src/device-software/meta-edison-distro/recipes-core/images/edison-image.bb' и также равен 512 Мб. Измените размер rootfs снова и перестройте образ, выполнив 'bitbake edison-image'. Когда bitbake завершится, выполните:

~/edison-src> /device-software/utils/flash/postBuild.sh

Проверьте, есть ли у вас 'dfu-util'. Если нет, установите:

~/edison-src> sudo apt-get install dfu-util

Сейчас надо записать образ дважды, чтобы применить настройки разделов. Во-первых, выполните:

~/edison-src> /build/toFlash/flashall.sh –recovery

И затем выполните запись без '--recovery'

~/edison-src> /build/toFlash/flashall.sh

После удачного запуска Edison’а, присоедините USB кабель к последовательному порту. Проверьте, какой номер USB устройства получил ваш Edison при соединении с Linux компьютером. Затем подключитесь через ‘screen’ (введите соответствующий номер вместо ‘X’, например, ttyUSBX -> ttyUSB0)

> sudo screen /dev/ttyUSBX 115200

Если вы видите, что Edison удачно загрузился, войдите как ‘root’ и проверьте доступное место, выполнив:

root@edison:~# df –h

Настройка WiFi, пароля для ssh и FTP


После того, как ваш хост компьютер подключился к Edison’у через последовательный порт, выполните:

root@edison:~# configure_edison –setup

Следуйте инструкциям и настройте пароли и WiFi. Если у вас не будет задан пароль, тогда доступ по ssh будет запрещен. Подключите хост компьютер и Edison к одной точке доступа. Для передачи файлов можете использовать любой способ подключения по FTP или SCP.

Убедитесь, что у платы Edison есть доступ в интернет, так как он понадобится при автоматической установке IPP.

Установка CMake (старый образ)


Старый образ Edison’а не поставляется вместе с 'cmake', но он нам потребуется, чтобы собрать OpenCV. Придётся вручную установить его. Один из способов, использовать ‘opkg’. Пользователь AlexT с форума Intel создал репозиторий, описанный в ветке.

AlexT рассказывает как присоединить репозиторий через ‘opkg’. Чтобы Edison’а получал пакеты из репозитория, замените всё, что у вас есть в /etc/opkg/base-feeds.conf следующим (другие конфигурационные файлы opkg изменять не надо):

===/etc/opkg/base-feeds.conf contents below===
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32

===end of /etc/opkg/base-feeds.conf contents===

Введите ‘opkg update’. Вы должны увидеть следующие строки, означающие, что вы успешно подсоединились к репозиторию:

root@edison:~# opkg update
Downloading http://repo.opkg.net/edison/repo/all/Packages.gz.
Inflating http://repo.opkg.net/edison/repo/all/Packages.gz.
Updated list of available packages in /var/lib/opkg/all.
Downloading http://repo.opkg.net/edison/repo/edison/Packages.gz.
Inflating http://repo.opkg.net/edison/repo/edison/Packages.gz.
Updated list of available packages in /var/lib/opkg/edison.
Downloading http://repo.opkg.net/edison/repo/core2-32/Packages.gz.
Inflating http://repo.opkg.net/edison/repo/core2-32/Packages.gz.
Updated list of available packages in /var/lib/opkg/core2-32.

Теперь вы готовы установить CMake. Введите:

root@edison:~# opkg install cmake-dev

Введите 'cmake' и вы должны увидеть страницу помощи.

OpenCV 3.0.0


Перед тем, как мы перейдем к самому OpenCV, нам потребуется много свободного места для его построения на Edison. Поэтому нам нужна дополнительная внешняя память, минимум 2 Гб. Мы отформатируем micro SD карточку и подмонтируем ее к Edison’у. Карточку можно отформатировать как сразу на плате, так и на Linux хост машине. Для форматирования карточки на Linux компьютере введите (block_device замените на ваше устройство, например, /dev/mmcblk1 )

> mkfs.ext4 block_device

Или:

> mke4fs -t ext4 block_device

Пометим раздел:

> e4label <block_device> new_label

Вставьте SD карту в Edison и подмонтируйте её:

root@edison:~# mkdir <Desired_DIR>
root@edison:~# mount block_device <Desired_DIR>

Проверьте, что она подмонтировалась без проблем, используя 'df -h'. Для удобства, можно настроить автомонтирование ‘auto mount’. Добавьте /dev/block_device <ваша папка> ' в /etc/fstab.

root@edison:~# vi /etc/fstab

И добавьте '/dev/mmcblk1 /home/ext'



Скачайте OpenCV for Linux 3.0 c официальной страницы OpenCV. Скопируйте полученный zip-файл на Edison через FTP или SCP. Лучше сразу копировать на внешнюю SD карту, так как, когда OpenCV будет построен, он займет более 1 Гб. Распакуйте скачанный файл командой 'unzip opencv-3.0.0-rc1.zip' и проверьте, что папка opencv-3.0.0-rc1 была создана. Перейдите в папку <OpenCV_DIR>, введите 'cmake .' и посмотрите какие опции есть.

Мы включим IPP и TBB для лучшей производительности. Библиотека IPP будет загружена автоматически, когда флаг WITH_IPP будет включен. Этого нельзя сказать о библиотеке TBB. Её надо будет установить вручную. Поэтому, установите пакет TBB на ваш хост компьютер и скопируйте соответствующие файлы на Edison. Если на вашем хост компьютере Linux 64 разрядный, нужно указать i386 когда будете скачивать через apt-get. На вашем хост компьютере введите:

> sudo apt-get install libtbb-dev:i386

И скопируйте файлы в папку /usr/include/tbb на Edison с таким же именем. Также надо скопировать на Edison следующие файлы:

/usr/lib/libtbb.so,
/usr/lib/libtbbmalloc.so, 
/usr/lib/libtbbmalloc_proxy.so
/usr/lib/pkgconfig/tbb.pc

На этой странице, можно посмотреть полный список файлов библиотеки tbb.
Теперь на Edison в <OpenCV_DIR> напечатайте (не забыв ‘.’ точку в конце командной строки)

root@edison:<OpenCV DIR># cmake -D WITH_IPP=ON -D WITH_TBB=ON -D WITH_CUDA=OFF -D WITH_OPENCL=OFF -D BUILD_SHARED_LIBS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF .

Эта команда включает IPP и TBB и выключает всё ненужное. С опцией 'BUILD_SHARED_LIBS=OFF' вы сможете создавать исполняемые программы для запуска без установленного OpenCV. Это может пригодиться, например, при распространении приложений. (Если вам не нужны IPP и TBB используйте WITH_TBB=OFF и WITH_IPP=OFF). В результате конфигурирования вы должны увидеть, что IPP и TBB включены.



Если проблем нет, введите:

root@edison:<OpenCV DIR># make -j2

Полная сборка займет от 30 минут до одного часа. Если вы получили ошибку

'undefined reference to symbol 'v4l2_munmap' ... libv4l2.so.0 : error adding symbols: DSO missing from command line'

при создании OpenCV или примеров OpenCV, тогда надо добавить ‘-lv4l2’ после ‘-lv4l1’ в соответствующие конфигурационные файлы. Подобная ошибка может появиться в более чем 50 файлах, поэтому будет лучше сделать эту замену следующей командой:

root@edison:<OpenCV_DIR># grep -rl -- -lv4l1 samples/* modules/* | xargs sed -i ‘s/-lv4l1/-lv4l1 -lv4l2/g’

Когда сборка закончится, установите то, что построили:

root@edison:<OpenCV_DIR># make install

Установки TBB без компьютера с Linux


У вас может не быть в наличии машины с Linux. Здесь описан вариант такой установки TBB.
Скачайте TBB с сайта www.threadingbuildingblocks.org, это tgz архив. Распакуйте. Нам понадобится две папки, которые надо будет скопировать на Edison.

<DIR>/include/tbb

Всё её содержимое надо будет скопировать на плату Edison в /usr/include/tbb

<DIR>/lib/ia32/gcc4.4/

И её содержимое надо будет скопировать на плату Edison в /usr/lib настроив правильно линки на библиотечные so-файлы.

Создание приложений с использованием OpenCV 3.0.0-rc1


Самый лёгкий способ создать простое OpenCV приложение это использовать примеры, которые идут вместе с библиотекой.
Перейдите в папку '/samples' и введите:

root@edison:<OpenCV DIR>/samples# cmake .

всё будет сконфигурировано и готово для компиляции примеров. Теперь вы можете заменить один из файлов с примерами в 'samples/cpp' и построить его через cmake. Например, вы можете заменить 'image.cpp' вашим собственным кодом. Сначала сделайте резервную копию оригинального файла:

root@edison:<OpenCV DIR>/samples/cpp# cp image.cpp image_orig.cpp

Замените image.cpp следующим кодом:
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
    const char* imagename = "../data/lena.jpg";

    Mat img = imread(imagename);
    if(img.empty())
    {
        cout<<"Can’t load image "<<imagename<<endl;
        return -1;
    }

    cout<<"Image read ok"<<endl;

    Mat gray_image;
    cvtColor( img, gray_image, CV_BGR2GRAY );

    if( ! imwrite( "../data/test_gray_Image.jpg", gray_image ) )
    {
        cout<<"Can't write image"<<endl;
        return -1;
    }

    cout<<"Write image ok"<<endl;

    return 0;
}


В этом примере считывается картинка из файла ‘lena.jpg’, переводится в режим градаций серого и записывается в файл ‘test_gray_Image.jpg’. Поднимемся на один уровень выше и скомпилируем пример:

root@edison:<OpenCV DIR>/samples/cpp# cd ..
root@edison:<OpenCV DIR>/samples# make example_image

Если вы получите ошибку:

'undefined reference to symbol 'v4l2_munmap' ... libv4l2.so.0 : error adding symbols: DSO missing from command line'

пока строите OpenCV или примеры OpenCV, надо будет добавить ‘-lv4l2’ после ‘-lv4l1’ в соответствующие конфигурационные файлы. Подобная ошибка может появиться в более чем 50 файлах, поэтому будет лучше сделать эту замену следующей командой:

root@edison:<OpenCV_DIR># grep -rl -- -lv4l1 samples/* modules/* | xargs sed -i ‘s/-lv4l1/-lv4l1 -lv4l2/g’

Запустим:

root@edison:<OpenCV DIR>/samples# cd cpp
root@edison:<OpenCV DIR>/samples/cpp#./cpp-example-image

Если всё нормально, на экране появится:

Write image ok

И в папке:

<OPENCV_DIR>/samples/data

Должен появиться файл:

test_gray_Image.jpg

Скопируйте его на хост компьютер и посмотрите. И, если видишь, что с картины смотрит кто-нибудь на нас, или принц в плаще старинном… Но лучше, если это будет черно-белая Лена, что означает, что OpenCV работает.

И ещё, так как Edison не имеет видеовыхода, будет ошибка, если в коде будет вывод на графический экран. Например, не получится использовать 'imshow', который создает и показывает изображение или видео.

Взглянем на мир


Проверим работу OpenCV с камерой. Проще всего использовать камеру, которая работает в Linux и совместима с UVC.
Для подключения камеры по USB надо передвинуть на плате переключатель SW1, чтобы он находился в стороне полноразмерного USB порта, куда будет подключена камера.



Подключив камеру, можно вывести информацию обо всех USB устройствах:

root@Edison:/# lsusb
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 1871:0141 Aveo Technology Corp.

Последняя строка это как раз наша камера. Проверим, что она может работать по UVC:

root@Edison:/# lsusb -d 1871:0141 -v | grep "14 Video"
      bFunctionClass         14 Video
      bInterfaceClass        14 Video
      bInterfaceClass        14 Video
      bInterfaceClass        14 Video
      bInterfaceClass        14 Video
      bInterfaceClass        14 Video
      bInterfaceClass        14 Video
      bInterfaceClass        14 Video

Если такие строки найдены, то камера поддерживает UVC и её можно использовать в OpenCV. Введите следующий код:

Замените image.cpp следующим кодом:
#include <iostream>
#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;

int main(int, char**)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
    {
        cout<<"Can't open camera"<<endl;
        return -1;
    }

    cout<<"Camare init ok"<<endl;

    Mat img,frame;

    cap >> frame;

    cvtColor(frame, img, CV_BGR2GRAY);

    if( ! imwrite( "../data/test_camera_Image.jpg", img) )
    {
        cout<<"Can't write image"<<endl;
        return -1;
    }

    cout<<"Camera image write OK"<<endl;

    return 0;
}


В данном примере инициализируется камера, с неё получается одно изображение, переводится в черно-белый вариант и записывается в файл.
Если всё работает, можете использовать камеру в OpenCV.

Дополнительные ссылки:


facedetect.zip (13.81 MB)
mjpg-streamer-for-Edison.zip (957.36 KB)
VTune-Result-Edison.zip (1.07 MB)

Предыдущие публикации:


Воспроизведение звука на Intel Edison через Bluetooth с использованием Advanced Audio Distribution Profile (A2DP)
Практикум «Intel IoT». Edison — могучая «кроха»
Tags:intel edisonbluetoothiotinternet of thingsedisongalileoopencv
Hubs: Intel corporate blog Image processing
+18
14.5k 76
Comments 10
Information
Founded

18 August 1968

Location

США

Employees

5,001–10,000 employees

Registered

9 August 2008