Как из Raspberry Pi сделать живую камеру.

Компоненты

Покупаем Raspberry Pi Camera Board на пример тут http://xn--80ajij3awm.xn--p1ai/
1367_MED
IMG-20130821-00201

IMG-20130821-00202

Собираем «конструкцию» 🙂

IMG-20130817-00200

ПО

Скачиваем Raspbian, и создаем загрузочную карту памяти.

cat 2013-07-26-wheezy-raspbian.zip | gunzip | dd of=/dev/sd?

или

gunzip 2013-07-26-wheezy-raspbian.zip
dd if=2013-07-26-wheezy-raspbian.img of=/dev/sd?

Где /dev/sd? это ваша карта памяти. За место «?» поставьте правильный символ. Для этого посмотрите какие устройства у вас есть коммандой:

fdisk -l

Настройка

Загрузитесь с Raspbian и проведите все необходимые настройки выполнив

raspi-config

Выполните Expand Filesystem.
Зайдите в Enable Camera и включите её..
Зайдите в Advanced Options, далее в SSH, и .

Далее настройте сеть. Если вы используете WiPi то лучше всего поднимите графический интерфейс:

startx

На рабочем столе вы увидите утилиту по настройке WiFi. Настройте WiFi и покиньте иксы (графическую оболочку).

Далее:

sudo su
apt-get install subversion
apt-get install libv4l-dev
apt-get install libjpeg8-dev
apt-get install imagemagick

Установка и компиляция mjpg-streamer

Mjpg-streamer не только умеет транслировать поток, но и не требует установки web-сервера. Потому надобности в установки Apache нету никакой! Нам понадобится только mjpg-streamer.

su pi
svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
cd mjpg-streamer/mjpg-streamer
make USE_LIBV4L2=true clean all
sudo su
make DESTDIR=/usr install
cp -R www /var/

Скрипт для запуска WEB-камеры

nano /usr/local/bin/webcamera.sh
#!/bin/bash
if [ -d /tmp/stream ];then
        echo "/tmp/stream already created"
else
        mkdir /tmp/stream
fi

if [ -f /tmp/stream/pic.jpg ];then
        echo "raspistill already running"
else
        raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999&
fi
mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w /var/www"

Нажмите для сохранения Ctrl+x
Сделайте его исполняемым

chmod +x /usr/local/bin/webcamera.sh

Чтобы запустить web-камеру выполните:

/usr/local/bin/webcamera.sh

Если вы желаете, чтобы скрипт запускался при загрузке, то отредактируйте:

nano /etc/rc.local
...
/usr/local/bin/webcamera.sh &
exit 0

Для подключения к вебкамере вам надо выяснить IP адрес вашего Raspberry Pi.

pi@raspberrypi ~ $ hostname -I
192.168.0.28

Подключаемся

http://192.168.0.28:8080/stream_simple.html
Также можно подключиться к web-странице которую создает mjpg-streamer.
http://192.168.0.28:8080

Stream

При желании её оформить под себя, если знаете как. Её файлы мы скопировали в /var/www/.

Видеопост

Тут вкратце я поведаю как сделать на Raspberry Pi ВКУ (Видео-контрольное устройство). Выбираем дисплей и подключаем к «Малине». Наша задача сделать вход в систему и запуск иксов и броузера автоматическими.

Первым делом, настройте Midori так, чтобы он автоматом загружал адрес вашей Web камеры.
Тут есть важный момент! Используйте адрес для Javascreept!
http://Ваш_IP:8080/javascript_simple.html
Обычная ссылка на Midori не работает!

vi /home/pi/.config/autostart
midori -e Fullscreen &

В midori прописываем адрес по умолчанию:
Пример: http://Ваш_IP:8080/javascript_simple.html

Теперь сделаем автологин в систему:

Автологин без десктоп-менеджера

vi autologin.c
int main()
{
execlp("login", "login", "-f", "sergey", 0);
}
gcc -o autologin autologin.c
cp autologin /usr/sbin/
vi /etc/inittab

Комментируем и вводим новую строчку:

#c1:2345:respawn:/sbin/agetty -8 38400 tty1 linux
c1:2345:respawn:/sbin/agetty -n -l /usr/sbin/autologin 38400 tty1 linux

и всё.

