Open CV. Основы работы с изображениями

Содержание курса по Open CV:
  1. Основы работы с изображениями
  2. Open CV. Основы работы с видео
  3. Инструменты визуализации

Выбор окружения

В этой статье рассмотрим азы работы с библиотекой Open CV для языка программирования Python в среде операционной системы Linux.

Почему Linux

Linux-подобные операционные системы по большей части свободно распространяются, нетребовательны к ресурсам компьютера, и самое главное наиболее приспособлены для разработки.
Это выражается в следующих аспектах:
  • удобстве установки и вообще манипулирования программными пакетами и даже их версиями. Да что уж там установки, через командную строку Linux можно легко и удобно полностью администрировать машину;
  • гибкости настройки и как следствие этого - разнообразии целевых платформ (от настольного компьютера до смартфона или бортового компьютера автомобиля);
  • отличной поддержке - миллионы разработчиков пользуются десятками различных дистрибутивов Linux, делятся советами и помогаю друг другу решать проблемы;
  • IoT - он же “Интернет вещей” - набирающее популярность направление в IT-индустрии по большей части реализуется с использованием микрокомпьютеров (Raspberry Pi, Orange Pi и т.д.), целевыми операционными системами которых являются Linux-подобные (Raspbian, Android). Также в нашем случае микрокомпьютеры наиболее удобны в боевом использовании возможностей машинного зрения - на беспилотных аппаратах.
Как установить Linux см.:

Почему Python

Так исторически сложилось, что этот объектно ориентированный язык программирования достаточно удобен и универсален настолько, что на нем пишутся как сервера, сайты, так и софт для пентеста и игры. Порог вхождения минимален и практически вообще отсутствует при наличии опыта программирования на других языках.
Как установить Python и Open CV см. Установка Open CV (Linux)

Начало

Open CV (Computer Vision) - инструмент анализа данных с цифровых камер, т.е. на вход принимает графические файлы - фото и видео. Рассмотрим процесс открытия файлов в Python-скрипте.
Если библиотека Open CV была установлена в виртуальное окружение с названием “cv” (заменить на своё), то прежде выполним следующие команды, чтоб применить это виртуальное окружение :
source ~/.profile 
workon cv 

индикатором успешности станет приставка (cv) в терминале

Hello world

Создадим пустой текстовый файл будущего скрипта и откроем его в редакторе nano:
touch test_open_cv.py 
nano test_open_cv.py 

Попробуем просто вывести в консоль версию установленной Open CV - тем самым проверим готовность системы:
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() импортированного объекта cv
img = cv2.imread("images/zebras.jpg",1) 

Метод imread() принимает два аргумента: первый - это путь к файлу (относительный или абсолютный), а второй указывает один из трёх методов чтения - “-1”, “0” или “1” (указываются без кавычек)
Аргумент
Название
Суть
-1
IMREAD_UNCHANGED
Загружает изображение таким какое есть, включая альфа канал (если имеется)
0
IMREAD_GRAYSCALE
Загружает изображение в оттенках серого
1
IMREAD_COLOR
Стандартный флаг - загружает цветное изображение, игнорируя альфа-канал
Указанный файл будет записан в переменную img.

Вывод на экран

Для отладки процесса в будущем потребуется выводить промежуточный результат на экран, делается вызовом метода imshow() объекта cv, который также принимает два параметра: название нового окна, в котором будет выведено изображение и имя переменной, содержащей, загруженный файл.
cv2.imshow('Window name with opened picture',img) 

В Open CV команды открытия изображения должны обязательно сопровождаться командами закрытия окна и/или функцией ожидания условия:
cv2.waitKey(0) & 0xFF 
# cv2.waitKey(0) 
cv2.destroyAllWindows() 

Приписка “ & 0xFF” указывается, если скрипт запускается на 64-битной системе.
Комментарии в 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-камерой

Прежде всего для этого понадобится библиотека picamera. Обычно она предустановлена в дистрибутиве Raspbian, но внутри виртуального окружения (в нашем примере оно названо “cv”) может быть недоступна. Проверить это можно через Python-консоль:
source ~/.profile #инициализация переменных окружения 
workon cv #переход в созданного виртуальное окружение Python 
python3 #переход в Python-консоль 
import picamera #попытка импортировать библиотеку picamera 
exit() #выход из Python-консоли назад в shell-оболочку 

Если импорт библиотеки прошел с ошибкой, то необходимо установить ее находясь в выбранном виртуальном окружении (cv) командой:
easy_install picamera 

Создадим новый файл (например “rpi_opencv_get_pic.py”) и вставим в него следующий скрипт:
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')

А затем прочитать этот файл “image.jpg” написанным выше по тексту скриптом, но это “костыль”..
Open CV воспринимает для себя каждое изображение как матрицу пикселей
Open CV для себя представляет изображение в качестве NumPy-массива. NumPy - это библиотека для Python позволяющая удобно обрабатывать огромные массивы данных - будь то просто массив, матрица (пиксели изображения например), трех- и более мерные массивы данных. NumPy применяется в машинном обучении, где используются разнообразные типы данных (текст, числа, изображения), поэтому с ним интегрированы многие другие библиотеки - в том числе picamera.
Импорт объекта PiRGBArray библиотеки picamera, позволяющего представить захваченное камерой изображение в качестве NumPy-массива:
from picamera.array import PiRGBArray 

Импортируем объект PiCamera для захвата снимка:
from picamera import PiCamera 

Естественно библиотека Open CV и  time, чтоб создать задержку
import time 
import cv2 

Создаем экземпляр класса PiCamera, устанавливаем разрешение снимка:
camera = PiCamera() 
camera.resolution = (640, 480) 

Создаем экземпляр класса PiRGBArray:
raw = PiRGBArray(camera) 

Инициализируем задержку для включения камеры:
time.sleep(0.1) #camera waking up 

Захватываем изображение в переменную raw (с классом PiRGBArray):
camera.capture(raw, format="bgr") 

Присваиваем переменной img сконвертированный в массив захваченный снимок:
img = raw.array 

Далее пройденный выше по тексту этап:
cv2.imshow('Photo from RPi',img) 
cv2.waitKey(0) & 0xFF 
cv2.destroyAllWindows() 
cv2.imwrite("images/photo.jpg",img) 

Данный скрипт сделает снимок, выведет на экран (это уже будет объект Open CV) и сохранит в файл "images/photo.jpg".


Архив с примерами можно скачать здесь.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.