Базовые функции OpenCV
Теперь перейдем к практической части. Первое, что нам необходимо сделать, --- это импортировать библиотеку. Есть несколько путей импорта, самый распространенный --- это использовать выражение:
import cv2Импорт и просмотр изображения
Код для отображения изображения:
import cv2
image = cv2.imread("./путь/к/изображению.расширение")
cv2.imshow("Image", image)
cv2.waitKey(0)
сv2.destroyAllWindows()
Примечание: При чтении способом выше изображение находится в цветовой модели не RGB, а BGR. Возможно, в начале это не так важно, но как только мы начнем работать с цветом — стоит знать об этой особенности.
Есть 2 решения:
- Поменять местами 1-й канал (R — красный) с 3-м каналом (B — синий), и тогда красный цвет будет (0,0,255), а не (255,0,0).
- Поменять цветовое пространство на RGB
Пример:
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)И тогда в коде работать уже не с image, а с rgb_image.
Совет: Чтобы закрыть окно, в котором отображается изображение, нажмите любую клавишу.
На протяжении раздела вывода изображений будет использоваться следующий код:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()Сохранение изображения
Для того чтобы сохранить изображение, необходимо использовать следующий код:
import cv2 image = cv2.imread("./импорт/путь.расширение")
cv2.imwrite("./экспорт/путь.расширение", image)Кадрирование

Код для кадрирования изображения:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread("image.jpg")
cropped = image[10:500, 100:500]
viewImage(cropped, "Кадрированное изображение")
Где image[10:500, 500:2000] — это image[y:y + высота, x:x + ширина].
Изменение размера

Код для изменения размера:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread("image.jpg")
scale_percent = 20
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)
resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
viewImage(resized, "После изменения размера на 20 %")
Размытое изображение

Для использования размытия применяется следующий код:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread("image.jpg")
blurred = cv2.GaussianBlur(image, (51, 51), 0)
viewImage(blurred, "Размытое")
Функция GaussianBlur (размытие по Гауссу) принимает 3 параметра:
- исходное изображение;
- кортеж из 2 положительных нечётных чисел. Чем больше числа, тем больше сила сглаживания;
- sigmaX и sigmaY. Если эти параметры оставить равными 0, то их значение будет рассчитано автоматически.
Перевод в градации серого и в черно-белое изображение по порогу

Программыный код, для применения цветовой градации черно-белого:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread("image.jpg")
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, threshold_image = cv2.threshold(gray_image, 100, 255, 0)
viewImage(gray_image, "Градации серого")
viewImage(threshold_image, "Чёрно-белое")
gray_image — это одноканальная версия изображения. Функция threshold возвращает изображение, в котором все пиксели, которые темнее (меньше) 127 заменены на 0, а все, которые ярче (больше) 127, — на 255. Для ясности другой пример:
ret, threshold = cv2.threshold(im, 150, 200, 10)Здесь все, что темнее, чем 150, заменяется на 10, а все, что ярче, — на 200.
Рисование линий

Программный код для отрисовки линии:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread("image.jpg")
output = image.copy()
cv2.line(output, (369, 180), (564, 571), (0, 0, 255), 5)
viewImage(output, "2 растения, разделённые линией")
Функция line принимает 5 параметров:
- само изображение, на котором рисуется линия;
- координата первой точки (x1, y1);
- координата второй точки (x2, y2);
- цвет линии (GBR/RGB в зависимости от выбранной цветовой модели);
- толщина линии.
Рисование прямоугольников

Программный код, для рисования прямоугольника:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread("image.jpg")
output = image.copy()
cv2.rectangle(output, (297, 223), (370, 340), (0, 255, 255), 10)
viewImage(output, "Обводим прямоугольником лист")
Эта функция принимает 5 параметров:
- Само изображение.
- Координата верхнего левого угла (x1, y1).
- Координата нижнего правого угла (x2, y2).
- Цвет прямоугольника (GBR/RGB в зависимости от выбранной цветовой модели).
- Толщина линии прямоугольника.
Текст на изображении

Программный код, для отрисовки текста:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread("image.jpg")
output = image.copy()
cv2.putText(output, "Plants", (100, 100),cv2.FONT_HERSHEY_SIMPLEX, 3, (30, 105, 210), 15)
viewImage(output, "Изображение с текстом")
Функция putText принимает 7 параметров:
- непосредственно изображение;
- текст для изображения;
- координата нижнего левого угла начала текста (x, y);
- используемый шрифт;
- размер шрифта;
- цвет текста (GBR/RGB в зависимости от выбранной цветовой модели);
- толщина линий букв.
Распознавание лиц
На этот раз без цветочков.

Программный код, для поиска лиц на изображении:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread("image.jpg")
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale( gray, scaleFactor= 1.1, minNeighbors= 5, minSize=(10, 10) )
faces_detected = "Лиц обнаружено: " + format(len(faces)) print(faces_detected)
# Рисуем квадраты вокруг лиц
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
viewImage(image,faces_detected)
detectMultiScale — общая функция для распознавания как лиц, так и объектов. Чтобы функция искала именно лица, мы передаем ей соответствующий каскад. Функция detectMultiScale принимает 4 параметра:
- обрабатываемое изображение в градации серого;
- параметр scaleFactor. Некоторые лица могут быть больше других, поскольку находятся ближе, чем остальные. Этот параметр компенсирует перспективу;
- алгоритм распознавания использует скользящее окно во время распознавания объектов. Параметр minNeighbors определяет количество объектов вокруг лица. То есть чем больше значение этого параметра, тем больше аналогичных объектов необходимо алгоритму, чтобы он определил текущий объект как лицо. Слишком маленькое значение увеличит количество ложных срабатываний, а слишком большое сделает алгоритм более требовательным;
- minSize — непосредственно размер этих областей.
Подключение USB-камеры
Чтобы запустить просмотр изображения с камеры, подключенной к NanoPi следует воспользоваться инструкцией с некоторыми изменениями.
По инструкции следует запустить скрипт:
$ cd /root/C/mjpg-streamer
$ make
$ ./start.shПри запуске скрипта ./start.sh в нем требуется изменить наименование устройства с /dev/video0 на /dev/video1, поскольку к /dev/video0 подключается mipi-csi-камера, а в данном случае используется usb-камера. Соответственно и в следующих командах должно использоваться устройство /dev/video1. Далее следует на компьютере открыть веб-браузер и перейти по адресу ip_адрес_nanopi:8080. На этой веб-странице возможно посмотреть изображение, приходящее с камеры, без обработки библиотекой opencv. Скрипт, запускаемый командой ./start.sh, запускает web-сервис, который транслирует изображение с камеры, наподобие IP-камеры. Сервис также имеет интерфейс, через который можно получить видеопоток с камеры в программу. Для того чтобы им воспользоваться, нужно перейти во вкладку VideoLan и скопировать оттуда ссылку вида:
http://192.168.1.20:8080/?action=streamЭту ссылку следует вставить в строку в последующей программе.
camera = cv2.VideoCapture("http://192.168.1.20:8080/?action=stream")Таким образом можно полуить видеопоток с usb-камеры в программу на питоне и обработать его.