Теперь нужно автоматом поднять иксы, для этого в .bashrc впишите startx.

if [[ `tty` = /dev/tty1 ]] && [[ -z "$DISPLAY" ]]; then
  startx
  logout
fi

Теперь надо оформить .xinitrc:
В нем мы пропишем запуск простенького десктопа Openbox, отключим мыша, и всевозможные засыпания и затемнения монитора.

xset s off         # don't activate screensaver
xset -dpms         # disable DPMS (Energy Star) features.
xset s noblank     # don't blank the video device



exec openbox-session

Настройка Wifi

sudo su

Смотрим к чему можно подключиться:

iwlist scan
vi /etc/wpa_supplicant/wpa_supplicant.conf

Допустим точка доступа настроена на WPA-PSK

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="MySSID"
        psk="MyPassword"
        proto=WPA
        key_mgmt=WPA-PSK
        pairwise=TKIP
        auth_alg=OPEN
}
vi /etc/network/interfaces
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
Запись опубликована в рубрике Linux, Raspberry с метками , , , . Добавьте в закладки постоянную ссылку.

35 комментариев на «Как из Raspberry Pi сделать живую камеру.»

  1. Defiler говорит:

    Спасибо за статью. Работает.
    Правда, пришлось перезагрузить «малинку» чтобы отображала картинку(наверное совпадение).

    • sergey говорит:

      Не за что! Рад, что помогло!
      К стати! Камеру можно разместить внутри корпуса. И вешать на стену. А для сети использовать wifi.
      Добавлю картинок в статью.

  2. evgen говорит:

    Спасибо за статью. Не работает.
    Первый затык — изменился адрес репозитория.

    svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
    svn: E175011: Repository moved permanently to 'https://svn.code.sf.net/p/mjpg-streamer/code/!svn/vcc/default'; please relocate
    Изменил на https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/
    Далее
    cd mjpg-streamer/mjpg-streamer
    bash: cd: mjpg-streamer/mjpg-streamer: No such file or directory
    сделал текущей /home/user/mjpg-streamer
    ну и
    make USE_LIBV4L2=true clean all
    make: *** No rule to make target `clean'.  Stop.
    Это выше моих познаний в линуксе, компилировать уже не пробовал.
    • evgen говорит:

      Пардон, напутал с тегами…

    • sergey говорит:

      Там на sourceforge.net если поискать mjpg-streamer, то появляется сообщения с временным адресом и другой командой svn.
      Я правда не пробовал ее.

      • evgen говорит:

        Спасибо за скорый ответ!
        Я недостаточно подробно описал ситуацию. Дополню.
        Я зашел на sourceforge.net и нашел нужный репозиторий, как написал выше «Изменил адрес на https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/
        По команде

        svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/

        скачались исходники (так и должно было быть?) в директорию /home/user/mjpg-streamer, соответственно команда

        cd mjpg-streamer/mjpg-streamer

        давала ошибку

        bash: cd: mjpg-streamer/mjpg-streamer: No such file or directory

        и это правильно, т.к. директории ./mjpg-streamer/mjpg-streamer действительно не существует. Я сделал текущей /home/user/mjpg-streamer и далее команду

        make USE_LIBV4L2=true clean all
        make: *** No rule to make target `clean'.  Stop.

        Я так понимаю, что эта команда должна задавать параметры компилирования? Но возвращает ошибку. Почему? На этом я и остановлся пока. Далее — компиляция?

        make DESTDIR=/usr install

        не пробовал, раз не прошла предыдущая команда. Помогите разобраться. Я с убунтами и дебианами уже давно, но глубоко не разбираюсь, так, на уровне пользователя, по подробным мануалам.

        • sergey говорит:

          Евгений, во первых каталог пользователя в малине не /home/user/, а /home/pi/
          Наверно у тебя путь не правильный?
          Если ты находишься не под рутом root ~ #
          А под пользователем, то начни с того, что надо в каталог пользователя зайти?
          cd
          Строка будет такой
          pi@raspberrypi ~ $
          И далее поехали:
          svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/
          cd mjpg-streamer/
          make USE_LIBV4L2=true clean all
          И далее по документации…

  3. Artem говорит:

    Здравствуйте. Статья хорошая, спасибо. Но у меня та же проблема, что и у evgen. Решение не нашлось ? Без этой программы роботом управлять не очень. Спасибо

    • sergey говорит:

      Артем, я ответил Евгению, где может быть ошибка.
      Но, веб-камера ИМХО не лучший способ управлять роботом. Это будет сильно тупить. Всетаки у вебкамеры другие задачи.
      Тебе надо комать в сторону снифера! То есть, ты можешь запустить камеру на малине обычным способом, отправить поток на другую машину с Linux, и с помощью netcat вывести поток там.
      Я это статью видел на ресурсе малины. Если не найдешь, я поищу.

  4. Tronand говорит:

    Здравствуйте. Видео транслируется, но автофокус на камере не работает, посоветуйте как быть.

    • sergey говорит:

      Честно говоря я первый раз про это слышу. А разве там не короткофокусная оптика? Мне казалось, что там нету механизма фокусировки.
      Или вы имеете в виду другую камеру?

      • Tronand говорит:

        Да, я использую другую камеру с автофокусом

        • sergey говорит:

          Tronand, тут я не смогу вам помочь. Хотя это интересно. Но мало информации. Что за камера?

          • Tronand говорит:

            Камера Logitech B905. В Ubuntu, которую я использую, есть прога для работы с вебками (настройка и т.п.), так вот в ней автофокус работает, но в этой проге нет трансляции видео. Т.е. в принципе операционка поддерживает эту камеру.

  5. Arty говорит:

    Скрипт для запуска камеры имеет один недочет, а именно: проверка запущенной копии raspistill осуществляется по наличию файла /tmp/stream/pic.jpg . В моем случае, jpg продолжает существовать и после остановки raspistill по Ctrl+C, например. После этого скрипт уже не запустит стрим снова. Поэтому предлагаю скорректированный вариант скрипта:

    #!/bin/bash
    if [ -d /tmp/stream ];then
            echo "/tmp/stream already created"
    else
            mkdir /tmp/stream
    fi


    pid=$(ps ax | grep [r]aspistill | awk '{ print $1; }')

    if [[ -n $pid ]];then
            echo "raspistill already running"
     
    else
            raspistill -w 640 -h 480 -q 5 -n -o /tmp/stream/pic.jpg -tl 100 -t 9999999&
    fi


    mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w /var/www"
    • sergey говорит:

      Арти, спасибо огромное! Похоже ты решил проблему не только с прерыванием работы руками, но и с прекращением работы по времени. Дело, в том, что камера со временем вырубается, гдето через 2 часа. Я пытался ее перегружать в кроне, но ничего не выходило! Похоже это изза описанной вами причины.
      Я сейчас попробую повесить камеру и погонять ее!
      Чуть по позже внесу правки в мануал.
      Да, еще вчера я довисал настройку видеопоста, это другая малина без камеры, которая выводит на монитор изображение с вебкамеры. А то я забыл написать про настройку Мидори.

  6. Arty говорит:

    Рад, что мой комментарий оказался полезным. Поделюсь также результатами моих дальнейших поисков.

    Во-первых, максимальное значение параметра «-t» при запуске raspistill в миллисекундах: 2147483647. Тогда запись остановится остановится почти через 25 дней. Значение 9999999 мс соответствует примерно 2,8 ч.

    Во-вторых, каждый снимок мы пишем в «/tmp/stream/pic.jpg». При этом мы затираем SD-карту, что приводит к сокращению срока ее службы и, возможно, к снижению частоты обновления кадров из-за ограниченной скорости записи на карту. Пока что я нашел два варианта, которые еще не пробовал, оба они связаны с переносом записи в RAM-диск:
    1. Можно сделать «/tmp» RAM-диском:

    sudo nano /etc/fstab

    Добавляем строку в /etc/fstab:

    tmpfs           /tmp            tmpfs   defaults, noatime, mode=0777  0   0

    2. Можно смонтировать и создать RAM-диск с ФС tmpfs из коммандной строки:

    sudo mkdir /tmp/ramdisk
    chmod 777 /tmp/ramdisk
    sudo mount -t tmpfs -o size=64M tmpfs /tmp/ramdisk/

    В данном случае объем RAM-диска задается 64 Мб. Если его не задать, то будет использована половина объема оперативной памяти.

    Пожалуйста, поделитесь вашими результатами с записью в RAM-диск.

    • Arty говорит:

      Поправка:
      Во втором варианте для нашей задачи нужно использовать не «/tmp/ramdisk», а «/tmp/stream/».

      • Arty говорит:

        Проверил запись на RAM-диск. Работает.
        Цитата из статьи http://the-bosha.ru/2010/01/20/tmpfs/.
        «Суть в том, чтобы какую либо директорию, поместить вместо жесткого диска в оперативную память для ускорения доступа к ней. Первое что приходит на ум, это /tmp. Многие программы помещают туда временные файлы и поместив эту директорию в память, мы увеличим время отклика программы. Только не стоит монтировать «на лету». После монтирования, всё что находилось в папке удалится. Поэтому лучше добавить необходимые строки в fstab и перезагрузиться.»
        Итак, откроем «/etc/fstab»:

        sudo nano /etc/fstab

        Добавляем в него строку:

        tmpfs           /tmp            tmpfs   defaults,noatime,mode=0777  0   0

        Сохраняем файл (Ctrl+O), перезагружаемся:

        sudo reboot

        Хотя для проверки fstab не обязательно перезагружаться, достаточно

        sudo mount -a

        Проверяем, что ФС смонтирована. Результат команды

        findmnt -kR /

        должен содержать строку
        /tmp tmpfs tmpfs rw,noatime,mode=777

        Т.к. «/proc/mounts» — список подмонтированных файловых систем, просмотрим его содержимое

        cat /proc/mounts | grep tmpfs

        Если мы нашли строку «tmpfs /tmp tmpfs rw,noatime,mode=777 0 0», то все нормально.

        ПАРАМЕТРЫ raspistill

        Полученные мной значения качества (-q) и интервалов между снимками (-tl, мс) не дающие выпадения кадров при больших разрешениях:

        -w 960 -h 720 -q 25 -tl 600
        -w 1152 -h 864 -q 20 -tl 600
        -w 1448 -h 1080 -q 10 -tl 600
        -w 1920 -h 1440 -q 7 -tl 600

        Меньшие значения качества не приводят к увеличению частоты кадров для высоких разрешений. Сенсор камеры имеет разрешение 2592 x 1944.

        По моим наблюдениям, перенос «/tmp/stream» в RAM-диск не дает преимущества в fps, по крайней мере в высоких разрешениях. Однако, это благоприятно сказывается на ресурсе SD-карты. Возможно, сами файловые операции накладывают ограничения на скорость стриминга.

        ПАРАМЕТРЫ mjpg_streamer

        Последнюю строку скрипта скорректировал следующим образом

        mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w /var/www -p 80"

        Здесь:
        «-n pic.jpg» — чтобы явно указать mjpg-streamer’у, файл с каким именем нужно смотреть. Позволяет избежать ошибки «could not open file for reading: No such file or directory»
        «-p 80» — чтобы web-интерфейс mjpg_streamer был доступен по 80-му порту (порт HTTP) и его можно было открыть из браузера без указания порта;

        Есть еще один способ использования mjpg-streamer’а с камерой, исключающий файловые операции в процессе стриминга, т.е. теоретически он должен давать большие fps. В нем применяется не raspistill, а «Video4Linux2 driver for the Raspberry Pi Camera Board» и mjpg_streamer:
        http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=16
        Еще больше информации здесь:
        http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14
        http://www.linux-projects.org/modules/news/
        http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=15

        • Илья говорит:

          Arty, огромное спасибо за информацию, однако V4L2 driver поддерживает только одного клиента на сайта? Я так понимаю автор проекта еще не сделал версию с множественными подключениями, это все сильно «портит» так как v4l2 — замечательный пакет.

    • sergey говорит:

      В будни поправлю статью с учётом нововведений. Жаль времени на все мало.
      На счёт использования ramdisk, это однозначно правильно!
      Единственно, что меня не перестаёт удивлять, как умудряются флешки долго жить на видео регистраторах а автомобилях. У меня уже 3 года живёт! А там обычный fat32.

      • Arty говорит:

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

        В видео регистраторе запись идет большими блоками, износ происходит равномерно — записался файл 4 Гб, записался следующий и так до заполнения всей карты, затем удаляется самый старый файл, на его место снова пишется новый и т.д.

        В Linux же много служб постоянно что-то пишет на диск, малыми порциями, почти постоянно, так же ФС ведет журнал. При этом, запись идет только в ту область диска, которая не занята другими файлами, т.е. износ имеет неравномерный характер.
        На эту тему есть небольшая статья:
        http://www.ideaheap.com/2013/07/stopping-sd-card-corruption-on-a-raspberry-pi/

  7. Sverniyvolk говорит:

    Подключаемся

    http://192.168.0.28:8080/stream_simple.html

    Также можно подключиться к web-странице которую создает mjpg-streamer.

    http://192.168.0.28:8080

    а как, откуда подключаемся? Я не понял доступ будет из интернета или только из локальной сети?

    • sergey говорит:

      А это откуда вам больще нравится! В пимере адрес локальной сети, но вы можете на него сделать проброс из вашего файрфола. Просто это уже другая тема.
      На пример, если ваш файрвол построен на Iptables, то проброс будет выглядить так:

      $IPTABLES -t nat -A PREROUTING -i eth0 -p tcp \
      -s xxx.xxx.xxx.xxx/32 \
      -d $INET_IP —dport 8080 -j DNAT \
      #—to-destination 192.168.0.28:8080
      тут строго для внешнего IP xxx.xxx.xxx.xxx/255.255.255.255
      либо -s 0/0 — для всех.

      • Sverniyvolk говорит:

        поподробнее можно, пожалуйста как сделать проброс прямо из Raspbian. на роутере проброс настраивал но пользы это не дало. Максимум, что получилось это на компьютере подключенном к тому же роутеру при вводе ip 192.168.0.103/8080 вывелась страница mjpg-streamer новидео с камеры так и не транслировалось. при вводе ip 95.215.69.92/8080 с другого компьютера подключенного к интернету по свистку браузер просто пишет страница не найдена. подксажите что вообще не так. raspberry pi купил поучиться и чтобы сделать возможным наблюдать через интернет за домом. До этого пользовался только виндой, поэтому знаний маловато и google.com поэтому работает больше на меня))

        • sergey говорит:

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

          На счет mjpeg не транслирует, тут рассматривалась эта проблема. Изменили зеркало mjpeg. И по мануалу оно теперь ставится с напильником. Тут описано как. Модуль надо собиарать.

          И, на самом деле, вебкамера на малине работает не очень стабильно. Есть проблема зависания изображения через часа 2.
          Тут вроде появились дополнительные рецепты реализации, но я их испробовать не успел. Просто нету сейчас у меня времени.

  8. Dan говорит:

    Здравствуйте! Статья хорошая.
    Прочитал и всё вроде получилось, НО…
    После описанной строки запуска скрипта:
    /usr/local/bin/webcamera.sh
    видео запускается на всем экране занимая все пространство на экране,
    за исключением двух полос десктопа справа и слева.
    После этого ничего сделать не могу… (((
    Как сделать так чтобы видео было только в браузере (не могу посмотреть), а не на всем экране?

    Заранее спасибо.

    • sergey говорит:

      Dan, так оно же запускается на том Raspberry Pi, где камера установлена. Подразумевается, что этот аппарат выступает в роли камеры, а не монитора. Весь смысл заключается в том, что смотреть надо на другом устройстве. Или я, чтото не понял в вашем вопросе?

  9. Marija говорит:

    Добрый день! Я впервые работаю с этими штуками.

    Возникла такая проблема, после
    svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/ mjpg-streamer
    выдает:
    svn: command not found
    Что делать?

  10. Fantomas говорит:

    А почему так тупит? Может overclock поставить по больше.

  11. Сергей говорит:

    Как подключить 2 камеры?

  12. ArtSof говорит:

    Не подскажете, возможно ли таким способом вывести на экран изображение с USB-камеры ?

  13. Kirill говорит:

    Прочитав статью не совсем понял, интересуют два вопроса:
    1) можно ли транслировать видео 720p/30 при подключении малинки по ethernet?
    2) можно ли архивировать видеофайл на внешний диск, или скажем на диск расшаренный по сети?

  14. Виктор говорит:

    Я подобную систему делал на motion. Она по движению в камере пишет. 640×480 2 кадра с секунду. А потом на yandex disk отснятое отправляет.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Анти-спам: выполните заданиеWordPress CAPTCHA