3 апреля 2011 г.

Получаем изображение с камеры с помощью python-opencv

OpenCV - свободная библиотека компьютерного зрения реального времени написанная на С/С++. Она обладает довольно мощным математическим аппаратом для распознавания образов, трансформации и анализа изображения. В ее состав также входят инструменты для работы с видео камерой и простенький тулкит для создания GUI интерфейсов. Для демонстрации работы с этими инструментами я использую привязку opencv к питону .


Что нам потребуется?

1. Конечно вебкамера подключенная к компьютеру. У меня используется встроенная камера в ноут и моя Ubuntu видит ее в /dev/video0
2. Установим пакет для работы с opencv из питона
$ sudo apt-get install python-opencv
В принципе больше ничего и не нужно .

Скрипт

#! /usr/bin/env python
# -*- coding: utf-8 -*-

from opencv import cv
from opencv import highgui

DEV = 0  #номер устройства /dev/video0

if __name__ == '__main__':
    # Создаем окно для вывода изображения с камеры
    highgui.cvNamedWindow('Camera', highgui.CV_WINDOW_AUTOSIZE)
    highgui.cvMoveWindow('Camera', 10, 10)

    # Захватываем камеру
    capture = highgui.cvCreateCameraCapture(DEV)
    
    # Рабочий цикл, выход по нажатию 'q'
    key = ''
    while key != 'q':
        # Получаем снимок с камеры и выводим его на окно
        frame = highgui.cvQueryFrame(capture)
        highgui.cvShowImage('Camera', frame)
        
        # Ждем 5 мс нажатие клавиши
        key = highgui.cvWaitKey(5)

Алгоритм работы . Сначала, инициализируем окно куда будем отправлять изображение с камеры. Отметим что обращение к окну осуществляется через строковую константу (имя) Camera. Затем захватим камеру метод cvCreateCameraCapture(index) принимает в качестве аргумента номер камеры, у меня камера одна и она под номером 0 (DEV = 0). Дальше сам рабочий цикл: получаем снимок с камеры и показываем его в окне. Затем 5 мс  ждем нажатия клавиши, если q - выход, если нет следующий кадр.

Заключение

Как видно из выше описанного примера, осуществлять доступ к камере из opencv легко и просто, но использовать данную библиотеку только для этих целей, все равно что забивать гвозди микроскопом=) Получая кадры с камеры (в нашем примере frame) мы можем подвергать их анализу, фильтрации, искать образы, определять расстояния и скорости перемещения предметов  и т.д.  Данный скрипт демонстрирует, что не смотря на свою мощь данная библиотека довольно легко осваивается и при достаточном знании математического аппарата, позволит создавать интересные вещи.

Ссылки:

OpenCV - официальный сайт проекта
Gist - данный пример на GitHub

6 комментариев:

  1. Скажите, а привязка OpenCV + Python, работает для Python2 или Python3 или для Python2 и Python3 одновременно?

    ОтветитьУдалить
  2. По текущему состоянию, opencv официально поддерживает питон 2.6 и 2.7. Подержка 3го питона - unknown. Как то так =)

    ОтветитьУдалить
  3. Спасибо. Лёгкий пример :) все получилось. Новеньким необходимо пояснить код более детально, я о отступах в коде, влияющие на работоспособность программы. Не все новенькие знают данный нюанс.

    ОтветитьУдалить
    Ответы
    1. У каждого материала свой читатель.. некоторым надо объянять, что такое переменная и Python :-) Я не хотел утомлять других, кто уже это знает. Спасибо за комплимент.

      Удалить
  4. Здравствуте статья очень понравилась, а вы случайно не знаете сайтов с подобным матерялом на руском,только посложнее и побольше, например определение обектов по цвету, заранее спасибо.

    ОтветитьУдалить
    Ответы
    1. Здравствуйте. Спасибо на добром слове. К сожалению я давно все это писал и уже не занимаюсь этим, поэтому ничего не посоветую.

      Удалить