Як було зроблено проект - M-Research/OpenCVLunohod GitHub Wiki
Мета проекту
Створити рухому платформу, що буде об’іжджати перешкоди. Технічна база - плата Adruino з датчиком перешкод і моторами, планшет Nexus 7 з OpenCV Android Tegra. Камера планшета має оброблювати відеопотік і визначати перешкоди, давати сигнал-рішення платі щодо повороту.
Встановлення середовища розробки під Ubuntu
Багато підводних каменів. Встановлюємо компоненти окремо
- OpenCV 2.4.5 Android SDK
- Android SDK with 4.2.2
- Android NDK
- Eclipse (Juno or Indigo)
- Eclipse ADT Plugin
- Eclipse C++ Dev Plugins
Додавання проекту в workspace
З папки OpenCV SDK з папки sdk імпортуємо проект. Треба імпортувати проект OpenCV Library як бібліотечний, і семпли. В папці семплів створюємо окрему папку і там розгортаємо скачаний репозиторій. Заходимо у всі проекти, Properties->C++ Build i там замінюємо імена з**.cmd** на імена скриптів без ціього розширення. Далі в проектах на вкладках **Properties-> Android **Відмічаємо існуючу в Вас встановлену версію Android API. Проект семплів, як і даний, має включати проект OpenCV як бібліотечний. На всякий випадок зробити Project-Clean на всіх проектах. Ще, якщо будуть проблеми, одразу після імпорту проектів залізти з консолі в папки і відалити файл .settings
Основні моменти в коді
За основу обробки відео було використано статтю звідси http://www.codeproject.com/Articles/339206/An-Introduction-to-OpenCV-Displaying-and-Manipulat Основні кроки в методі onCameraFrame:
- Віднімання двух фреймів, знаходження різниці absdiff
- Побудова threshold
- Знаходження контурів
- Описування контурів прямокутниками
- Знаходження максимальних прямокутників за площею і їх центру
- Знаходження середнього центру руху на кадрі
- Акумулятор для визначення повороту наліво або направо, залежно від знаходження центрів руху в лівій або правій частині екрану
- Емуляція навігації голосом та текстом на екрані
Проблеми такого рішення
- Поки не приймається рішень з повороту при наближенні перешкоди прямо. Передбачається комбінування з ультразвуковим датчиком на платі
- Багато зовнішніх "шумів" від руху сцени і віддалених предметів. Можна спробувати налаштувати параметри threshold і граничних площ прямокутників контуру. Також можна зважити середній центр руху площами відповідних контурів.
Подальша інтеграція з платою
За допомогою бібліотеки http://code.google.com/p/usb-serial-for-android/. Через звичайний потік вводу-виводу можна розробити найпростіший протокол щодо руху вліво-вправо рухомої платформи залежно від рішень, прийнятих планшетом з камерою. Необхідно розпаяти кабель usb-розетка - usb-розетка, щоб під’єднати плату до планшета.