Open CV. Основы работы с изображениями
Содержание курса по Open CV:
Это выражается в следующих аспектах:
Если библиотека Open CV была установлена в виртуальное окружение с названием “cv” (заменить на своё), то прежде выполним следующие команды, чтоб применить это виртуальное окружение :
индикатором успешности станет приставка (cv) в терминале
Попробуем просто вывести в консоль версию установленной Open CV - тем самым проверим готовность системы:
Кроме того, cv2 после импорта становится ОБЪЕКТОМ, к которому можно обращаться, передавая объекты в него и вызывая его методы. Один из методов - “__version__” - просто возвращает текущую версию, пристыкуем ее к строке "Open CV version: " справа и выведем все в терминал функцией print
Сохраним скрипт сочетанием клавиш Ctrl + O
Откроем второе окно терминала, перейдем в папку со скриптом и запустим командой
Метод imread() принимает два аргумента: первый - это путь к файлу (относительный или абсолютный), а второй указывает один из трёх методов чтения - “-1”, “0” или “1” (указываются без кавычек)
Указанный файл будет записан в переменную img.
В Open CV команды открытия изображения должны обязательно сопровождаться командами закрытия окна и/или функцией ожидания условия:
Приписка “ & 0xFF” указывается, если скрипт запускается на 64-битной системе.
Комментарии в Python начинаются с символа “#” - после нее символы в пределах строки игнорируются интерпретатором - это помогает сопровождать код комментариями или временно изолировать строки от выполнения.
Запустим скрипт: Окно должно закрыться при нажатии на любую клавишу клавиатуры.
Полный код скрипта:
Прежде всего для этого понадобится библиотека picamera. Обычно она предустановлена в дистрибутиве Raspbian, но внутри виртуального окружения (в нашем примере оно названо “cv”) может быть недоступна. Проверить это можно через Python-консоль:
Если импорт библиотеки прошел с ошибкой, то необходимо установить ее находясь в выбранном виртуальном окружении (cv) командой:
Создадим новый файл (например “rpi_opencv_get_pic.py”) и вставим в него следующий скрипт:
Разберемся что к чему. Конечно же в простом примере можно было бы просто захватить изображение с камеры и сохранить в файл одной единственной командой
А затем прочитать этот файл “image.jpg” написанным выше по тексту скриптом, но это “костыль”..
Open CV воспринимает для себя каждое изображение как матрицу пикселей
Open CV для себя представляет изображение в качестве NumPy-массива. NumPy - это библиотека для Python позволяющая удобно обрабатывать огромные массивы данных - будь то просто массив, матрица (пиксели изображения например), трех- и более мерные массивы данных. NumPy применяется в машинном обучении, где используются разнообразные типы данных (текст, числа, изображения), поэтому с ним интегрированы многие другие библиотеки - в том числе picamera.
Импорт объекта PiRGBArray библиотеки picamera, позволяющего представить захваченное камерой изображение в качестве NumPy-массива:
Импортируем объект PiCamera для захвата снимка:
Естественно библиотека Open CV и time, чтоб создать задержку
Создаем экземпляр класса PiCamera, устанавливаем разрешение снимка:
Создаем экземпляр класса PiRGBArray:
Инициализируем задержку для включения камеры:
Захватываем изображение в переменную raw (с классом PiRGBArray):
Присваиваем переменной img сконвертированный в массив захваченный снимок:
Далее пройденный выше по тексту этап:
Данный скрипт сделает снимок, выведет на экран (это уже будет объект Open CV) и сохранит в файл "images/photo.jpg".
Архив с примерами можно скачать здесь.
- Основы работы с изображениями
- Open CV. Основы работы с видео
- Инструменты визуализации
Выбор окружения
В этой статье рассмотрим азы работы с библиотекой Open CV для языка программирования Python в среде операционной системы Linux.Почему Linux
Linux-подобные операционные системы по большей части свободно распространяются, нетребовательны к ресурсам компьютера, и самое главное наиболее приспособлены для разработки.Это выражается в следующих аспектах:
- удобстве установки и вообще манипулирования программными пакетами и даже их версиями. Да что уж там установки, через командную строку Linux можно легко и удобно полностью администрировать машину;
- гибкости настройки и как следствие этого - разнообразии целевых платформ (от настольного компьютера до смартфона или бортового компьютера автомобиля);
- отличной поддержке - миллионы разработчиков пользуются десятками различных дистрибутивов Linux, делятся советами и помогаю друг другу решать проблемы;
- IoT - он же “Интернет вещей” - набирающее популярность направление в IT-индустрии по большей части реализуется с использованием микрокомпьютеров (Raspberry Pi, Orange Pi и т.д.), целевыми операционными системами которых являются Linux-подобные (Raspbian, Android). Также в нашем случае микрокомпьютеры наиболее удобны в боевом использовании возможностей машинного зрения - на беспилотных аппаратах.
Как установить Linux см.:
- На одноплатный компьютер Raspberry Pi - Raspberry Pi. Установка ОС Raspbian
- На любую ОС в т.ч. Windows в качестве виртуальной машины - Установка Ubuntu на Virtualbox
Почему Python
Так исторически сложилось, что этот объектно ориентированный язык программирования достаточно удобен и универсален настолько, что на нем пишутся как сервера, сайты, так и софт для пентеста и игры. Порог вхождения минимален и практически вообще отсутствует при наличии опыта программирования на других языках.Как установить Python и Open CV см. Установка Open CV (Linux)
Начало
Open CV (Computer Vision) - инструмент анализа данных с цифровых камер, т.е. на вход принимает графические файлы - фото и видео. Рассмотрим процесс открытия файлов в Python-скрипте.Если библиотека Open CV была установлена в виртуальное окружение с названием “cv” (заменить на своё), то прежде выполним следующие команды, чтоб применить это виртуальное окружение :
source ~/.profile
workon cv
Hello world
Создадим пустой текстовый файл будущего скрипта и откроем его в редакторе nano:touch test_open_cv.py
nano test_open_cv.py
import cv2
print("Open CV version: " + cv2.__version__)
Строка “import cv2” как ни странно импортирует библиотеку Open CV, без нее в скрипте невозможно будет получить доступ к нужным функциям. Кроме того, cv2 после импорта становится ОБЪЕКТОМ, к которому можно обращаться, передавая объекты в него и вызывая его методы. Один из методов - “__version__” - просто возвращает текущую версию, пристыкуем ее к строке "Open CV version: " справа и выведем все в терминал функцией print
Сохраним скрипт сочетанием клавиш Ctrl + O
Откроем второе окно терминала, перейдем в папку со скриптом и запустим командой
python3 test_open_cv.py
В случае успеха без ошибок увидим версию библиотеки - значит все готово, можно продолжать. Чтение изображения
В скрипте это происходит обращением к методу imread() импортированного объекта cvimg = cv2.imread("images/zebras.jpg",1)
Аргумент | Название | Суть |
-1 | IMREAD_UNCHANGED | Загружает изображение таким какое есть, включая альфа канал (если имеется) |
0 | IMREAD_GRAYSCALE | Загружает изображение в оттенках серого |
1 | IMREAD_COLOR | Стандартный флаг - загружает цветное изображение, игнорируя альфа-канал |
Вывод на экран
Для отладки процесса в будущем потребуется выводить промежуточный результат на экран, делается вызовом метода imshow() объекта cv, который также принимает два параметра: название нового окна, в котором будет выведено изображение и имя переменной, содержащей, загруженный файл.cv2.imshow('Window name with opened picture',img)
cv2.waitKey(0) & 0xFF
# cv2.waitKey(0)
cv2.destroyAllWindows()
Комментарии в Python начинаются с символа “#” - после нее символы в пределах строки игнорируются интерпретатором - это помогает сопровождать код комментариями или временно изолировать строки от выполнения.
Запустим скрипт: Окно должно закрыться при нажатии на любую клавишу клавиатуры.
Сохранение
Открытое изображение можно сохранить на диск с помощью метода imwrite, передав в качестве аргументов путь к новому файлу и переменную, содержащую открытое изображение:cv2.imwrite("images/zebras_saved.jpg",img)
import cv2
print("Open CV version: " + cv2.__version__)
img = cv2.imread("images/zebras.jpg",-1)
cv2.imshow('Window name with opened picture',img)
cv2.waitKey(0) & 0xFF
# cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("images/zebras_saved.jpg",img)
Загрузка фото с камеры Raspberry Pi
Как подключить и настроить камеру см. Редактировать Raspberry Pi. Подключение и работа с CSI-камерой
source ~/.profile #инициализация переменных окружения
workon cv #переход в созданного виртуальное окружение Python
python3 #переход в Python-консоль
import picamera #попытка импортировать библиотеку picamera
exit() #выход из Python-консоли назад в shell-оболочку
Если импорт библиотеки прошел с ошибкой, то необходимо установить ее находясь в выбранном виртуальном окружении (cv) командой:
easy_install picamera
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
camera = PiCamera()
camera.resolution = (640, 480)
raw = PiRGBArray(camera)
time.sleep(0.1) #camera waking up
camera.capture(raw, format="bgr")
img = raw.array
cv2.imshow('Photo from RPi',img)
cv2.waitKey(0) & 0xFF
cv2.destroyAllWindows()
cv2.imwrite("images/photo.jpg",img)
camera.capture('image.jpg')
Open CV воспринимает для себя каждое изображение как матрицу пикселей
Open CV для себя представляет изображение в качестве NumPy-массива. NumPy - это библиотека для Python позволяющая удобно обрабатывать огромные массивы данных - будь то просто массив, матрица (пиксели изображения например), трех- и более мерные массивы данных. NumPy применяется в машинном обучении, где используются разнообразные типы данных (текст, числа, изображения), поэтому с ним интегрированы многие другие библиотеки - в том числе picamera.
Импорт объекта PiRGBArray библиотеки picamera, позволяющего представить захваченное камерой изображение в качестве NumPy-массива:
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
camera = PiCamera()
camera.resolution = (640, 480)
raw = PiRGBArray(camera)
time.sleep(0.1) #camera waking up
camera.capture(raw, format="bgr")
img = raw.array
cv2.imshow('Photo from RPi',img)
cv2.waitKey(0) & 0xFF
cv2.destroyAllWindows()
cv2.imwrite("images/photo.jpg",img)