Установка Open CV (Linux). Установка Open CV (Linux) Установка opencv на raspberry pi

  1. omar

    hello, having a problem about Step 7: Finally Ready to be Compile just output
    “make: *** No target specified and no makefile found. stop”

    How can i solve this problem

  2. Rodo

    Thank you very much, bro! Your post is informative and clear for newbie like me ^^.

  3. jim

    This is failing when installing on a fresh install of stretch-lite:sudo pip3 install numpy The message is “sudo: pip3: command not found” I’m not sure what the work around is.

  4. Rafael

    Hello Excellent work. I have a question, it is possible to have OpenCV installed simultaneously for the two Python 2.7 & 3.5, greetings.

  5. Kazim

    Great Tutorial!! Thanks a bunch, looking forward to more in the future!

  6. Alexander

    Is there a way to copy the compiled files onto an other Raspberry(same model)? I want to avoid recompilation on a different pi

  7. Josué Juárez

    Gracias sigue haciendo tu trabajo
    Thank you, keep doing your job

  8. rubentxo

    I want to thank for your step by step tutorial! It’s the best one!
    Great work!!! I’ll follow your blog!

  9. dongo

    hello, i have a problem step 5
    github not found

  10. Francesco Garavaglia

    Hi!
    I’m having problems with Step 10: Testing OpenCV 3.4.0 install
    This is what I get:

    pi@raspberrypi:~ $ python3
    Python 3.5.3 (default, Jan 19 2017, 14:11:04)
    on linux
    Type “help”, “copyright”, “credits” or “license” for more information.
    >>> import cv2
    Traceback (most recent call last):
    File “”, line 1, in
    File “/home/pi/.local/lib/python3.5/site-packages/cv2/__init__.py”, line 4, in
    from .cv2 import *
    ImportError: libQtGui.so.4: cannot open shared object file: No such file or directory

    1. Life2Coding Post author

      Watch the youtube video tutorial properly. I think you missed any of the steps that why it is not getting the OpenCV Library

      1. Francesco Garavaglia

        I retried, but nothing changes. I saw that the unique difference occurs during “Step 6: Compile and Install OpenCV 3.4.0 for Python 3” when I got this:

        — Python 3:
        — Interpreter: /usr/bin/python3 (ver 3.5.3)
        — Libraries: /usr/lib/arm-linux-gnueabihf/libpython3.5m.so (ver 3.5.3)
        — numpy: /home/pi/.local/lib/python3.5/site-packages/numpy/core/include (ver 1.14.2)
        — packages path: lib/python3.5/dist-packages

        Looking at numpy I got site-packages instead of dist-packages. I think that’s the problem!
        What do you think? Sorry, but I’m a newbie 🙂

        1. Francesco Garavaglia
          1. Nithin Bharadwaj

            Could you please elaborate on how you solved the above issue? I am getting the same error, and am not able to resolve it. Please help!

          2. Elliot Harris

            Hi Francesco how did you resolve this issue

          3. Aethan

            Same as Nithin. We have the same issue and wonder what you did to fix it. Can you or Life2Coding explain us what to do ?

          4. Life2Coding Post author

            What is yours’ exact problem? Can you elaborate a little bit?

          5. Nitin Shrivastava
        2. D@R:-)

          sudo apt install libqt4-test

  11. Matt Miller

    Thanks for making a Python3 set of instructions
    I used make instead of make -j4 as I’ve had problems in the past compiling previous versions of openCV and it worked 1st time.

  12. Steven Blue

    at the end of step 6 i get (configuring incomplete, errors occured!)
    what can i do about that???

  13. hung

    Hi I Install Image I/O packages

    sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev -y

    An error occurred…….

    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Package libpng12-dev is not available, but is referred to by another package.

    E: Unable to locate package libjasper-dev
    E: Package ‘libpng12-dev’ has no installation candidate

  14. hilda

    at step 1 i got (Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway)
    because i installed using NOOBS , should i install raspbian stretch ? please help me, thankyou

  15. Nithin Bharadwaj

    Hi,
    I am receiving the same error. I did a clean installation of OpenCV 3.4 on Raspberry Pi 3. After the installation, I went into the Python3 virtualenv and checked for OpenCV installation by doing, “import CV2” and then a “cv2.__version__”. It worked when I was inside the OpenCV build folder. Now, I came out of it and am in the home directory, and I get a syntax error for “Import cv2”. Please help.

  16. Vishal Kaul

    Thanks for the post, it’s helpful!

  17. Trong Hai

    Thanks. Your post helps me so much.

  18. sleman

    i followed your steps in this tutorial to use opencv in face recognition but when i use the command
    recognizer = cv2.createLBPHFaceRecognizer()
    or
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    it gives me errors

  19. Vaisakh

    [ 65%] Linking CXX executable ../../bin/opencv_traincascade
    ../../lib/libopencv_imgcodecs.so.3.4.0: undefined reference to WebPFlipBuffer"
    ../../lib/libopencv_core.so.3.4.0: undefined reference to carotene_o4t::absDiff(carotene_o4t::Size2D const&, unsigned char const*, int, unsigned char const*, int, unsigned char*, int)’
    ../../lib/libopencv_imgcodecs.so.3.4.0: undefined reference to WebPDeallocateAlphaMemory"
    ../../lib/libopencv_core.so.3.4.0: undefined reference to carotene_o4t::absDiff(carotene_o4t::Size2D const&, unsigned short const*, int, unsigned short const*, int, unsigned short*, int)’
    ../../lib/libopencv_core.so.3.4.0: undefined reference to carotene_o4t::absDiff(carotene_o4t::Size2D const&, signed char const*, int, signed char const*, int, signed char*, int)"
    ../../lib/libopencv_imgcodecs.so.3.4.0: undefined reference to WebPAvoidSlowMemory’
    ../../lib/libopencv_core.so.3.4.0: undefined reference to carotene_o4t::absDiff(carotene_o4t::Size2D const&, float const*, int, float const*, int, float*, int)"
    ../../lib/libopencv_imgcodecs.so.3.4.0: undefined reference to WebPCopyDecBuffer’
    ../../lib/libopencv_imgcodecs.so.3.4.0: undefined reference to WebPAllocateDecBuffer"
    ../../lib/libopencv_imgcodecs.so.3.4.0: undefined reference to WebPCopyDecBufferPixels’
    ../../lib/libopencv_core.so.3.4.0: undefined reference to carotene_o4t::absDiff(carotene_o4t::Size2D const&, short const*, int, short const*, int, short*, int)"
    ../../lib/libopencv_core.so.3.4.0: undefined reference to carotene_o4t::absDiff(carotene_o4t::Size2D const&, int const*, int, int const*, int, int*, int)’
    ../../lib/libopencv_imgcodecs.so.3.4.0: undefined reference to `VP8DecompressAlphaRows’

    apps/traincascade/CMakeFiles/opencv_traincascade.dir/build.make:389: recipe for target ‘bin/opencv_traincascade’ failed

    i got this error when i was installing opencv on my rpi b+ model running with rasbian stretch. please help me

  20. Iker

    I have a problem in the step 9.

    pip pip-10.0.1.dist-info

  21. Nathaniel

    Just make sure you have some way of cooling your pi down because it will get really hot!

  22. Nitin Shrivastava

    CMake Error: The source directory “/home/pi” does not appear to contain CMakeLists.txt.

    it shows this error….please help

  23. wannaBrobot

    Great tutorial, best I’ve seen! Here is a tip for anyone getting the

    E: Unable to locate package ______
    E: Package ‘_______’ has no installation candidate

    error and how I fixed it.

    SPECS:
    Raspberry Pi 3B, OS: Raspbian, Version: 9 (Stretch)

    1) sudo nano /etc/apt/sources.list
    a) Uncomment “deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi”

    2) sudo nano /etc/apt/sources.list.d/raspi.list
    a) Uncomment “deb-src http://archive.raspberrypi.org/debian/ stretch main ui”
    b) Press ctrl-o, then enter, then ctrl-x

    3) sudo apt-get update
    4) sudo apt-get upgrade
    5) sudo apt-get upgrade –fix-missing

    6) Do steps 3-5 two to three times.
    a) The problem is that with the above two lines commented out apt-get was not caching the proper packages. By updating and upgrading apt-get you are allowing it to refresh and store the poroper packages.

  24. Abdulbasit

    If you just uploded the SD card image for us it would be the greatest work done for OpenCV&RPi users

  25. Mang

    problem in the step 9.

    The compilation of OpenCV was well done, but in the verification step, over the directoy “/usr/local/lib/python3./usr/local/lib/python3.5/dist-packages” if i execute the “ls” command, the next appears:

    pip pip-10.0.1.dist-info

    So, when i trying to change the name of cv2.cpython-35m-arm-linux-gnueabihf.so by cv2.so, it says “mv: cannot stat ‘/usr/local/lib/python3.5/dist-packages/cv2.cpython-35m-arm-linux-gnueabihf.so’: No such file or directory”

    Got the same, once it was a compilation error so no cv2…so file was created. Next time it was placed in /site-packages/
    Next I forgot which environment I was in, was in the hidden /cv catalog.

  26. Jose Esquivel

    I am having an issure with step 9. I keep getting the ” no such file or directory ”. Can you help me figure our what is wrong. Thank you.

    pi@raspberrypi:~/opencv-3.4.0/build $ ls -l /usr/local/lib/python3.5/dist-packages/
    ls: cannot access /usr/local/lib/python3.5/dist-packages/: No such file or directory
    pi@raspberrypi:~/opencv-3.4.0/build $ ls -l /usr/local/lib/python3.5/site-packages/
    ls: cannot access /usr/local/lib/python3.5/site-packages/: No such file or directory

  27. Kay Zazz

    error: (-215) scn == 3 || scn == 4 in function cvtColor
    This error occurs when I use opencv on raspberry pi.
    How can I fix this nontype error?
    Reply me

  28. putri

    i got a problem, i follow the step i stuck on compiling with the command make -j4 , and i got this. can you help me???

    [ 38%] Linking CXX shared library ../../lib/libopencv_ml.so
    CMakeFiles/opencv_ml.dir/src/lr.cpp.o: file not recognized: File truncated
    collect2: error: ld returned 1 exit status
    modules/ml/CMakeFiles/opencv_ml.dir/build.make:460: recipe for target ‘lib/libopencv_ml.so.3.4.0’ failed
    make: *** Error 1
    CMakeFiles/Makefile2:1889: recipe for target ‘modules/ml/CMakeFiles/opencv_ml.dir/all’ failed
    make: *** Error 2

    [ 43%] Built target opencv_imgproc

    make: *** Error 2

  29. ambhub

    hi.. pls i am having raspbian stretch installed… i followed through all the tutorial but i got stucked at the building of opencv….
    fatal error: can’t write PCH file: No space left on device
    }
    ^
    compilation terminated.
    modules/bgsegm/CMakeFiles/pch_Generate_opencv_test_bgsegm.dir/build.make:62: recipe for target ‘modules/bgsegm/test_precomp.hpp.gch/opencv_test_bgsegm_RELEASE.gch’ failed
    make: *** Error 1
    CMakeFiles/Makefile2:6336: recipe for target ‘modules/bgsegm/CMakeFiles/pch_Generate_opencv_test_bgsegm.dir/all’ failed
    make: *** Error 2
    Makefile:160: recipe for target ‘all’ failed
    make: *** Error 2 space error even though i used both make -j4 and make. i have an 8gig memory card. thanks

  30. Jeon Nora

    Hello, I am just a beginner to Raspberry Pi and I wanted to install opencv to my raspberry pi 3 and I have got the error on Step 3:Install Dependencies!

    At that step, Install CMAKE developer packages, when I write this command,

    sudo apt-get install build-essential cmake pkg-config -y

    I got this error!

    Package cmake is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or
    is only available from another source

    E: Package ‘cmake’ has no installation candidate

    I am currently using “Raspbian GNU/Linux 9 (stretch)”.

  31. Lafleur

    Hello 🙂
    Just to precise I’m working on a orange pi on Rasbian.
    I have a probleme at step 6.
    Here is the error message:
    CMake Error at CMakeLists.txt:29 (cmake_minimum_required):
    CMake 2.8.12.2 or higher is required. You are running version 2.8.9

    I’ve tried several times to update and upgrade. I didn’t forget the sudo apt-get upgrade –fixe-missing.

    I’ve tried also apt-get install cmake and it’s return:
    ” Building dependency tree
    Reading state information… Done Helawe B. Javier Gaitán

    Hi ¡ i just want to thank you for the tutorial it was very useful. Keep going with that kind attitude to help others who like this stuff

  32. Azad

    I have problem in Step: 7
    Show below message:
    CMakeFiles/opencv_imgcodecs.dir/src/grfmt_exr.cpp.o: file not recognized: File truncated
    collect2: error: ld returned 1 exit status
    modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/build.make:578: recipe for target ‘lib/libopencv_imgcodecs.so.3.4.0’ failed
    make: *** Error 1
    CMakeFiles/Makefile2:2505: recipe for target ‘modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/all’ failed
    make: *** Error 2
    make: *** Waiting for unfinished jobs….
    [ 56%] Built target opencv_dnn
    Makefile:160: recipe for target ‘all’ failed
    make: *** Error 2

    Please give me a solution. I try make -j4 and only make also but show same message when come in this state(56%).

  33. Suchitra

    Hi, I got these error. Could you please help?

    [ 67%] Building CXX object modules/xfeatures2d/CMakeFiles/opencv_xfeatures2d.dir/src/vgg.cpp.o
    /tmp/ccXSlohP.s: Assembler messages:
    /tmp/ccXSlohP.s: Fatal error: can’t write 3996 bytes to section .rodata._ZZN2cv11xfeatures2d8VGG_ImplC4EifbbfbE2PJ_2 of CMakeFiles/opencv_xfeatures2d.dir/src/vgg.cpp.o because: ‘No space left on device’
    /tmp/ccXSlohP.s: Fatal error: can’t close CMakeFiles/opencv_xfeatures2d.dir/src/vgg.cpp.o: No space left on device
    modules/xfeatures2d/CMakeFiles/opencv_xfeatures2d.dir/build.make:595: recipe for target ‘modules/xfeatures2d/CMakeFiles/opencv_xfeatures2d.dir/src/vgg.cpp.o’ failed
    make: *** Error 1
    CMakeFiles/Makefile2:13645: recipe for target ‘modules/xfeatures2d/CMakeFiles/opencv_xfeatures2d.dir/all’ failed
    make: *** Error 2
    Makefile:160: recipe for target ‘all’ failed
    make: *** Error 2
    pi@raspberrypi:~/opencv-3.

Open Source Computer Vision Library

Это библиотека для языка программирования Python упрощающая работу с машинным зрением (раздел машинного обучения - Machine Learning).
Для понимания предлагаю рассмотреть процесс распознавания лица (классика), если б не существовало OpenCV:
  1. Перво-наперво необходимо иметь огромную коллекцию изображений с лицами людей и без них
  2. Структурировать этот набор - сопоставить каждому изображению пояснение: присутствует ли на нем человеческое лицо.
  3. Равномерно и правильно разделить структурированную коллекцию на обучающую и контрольную выборку.
  4. Далее путем перебора и сочетания разнообразных методов машинного обучения (“дерево”, “случайный лес”, “градиентный спуск”, “ближайшие соседи” и т.д.) составить нейросеть, дающую приемлемый результат распознавания как на обучающей, так и на контрольной выборке. На этот этап могут уйти месяцы(!) (в зависимости от доступных вычислительных ресурсов)
А разработчики OpenCV предоставляют всем бесплатный набор первоклассных алгоритмов машинного зрения для различного применения - бери, да используй!)

ПРЕДУПРЕЖДЕНИЕ:

  • Далее рассматриваются тонкости установки OpenCV на Raspbian, однако, инструкция вполне универсальна для всех дистрибутивов семейства Debian
  • установка OpenCV занимает много времени (2-3 часа), однако не обязательно проходить весь путь за один раз - можно остановиться и продолжить с того же места.
  • Потребуются .
  • Установку будем производить на Raspberry Pi 3 на чистый, только что проинсталлированный Raspbian Desktop последней версии. см.

Подготовка

Потребуется 7 Гб свободного места на флешке.
Чтобы проверить наличие свободного места на флешке откроем терминал (Ctrl + Alt + T) и введем команду
df -h
Если места недостаточно, хотя объем флешки должен позволять, то стоит проверить расширена ли файловая система на весь доступный объем (в новых версиях дистрибутива это теперь делается по умолчанию - от апреля 2018 года).
Если система не очень новая, тогда можно зайти в раздел главных настроек
sudo raspi-config
и выбрать первый пункт “1. Expand File System”, а затем перезагрузить Малину

Установка необходимых пакетов

Если обновления давно не проводились, то желательно произвести их сейчас
sudo apt-get update -y && sudo apt-get upgrade -y
Устанавливаем комплект пакетов для сборки программ из исходников
sudo apt-get install build-essential cmake pkg-config -y
Затем устанавливаем комплект библиотек для работы с графическим контентом разных форматов
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev -y
Далее тоже самое для видео контента
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev -y sudo apt-get install libxvidcore-dev libx264-dev -y
Ставим пакет компиляции модуля highgui для вывода изображений и интерфейсов на экран
sudo apt-get install libgtk2.0-dev -y
И напоследок библиотека линейной алгебры и компилятор Фортрана:
sudo apt-get install libatlas-base-dev gfortran -y

Python

Далее устанавливаем Питон (ну или Пайтон). Базовые версии 2,7 и 3 уже вшиты в Raspbian, однако понадобятся дополнительные пакеты:
sudo apt-get install python2.7-dev python3-dev -y
Далее для Питона (ну или Пайтона) рекомендую установить утилиты virtualenv и virtualenvwrapper - это аналог ’а только для Питона, позволяют работать с Питоном в выбранном “виртуальном окружении” - наборе пакетов определенных версий (аналоги гемсетов Руби) - это удобно при работе над несколькими проектами с различными наборами библиотек (и особенно различными версиями библиотек): чтоб переключиться на, допустим Python 2.7 c OpenCV 3.1 достаточно будет ввести в терминале всего одну команду. Устанавливаем:
sudo pip install virtualenv virtualenvwrapper sudo rm -rf ~/.cache/pip echo -e "\n# virtualenv and virtualenvwrapper" >> ~/.profile echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.profile echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.profile source ~/.profile
На этом зависимости установлены.
Создаем виртуальное окружение с помощью virtualenv. И тут же стоит определиться с версией Питона - если цель - это создание проекта с нуля, тогда стоит выбрать python3, а иначе - python2
В процессе исторического развития языка Python во время актуальности версии 2.7 было написано очень много хороших программ. И даже сейчас во времена стабильных 3.5 версий Python 2.7 не забыт до сих пор и активно используется и поддерживается - произошло ветвление. Так же и с библиотеками Питона - не все будут работать одинаково хорошо как на 2.7 так и на 3.5
mkvirtualenv cv -p python3
Убеждаемся, что сейчас находимся в созданном виртуальном окружении cv. Это можно узнать по сочетанию “(cv)” в консоли у текущей активной строки: И наконец устанавливаем библиотеку Numpy для удобной работой с массивами и матрицами больших размерностей
pip install numpy

Скачивание Open CV из репозитория

Создадим папку для библиотеки в домашней директории и перейдем в нее
cd ~ mkdir opencv cd opencv/
Определимся с версией OpenCV.
С момента выхода версии 3.0, старые версии 2.4.х продолжают поддерживаться и выпускаться и между ними имеются серьезные отличия . К примеру пакет дополнительных модулей ‘contrib’ доступен только для новых версий 3+.
Перейдем на домашнюю страницу проекта в раздел “Releases” . Предлагаю далее устанавливать свежую версию (3+ а не 2.4.х.х) и брать не самый крайний релиз:
Таким образом выбор пал на версию 3.4.0.
Чтоб получить ссылку для скачивания перейдем в офф. репозиторий Open CV в раздел релизов: https://github.com/opencv/opencv/releases и скопируем ссылку на zip-архив выбранной версии:
Возвращаемся к Raspberry.
Находясь в папке /opencv выполним команду для скачивания исходников:
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.0.zip
эта команда скачает архив и переименует его в opencv.zip
Распакуем скачанный архив и после удалим его:
unzip opencv.zip rm opencv.zip
Скачаем и распакуем ту же версию дополнительных модулей contrib (в данном случае - 3.4.0). Страница релизов офф. репозиотрия: https://github.com/opencv/opencv_contrib/releases
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.0.zip unzip opencv_contrib.zip rm opencv_contrib.zip
В итоге должно получиться следующее (команда ls показывает содержимое текущей папки):

Компиляция и установка OpenCV

Еще раз убедимся, что находимся в созданном виртуальном окружении для OpenCV (глава установки Python). Если окружение уже точно было создано, то перейти в него можно командой workon cv
Переходим в папку распакованного архива OpenCV (версия, и соответственно, название папки может отличаться):
cd opencv-3.4.0/
Далее выполняем серию команд для запуска процесса сборки инсталлятора.
Это 3 команды - последняя многострочная, в ней ОСОБОЕ внимание обращаем на путь к папке распакованного архива contrib:
mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib-3.4.0/modules \ -D BUILD_EXAMPLES=ON ..
В случае успешной сборки увидим следующее. На данный момент мы всего лишь выполнили все условия для компиляции инсталлятора OpenCV, поэтому обратите внимание на секцию Python3 (или Python2) она должна быть как на скриншоте, в ином случае (или в случае фейла) проверьте:
  • возможно во время сборки не было активировано виртуальное окружение (cv) - workon cv
  • Еще возможная причина фейла: неверный абсолютный путь к папке дополнительных модулей contrib
  • На крайний случай можно проверить текущую директорию - вы должны находиться в папке build распакованного архива OpenCV выбранной версии
  • Напоследок убедиться, что версии релизов основного и contrib пакетов совпадают
В любом случае ничего страшного) Следует все перепроверить и запустить сборку заново
Если сборка прошла гладко, значит все условия для компиляции инсталлятора OpenCV удовлетворены и мы сейчас соберем из исходников собственный свежий стабильный дистрибутив OpenCV с extra-модулями!
Запускаем компиляцию
Параметр -j4 означает количество задействованных ядер процессора, у Raspberry Pi 3 их 4.
ВНИМАНИЕ!! Этот процесс в лучшем случае займет порядка 1,5 часов времени!!!
make -j4
Если наблюдаем краш в первые 5 минут компиляции, это вполне может произойти даже при идеальных условиях, то сбрасываем результат и запускаем компиляцию на одном ядре:
make clean make
В случае успеха увидим следующее - процесс компиляции завершен на 100%
Остается запустить собранный инсталлятор командой
sudo make install sudo ldconfig
Все, OpenCV установлен на Raspberry! Для удобного его использования дело остается за малым - пробросить на OpenCV в созданное виртуальное окружение Питона (cv). Определим директорию - так как OpenCV - это библиотека Питона, то должна находиться в папке остальных библиотек, проверим:
  • команда ls выводит в терминал содержимое указанной директории
  • не забудьте указать в команде папку Python с версией, для которой собственно устанавливали OpenCV
ls /usr/local/lib/python3.5/site-packages/
В исключительных случаях библиотека может находиться в соседней папке dist-packages :
ls /usr/local/lib/python3.5/dist-packages/
Перейдем в эту директорию
cd /usr/local/lib/python3.5/site-packages/
Переименуем файл библиотеки - так будет проще вызывать ее в коде Python
sudo mv cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so
Скопируем полный путь к файлу.

Перейдем в каталог библиотек виртуального окружения cv:
cd ~/.virtualenvs/cv/lib/python3.5/site-packages/
Создадим здесь симлинк на OpenCV:
ln -s /usr/local/lib/python3.5/site-packages/cv2.so cv2.so
Проверим результат командой ls:

Проверка

Откроем новое окно терминала
source ~/.profile workon cv python import cv2 cv2.__version__
Если все сделано правильно, то в консоли Питона библиотека OpenCV импортируется без ошибок

В случае ошибки импортирования внимательно проверьте правильность переименовывания файла библиотеки и создание симлинка на него (расширение - .so), а также успешность перехода в виртуальное окружение cv

Защитите ваш сундучок от посторонних глаз без запоминания кодовой комбинации или использования ключа. Ваше лицо и будет служить ключом для открытия сундучка!

В данном проекте показано, как использовать микрокомпьютер Raspberry Pi и камеру Pi для открытия сундучка с помощью технологии распознавания лица.

Программная часть данного проекта основывается на алгоритме, который представлен в библиотеке OpenCV computer vision library . Raspberry Pi является идеальной платформой для данного проекта, поскольку обладает достаточной вычислительной мощностью для запуска OpenCV и имеет небольшие габаритные размеры, позволяющие вместится в любом месте.

Данный проект средний по сложности. В нем выполняется компилирование и установка программного обеспечения на микрокомпьютере Raspberry Pi. Если у вас есть опыт создания подобных вещей, и вы не имеете проблем при использовании командной строки, тогда вы полностью готовы пройти все этапы данного проекта. Вы также можете обратиться к справочным материалам Adafruit learning system при возникновении каких-либо проблем.

Шаг #1: Подготовка сундучка

  • Просверлите отверстие диаметром 7/16 дюйма в верхней части сундучка для вставки камеры Pi.
  • Просверлите отверстие большего диаметра сзади сундучка для вставки нажимной кнопки и силовых кабелей.

Шаг #2: Изготовления защелки

  • Установите штифт в передней части сундучка, который будет захватываться защелкой при повороте сервопривода.
  • Изготовьте небольшой каркас для поддержки Pi и защелки сервопривода. Сервопривод прикрепляется к каркасу с помощью деревянной пластины и винтов с головкой под шлиц.
  • Изготовьте защелку из двух деревянных пластин, склеенных под прямым углом и прикрепленных к качалке сервопривода.

Шаг #3: Завершение работы с сундучком

  • Проверьте правильность соприкосновения каркаса, Pi и защелки в верхней части сундучка. Убедитесь в том, что защелка сервопривода поворачивается вниз и захватывает штифт внутри передней части сундучка.
  • Установите штифты, которые проходят через верхнюю часть сундучка, для поддержки каркаса.
  • Устраните дефекты в сундучке с помощью рашпиля и наждачной бумаги, и далее заморите деревянную поверхность по своему желанию.

Шаг #4: Подключение электронных компонентов

  • Подключите сигнальную линию сервопривода к выводу GPIO 18 на Raspberry Pi. Питание и земля для сервопривода должны подключаться к питающим выводам аккумулятора.
  • Подключите один вывод нажимной кнопки к выводу Pi GPIO 25, и через резистор 10 кОм к выводу напряжения питания 3.3 В Pi. Подключите второй вывод нажимной кнопки к земляному выводу Pi.
  • Соедините вместе земляные выводы аккумулятора и Pi.
  • Установите Pi камеру через отверстие в верхней части сундучка и подсоедините кабель к микрокомпьютеру Pi.

Шаг #5: Компилирование OpenCV

  • На данном этапе необходимо установить последнюю версию OpenCV на Raspberry Pi. К сожалению, сначала нужно скомпилировать OpenCV из исходного кода, поскольку старая двоичная версия не содержит алгоритмы распознавания лица, используемые в проекте. Компилирование OpenCV на Pi занимает около 5 часов.
  • Подайте питание на микрокомпьютер Pi и подключитесь к нему через сеанс работы с терминалом.
  • Выполните следующие команды для установки взаимозависимостей OpenCV:

sudo apt-get update && sudo apt-get install build-essential cmake pkg-config python-dev libgtk2.0-dev libgtk2.0 zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libjasper-dev libavcodec-dev swig

  • Выполните следующие команды для загрузки и разархивирования исходного кода для последней версии OpenCV:

wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.7/opencv-2.4.7.tar.gz && tar zxvf opencv-2.4.7.tar.gz

  • Выполните следующие команды для подготовки компиляции исходного кода OpenCV:

cd opencv-2.4.7 && cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_gpu=OFF -DBUILD_opencv_ocl=OFF

  • Выполните данную команду для запуска компиляции OpenCV (примите во внимание, что компиляция занимает около 5 часов):
  • После завершения компиляции OpenCV, выполните данную команду для установки Pi:

Шаг #6: Пробное распознавание лица

  • На данном этапе мы опробуем алгоритмы распознавания лица, которые позволят открывать сундучок.
  • Загрузите программное обеспечение для данного проекта с депозитария github repository (сноска: https://github.com/tdicola/pi-facerec-box).
  • Разархивируйте архив и скопируйте содержимое в директорий на Pi.
  • Во время сеанса работы с терминалом на Pi просмотрите директорий и выполните следующую команду для запуска пробного скрипта:

sudo python capture-positives.py

  • Во время работы скрипта вы можете нажать кнопку, располагаемую на сундучке, для фотографирования с помощью камеры Pi. Скрипт попытается определить одно лицо в захваченном изображении и сохранить его как правильно отснятый кадр в поддиректории./training/positive.
  • Каждый раз при захвате изображения, кадр записывается в файл capture.pgm. Вы можете просмотреть его в графическом редакторе, чтобы определить, как камера Pi выполняет захват и определяет изображение вашего лица.
  • Используйте кнопку для захвата 5 или более изображений вашего лица для получения правильных результатов. Попытайтесь получить изображения с разных углов, при различном освещении и т.д. На фотографиях вы видите полученные мной изображения лица.
  • Если вам интересно, вы можете просмотреть директорий./training/negative, в котором размещаются изображения из базы данных распознавания лиц AT&T, которые можно использовать как примеры людей, которые не должны иметь доступ к открытию сундучка.
  • После получения правильных изображений запустите следующие команды для обработки правильных и неправильных пробных изображений, и для проверки алгоритма распознавания лица (примите во внимание, что данная пробная операция занимает около 10 минут):

python train.py

Шаг #7: Конфигурирование сервопривода

  • На данном этапе необходимо определить значения ширины импульсов сервопривода для запирания и отпирания защелки.
  • При подаче питания на микрокомпьютер Raspberry Pi и сервопривод защелки, подключитесь к Pi в сессии работы с терминалом. Убедитесь в том, что сундучок открыт так, что вы можете видеть перемещение сервопривода без заклинивания.
  • Выполните следующую команду для запуска интерактивной сессии Python как суперпользователь (необходимо иметь доступ к выводам GPIO и возможность перемещения сервопривода):

sudo python

  • В командной строке Python >>>, введите данную команду для загрузки библиотеки RPIO servo library:

from RPIO import PWM

  • Далее введите следующую команду:

servo = PWM.Servo()

  • В заключении выполните данную команду для перемещения защелки сервопривода в центральное положение:

servo.set_servo(18, 1500)

  • Параметр 1500 для установки функции set_servo определяет ширину импульса для привода в микросекундах. Крайние значения находятся в диапазоне от 1000 до 2000.
  • Попытайтесь выполнить функцию set_servo с различными значениями ширины импульса, пока не получите значения, при которых происходит правильное закрытие и открытие защелки, как показано на фотографиях.
  • Не забывайте, что вы можете снять качалку сервопривода и прикрепить повторно для надлежащей ориентации защелки на сервоприводе.
  • Как только значения будут подобраны, откройте config.py в текстовом редакторе с правами суперпользователя и измените следующие значения:
  • Установите LOCK_SERVO_UNLOCKED равным значению ширины импульса для разблокировки положения защелки – отпирание. На моем железе надлежащее значение 2000.
  • Установите LOCK_SERVO_LOCKED для определения блокировки положения защелки – запирание. В моем случае это значение 1100.

Шаг #8: Запуск программного обеспечения

  • После проверки распознавания лица и калибровки сервопривода, можно запустить программный код!
  • При подаче питания на микрокомпьютер Raspberry Pi и сервопривод защелки, подключитесь к Pi в сессии работы с терминалом и просмотрите корневой директорий проекта.
  • Выполните следующую команду для запуска программного кода (будьте внимательны, поскольку сразу произойдет запирание сундучка):

sudo python box.py

  • После загрузки пробных данных (это занимает несколько минут), направьте камеру на ваше лицо и нажмите кнопку для попытки распознавания лица.
  • Если сундучок распознает ваше лицо, сработает сервопривод и отопрет защелку. Если ваше лицо не распознано, на терминале отобразится сообщение, насколько ваше лицо было близко к пробному изображению.
  • Для распознавания лица необходимо, чтобы захваченное изображение совпало с пробным, с достоверностью 2000 или менее. Если ваше лицо совпадает с данными пробного изображения, но достоверность невысокая, вы можете изменить порог достоверности в config.py (под настройкой POSITIVE_THRESHOLD). Если распознавание все еще не достоверное, тогда загрузите больше надлежащих захваченных изображений и запустите пробное распознавание еще раз. Алгоритм распознавания лица в данном проекте сильно зависит от освещения лица, поэтому попытайтесь иметь тот же источник освещения, что и при пробных попытках (или добавьте несколько дополнительных изображений при различных условиях освещенности).
  • После раскрытия сундучка повторно нажмите кнопку для его закрытия. Для этого операция распознавания лица не требуется.
  • Если сундучок плохо открывается и не распознает ваше лицо, тогда выполните шаги конфигурации сервопривода для ручного перемещения сервопривода в положение отпирания с помощью команды set_servo.

Недавно при реализации одного из проектов, связанных с распознаванием образов, у нас возникла необходимость установить библиотеку компьютарного зрения OpenCV на одноплатный микрокомпьютер Raspberry PB2.

Порывшись в Сети и потратив некоторое время на эксперименты мы успешно решили эту задачу. В результате получилась небольшая инструкция, которой мы с удовольствием делимся со всеми, кто решит использовать OpenCV на Raspberry.

Итак: установка OpenCV:

В примере мы используем версию opencv 2.4.9.

Для начала нам нужно обновить нашу систему:

sudo apt-get update sudo apt-get upgrade

Теперь нам необходимо установить дополнительные библиотеки:

sudo apt-get -y install build-essential cmake cmake-curses-gui pkg-config libpng12-0 libpng12-dev libpng++-dev libpng3 libpnglite-dev zlib1g-dbg zlib1g zlib1g-dev pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools libeigen3-dev sudo apt-get -y install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev libxine1-ffmpeg libxine-dev libxine1-bin libunicap2 libunicap2-dev swig libv4l-0 libv4l-dev python-numpy libpython2.6 python-dev python2.6-dev libgtk2.0-dev swig libv4l-0 libv4l-dev libswscale-dev v4l-conf v4l-utils libgtk2.0-0 libgtk2.0-dev pkg-config libxvidcore-dev libx264-dev libavcodec-dev libavformat-dev libqt4-dev libqt4-opengl-dev libjasper-dev

После того как мы закончили устанавливать библиотеки переходим к установке OpenCV. В ходе установки может возникнуть ситуация при которой может не быть какой то библиотеки для Вашей системы и нужно будет смотреть чего не хватает и доставлять дополнительно.

Создаем папку в которую будем скачивать наш архив:

mkdir ~/opt/opencv/ cd ~/opt/opencv wget -O openCV-2.4.9.zip http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip/download

Теперь нам нужно распаковать наш архив. Для этого используем команду:

unzip openCV-2.4.9.zip

В результате у нас создастся папка openCV-2.4.9. Переходим в нее и создаем папку release

cd openCV-2.4.9 mkdir release cd release

Пришло время провести конфигурацию OpenCV. Если Вам не нужно сторонних настроек то можно воспользоваться конфигурацией по умолчанию (для этого просто жмем клавишу «с»). При запуске ccmake появится список настроек которые можно указать (как показано на картинке ниже)

И так приступим:

ccmake ../

(Press "c" if empty cache configuration)

Нажимаем клавишу «с»

Когда прошли установки нажимаем снова клавишу «с» для продолжения и клавишу «g» для генерации makefile.

Теперь все сконфигурировано и осталось нажать make. Этот процесс займет в среднем порядка 10 чесов.

make sudo make install

На этом установка завершена. Осталось проверить работоспособность.

Создаем файл main.cpp

#include #include using namespace cv; int main(int argc, char** argv) { if (argc != 2) { printf("usage: n"); return -1; } Mat image; image = imread(argv, 1); if (!image.data) { printf("No image data n"); return -1; } imshow("Display Image", image); waitKey(0); return 0; }

Теперь необходимо создать файл CMakeLists.txt и вписать в него следущее:

Cmake_minimum_required(VERSION 2.8) project(DisplayImage) find_package(OpenCV REQUIRED) add_executable(DisplayImage main.cpp) target_link_libraries(DisplayImage ${OpenCV_LIBS})

Нам осталось только скомпилировать и запустить

cmake . make

Запускаем

./DisplayImage path_to_photo.jpg

Если все прошло успешно то в результате увидим картинку, которую Вы указали в параметре пути к файлу.

Леонид, прогаммист компании Sidstudio

Одно время я увлекался сборкой роботов-машинок на Ардуино и Raspberry Pi. Играть в конструктор мне нравилось, но хотелось чего-то большего.

И как-то раз, блуждая по Алиэкспрессу, я набрел на алюминиевое шасси для танка. Выглядело это творение в сравнении с машинками из пластика как Феррари в сравнении с телегой.

Я сделал себе подарок на Новый год, танк приехал, был собран и дальше надо было его оживлять. Я снял с машинки собствено Raspberry, конвертер питания, контроллер мотора и батарею. Все это было поставлено на танк и радостно заработало.

Танк должен стрелять, и следующим шагом стало появление у него камеры. У меня не получилось угадать с корпусом для камеры - в открытом состоянии он камеру не держал, а в захлопнутом - был настолько тугим, что у камеры отлетала линза. Помучившись, я просто примотал камеру изолентной к крышке корпуса. Теперь танк мог не просто ездить по комнате, но и делать фотки.

Стоит отметить серьезное преимущество танка над машинками в домашних условиях - на гусеничном ходу ему нет разницы, ехать по жесткому полу или по ковру. Колесный транспорт буксует на мягком ковре, вплоть до невозможности поворачивать.

Дальше мне хотелось развивать танк в направлении автономной навигации, опираясь на фотки с камеры. Пришлось погрузиться в мир компьютерного зрения и открыть для себя OpenCV. Началось все с распознавания цвета и контура - печатал на бумаге красный кружок, клеил его на телевизор и заставлял робота вертеться, пока кружок не был найден.

Идея была в том, чтобы замаркировать заметные объекты в комнате (диван, телевизор, стол) разноцветными кружками и научить робота ориентироваться по цвету.

Средствами OpenCV искались контуры нужного цвета (с допустимой толерантностью), потом среди контуров искалась окружность.

Казалось, что основной проблемой может стать случайный круг нужного цвета на каком-нибудь из предметов.

Однако, главная проблема оказалась в том, что цвет очень переменчиво выглядит в зависимости от освещения, поэтому диапазон, в котором узнавался красный (например) приходилось растягивать до оттенков, очень отдаленно напоминающих оригинальный цвет. Или подбирать искомый цвет с картинки, но в любом случае это был не уже красный, а оттенок коричневого.

Поиск кружка красного цвета:

Import cv2 import numpy as np import sys def mask_color(img, c1, c2): img = cv2.medianBlur(img, 5) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, c1, c2) mask = cv2.erode(mask, None, iterations=2) mask = cv2.dilate(mask, None, iterations=2) return mask def find_contours(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) thresh = cv2.threshold(blurred, 30, 255, cv2.THRESH_BINARY) thresh = cv2.bitwise_not(thresh) im2, cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) cp_img = img.copy() cv2.drawContours(cp_img, cnts, -1, (0,255,0), 3) return cp_img def find_circles(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.medianBlur(gray,5) circles = cv2.HoughCircles(blurred,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) cimg = img if circles is not None: circles = np.uint16(np.around(circles)) for i in circles: cv2.circle(img,(i,i),i,(255,0,0),2) cv2.circle(img,(i,i),2,(0,0,255),3) print "C", i,i,i return cimg def find_circle(img, rgb): tolerance = 4 hsv = cv2.cvtColor(rgb, cv2.COLOR_BGR2HSV) H = hsv c1 = (H - tolerance, 100, 100) c2 = (H + tolerance, 255, 255) c_mask = mask_color(img, c1, c2) rgb = cv2.cvtColor(c_mask,cv2.COLOR_GRAY2RGB) cont_img = find_contours(rgb) circ_img = find_circles(cont_img) cv2.imshow("Image", circ_img) cv2.waitKey(0) if __name__ == "__main__": img_name = sys.argv img = cv2.imread(img_name) rgb = np.uint8([[]]) find_circle(img, rgb)
Цветовое распознавание стало заходить в тупик, я отвлекся на каскады Хаара, используя танк для фотоохоты на кота. Кот неплохо маскировался, заставляя каскад ошибаться в половине случаев (если кто не знает, OpenCV идет со специально обученным на котиках каскадом Хаара - бери и пользуйся).

Охота на кота имела полезные последствия для робота - поскольку в статичную камеру не всегда можно было поймать объект охоты, я поставил штатив с двумя сервомоторами (и PWM-модуль для управления ими через Raspberry).

Продолжая изыскания на тему, что можно выжать из фоток комнаты, я закономерно пришел к нейросетям. Заглотив туториал по Tensorflow, я обработал его детектором фотки с танка и результаты были многообещающими - телевизор, стол, диван, кот, холодильник распознавались безошибочно.

Эксперименты эти проводились на компьютере, и дело осталось за малым - перенести TF на Raspberry Pi. К счастью, на гитхабе живет уникальный человек, который набрался терпения и прорвался через установку всех зависимостей и многочасовое время компиляции - и выложил в общий доступ собранный Tensorflow для Raspberry Pi.

Однако, дальнейшее изучение темы открыло, что OpenCV не стоит на месте и его контрибуторы выпустили модуль DNN (Deep Neural Networks), предлагающий интеграцию с нейросетями, обученными на TensorFlow. Это решение гораздо удобнее в разработке, плюс отпадает необходимость в самом TF. Пришлось немного поколдовать, так как свежая версия Mobile SSD нейросети для TF, уже не подхватывалась последней версией OpenCV. Надо было искать
и проверять рабочую версию Mobile SSD. Плюс к этому, DNN нормально работает только под OpenCV 3.4, а этой версии для Raspberry я не нашел. Пришлось собирать самому, благо это гораздо проще, чем возиться с TensorFlow. При этом собрать OpenCV под последнюю весию Raspbian (Stretch) не удалось, а вот на последней версии предыдущего поколения (Jessie) все взлетело как надо.

Пример кода, использующий DNN и не использующий Tensorflow.

Несколько файлов, отвечающих за имена объектов были вытянуты из TF и зависимость от самого TF убрана (там было только чтение из файла).
Исходный код на гитхабе.

Import cv2 as cv import tf_labels import sys DNN_PATH = "---path-to:ssd_mobilenet_v1_coco_11_06_2017/frozen_inference_graph.pb" DNN_TXT_PATH = "--path-to:ssd_mobilenet_v1_coco.pbtxt" LABELS_PATH = "--path-to:mscoco_label_map.pbtxt" tf_labels.initLabels(PATH_TO_LABELS) cvNet = cv.dnn.readNetFromTensorflow(pb_path, pb_txt) img = cv.imread(sys.argv) rows = img.shape cols = img.shape cvNet.setInput(cv.dnn.blobFromImage(img, 1.0/127.5, (300, 300), (127.5, 127.5, 127.5), swapRB=True, crop=False)) cvOut = cvNet.forward() for detection in cvOut: score = float(detection) if score > 0.25: left = int(detection * cols) top = int(detection * rows) right = int(detection * cols) bottom = int(detection * rows) label = tf_labels.getLabel(int(detection)) print(label, score, left, top, right, bottom) text_color = (23, 230, 210) cv.rectangle(img, (left, top), (right, bottom), text_color, thickness=2) cv.putText(img, label, (left, top), cv.FONT_HERSHEY_SIMPLEX, 1, text_color, 2) cv.imshow("img", img) cv.waitKey()
В общем, теперь фотки танка можно распознавать нейросетью, и это очень важный шаг в навигации в плане узнавания ориентиров. Тем не менее, одних картинок для полноценной навигации не хватало, требовалось измерять расстояния до препятствий. Так у робота появился эхолот. Чтобы подключить эхолот к Raspberry, надо немного потрудиться - эхолот возврашает сигнал на 5V, а Raspberry принимает 3.3V. На коленке эту проблему решают в основном резисторами на бредборде, однако мне не хотелось городить такую кустарщину на роботе. В итоге была найдена микросхема Level Shifter, которая делает все, что надо, и размером она с ноготь.

Кроме того, я озаботился внешним видом робота - не очень нравилось, что микросхемы и камера с эхолотом были прилеплены к картонкам. Развитие техники в нашем мире позволяет резать пластик лазером с разумными затратами времени и денег. В общем, я нашел мастерскую с лазерным станком, потратил немного времени на изучение инструкции к этой чудо-машине и далеко не с первой попытки вырезал панели под микросхемы и камеру с эхолотом.

Для автономной навигации все готово, но задача оказалась не настолько простой и при первой попытке я несколько закопался. Решил взять паузу, все хорошо обдумать, изучить аналоги. Возможно, эта навигация послужит темой для отдельной статьи.

REST интерфейс, который предоставляет робот в качестве базы для дальнейшего использования:

GET /ping GET /version GET /name GET /dist POST /fwd/on POST /fwd/off POST /back/on POST /back/off POST /left/on POST /left/off POST /right/on POST /right/off POST /photo/make GET /photo/:phid GET /photo/list POST /cam/up POST /cam/down POST /cam/right POST /cam/left POST /detect/haar/:phid POST /detect/dnn/:phid