Skip to content

Базовые функции OpenCV

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

import cv2

Импорт и просмотр изображения

Код для отображения изображения:

import cv2
image = cv2.imread("./путь/к/изображению.расширение")
cv2.imshow("Image", image)
cv2.waitKey(0)
сv2.destroyAllWindows()

Отображение изображения

Примечание: При чтении способом выше изображение находится в цветовой модели не RGB, а BGR. Возможно, в начале это не так важно, но как только мы начнем работать с цветом — стоит знать об этой особенности.

Есть 2 решения:

  1. Поменять местами 1-й канал (R — красный) с 3-м каналом (B — синий), и тогда красный цвет будет (0,0,255), а не (255,0,0).
  2. Поменять цветовое пространство на 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 параметра:

  1. исходное изображение;
  2. кортеж из 2 положительных нечётных чисел. Чем больше числа, тем больше сила сглаживания;
  3. 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 параметров:

  1. само изображение, на котором рисуется линия;
  2. координата первой точки (x1, y1);
  3. координата второй точки (x2, y2);
  4. цвет линии (GBR/RGB в зависимости от выбранной цветовой модели);
  5. толщина линии.

Рисование прямоугольников

Отображение изображения

Программный код, для рисования прямоугольника:

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 параметров:

  1. Само изображение.
  2. Координата верхнего левого угла (x1, y1).
  3. Координата нижнего правого угла (x2, y2).
  4. Цвет прямоугольника (GBR/RGB в зависимости от выбранной цветовой модели).
  5. Толщина линии прямоугольника.

Текст на изображении

Отображение изображения

Программный код, для отрисовки текста:

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 параметров:

  1. непосредственно изображение;
  2. текст для изображения;
  3. координата нижнего левого угла начала текста (x, y);
  4. используемый шрифт;
  5. размер шрифта;
  6. цвет текста (GBR/RGB в зависимости от выбранной цветовой модели);
  7. толщина линий букв.

Распознавание лиц

На этот раз без цветочков.

Изображение с лицами

Программный код, для поиска лиц на изображении:

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 параметра:

  1. обрабатываемое изображение в градации серого;
  2. параметр scaleFactor. Некоторые лица могут быть больше других, поскольку находятся ближе, чем остальные. Этот параметр компенсирует перспективу;
  3. алгоритм распознавания использует скользящее окно во время распознавания объектов. Параметр minNeighbors определяет количество объектов вокруг лица. То есть чем больше значение этого параметра, тем больше аналогичных объектов необходимо алгоритму, чтобы он определил текущий объект как лицо. Слишком маленькое значение увеличит количество ложных срабатываний, а слишком большое сделает алгоритм более требовательным;
  4. 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-камеры в программу на питоне и обработать его.