Подробное руководство по OpenCV для Python

Введение

От робототехники до программного обеспечения для распознавания лиц, компьютерное зрение имеет множество применений в нашей повседневной жизни. OpenCV предоставляет обширную библиотеку с открытым исходным кодом для любителей и профессионалов, чтобы использовать возможности обработки изображений и использовать их, позволяя обнаруживать объекты, манипулировать изображениями и анализировать видео. В этом сообщении в блоге будут рассмотрены базовые знания, необходимые для быстрого старта в освоении OpenCV и бесчисленных утилит, которые он содержит.

Семь основ OpenCV

Отображение вашей веб-камеры

Если у вас не установлен OpenCV, вы можете установить его с помощью команды

pip установить opencv-python

Первым шагом к любому коду OpenCV всегда является импорт пакета.

import cv2

Инициализируйте объект VideoCapture для i-й веб-камеры. Другими словами, здесь, поскольку указан 0, объект VideoCapture будет создан для первой веб-камеры на моем компьютере. Передача 1 в качестве параметра даст вторую веб-камеру и так далее.

cap = cv2.VideoCapture(0)

Откройте бесконечный цикл, в котором на каждой итерации с веб-камеры будет считываться кадр. Как правило, учат, что бесконечные циклы не являются хорошей практикой, но существуют условия выхода, так что это не будет проблемой.

while True:
    ret, frame = cap.read()

Отобразите фрейм в отдельном окне с именем «frame», если фрейм был прочитан без ошибок.

if ret: cv2.imshow(‘frame’, frame)

Выход из бесконечного цикла при нажатии клавиши «q». Другими словами, прекращение прямой трансляции с веб-камеры.

if cv2.waitKey(1) & 0xFF == ord(‘q’):
    break

Чтобы предотвратить утечку памяти, как только мы закончим отображать кадры с веб-камеры, мы освобождаем все ресурсы, которые были выделены OpenCV для создания окон и объекта VideoCapture().

cap.release()
cv2.destroyAllWindows()

Окончательный код должен выглядеть так

import cv2

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()

    if ret: cv2.imshow('frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Нарисуйте прямоугольник в потоке изображений

Весь код отображения кадров с веб-камеры переводится, за исключением того, что теперь над кадром выполняется некоторая обработка перед его отображением.

Как и раньше, перед обработкой фрейма мы проверяем, правильно ли получен фрейм.

if ret:

Метод cv2.rectangle имеет пять основных параметров.

  1. Изображение для рисования прямоугольника; в данном случае кадр с веб-камеры.
  2. Верхняя левая координата прямоугольника в формате (x, y); произвольно мы выбрали (100, 100).
    — Помните, что изображения представлены в перевернутой декартовой системе координат, что означает, что начало координат находится в левом верхнем углу изображения, а ось Y увеличивается вниз.
  3. Нижняя правая координата прямоугольника, опять же в формате (x, y); мы выбрали (1000, 1000).
  4. Цвет прямоугольника в формате (b,g,r); мы выбрали (255, 0, 0), который является синим.
    — OpenCV по умолчанию использует цветовое пространство BGR.
  5. Толщина прямоугольника; мы выбрали 5.
frame = cv2.rectangle(frame, (100, 100), (1000, 1000), (255, 0, 0), 5)

Отобразите измененный кадр в окне с именем «кадр».

cv2.imshow(‘frame’, frame)

Окончательный код должен выглядеть так

import cv2

cap = cv2.VideoCapture(1)

while True:
    ret, frame = cap.read()

    if ret:
        frame = cv2.rectangle(frame, (100, 100), (1000, 1000), (255, 0, 0), 5)
        cv2.imshow('frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Загрузка и отображение изображения

Во-первых, необходимо импортировать библиотеку OpenCV. Библиотека sys также импортируется по причинам, которые будут более понятны ниже.

import cv2
import sys

Затем изображение, которое мы собираемся загрузить, должно быть сохранено как объект с помощью функции cv2.imread. Эта функция загружает изображение, используя путь к файлу, указанный в первом аргументе. Второй аргумент функции необязателен, но указывает формат, в котором мы хотим, чтобы изображение было прочитано (IMREAD_COLOR, IMREAD_UNCHANGED, IMREAD_GRAYSCALE). Примечание: мы не изменяем изображение со вторым аргументом.

img = cv2.imread(cv2.samples.findFile(“myimage.jpg”, cv2.IMREAD_GRAYSCALE))

Чтобы избежать ошибки, прежде чем мы попытаемся отобразить изображение, мы должны проверить, не хранится ли что-то в нашем объекте img.

if img == None:
    sys.exit("Could not read the image.")

Теперь изображение сохранено. Чтобы отобразить изображение, мы будем использовать функцию cv2.imshow. Первый аргумент — это заголовок окна, в котором будет отображаться изображение, а второй — объект img, который мы хотим отобразить. Мы также будем использовать функцию cv2.waitKey для регистрации нажатия клавиши «q», чтобы мы могли выйти из цикла.

cv2.imshow("Display window", img)

#0 is used to tell the program to wait forever for a keyboard input
cv2.waitKey(0)

Окончательный код должен выглядеть так:

import cv2
import sys

img = cv2.imread(cv2.samples.findFile("myimage.jpg", cv2.IMREAD_GRAYSCALE))

if img == None:
    sys.exit("Could not read the image.")

cv2.imshow("Display window", img)

#0 is used to tell the program to wait forever for a keyboard input
cv2.waitKey(0)

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

Любое изображение, хранящееся с использованием OpenCV, считается массивом NumPy. Поэтому мы можем обрезать изображение, используя его размеры. Чтобы получить размеры изображения, мы распечатываем форму массива с помощью функции shape.

print(img.shape)

Когда размеры изображения отображаются в консоли, мы можем использовать нарезку массива для изменения размеров изображения. Первое измерение — это количество строк, высота изображения. Второе измерение — это количество столбцов, ширина изображения. Мы будем хранить обрезанное изображение в новом объекте.

cropped = img[50:810, 100:300]

Нам не нужно беспокоиться об обрезке изображения, так как окно изменит свой размер, чтобы идеально соответствовать новому объекту.

Окончательный код должен выглядеть так

import cv2
import sys

img = cv2.imread(cv2.samples.findFile("myimage.jpg", cv2.IMREAD_GRAYSCALE))

if img == None:
    sys.exit("Could not read the image.")

print(img.shape)
cropped = img[50:810, 100:300]

cv2.imshow("Display window", cropped)

cv2.waitKey(0)

Преобразование изображения из BGR в оттенки серого

Способ преобразования изображения из BGR в оттенки серого — использование функции cv2.cvtColor. Первый аргумент функции cv2.cvtColor – это имя объекта изображения, а второй – место, где можно указать COLOR_BGR2GRAY, чтобы преобразовать изображение в оттенки серого и сохранить новый изображение в новом объекте.

grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Окончательный код должен выглядеть так

import cv2
import sys

img = cv2.imread(cv2.samples.findFile("myimage.jpg", cv2.IMREAD_GRAYSCALE))

if img == None:
    sys.exit("Could not read the image.")

grayscale = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow("Display window", grayscale)

cv2.waitKey(0)

Размытие изображения

Как всегда, сначала убедитесь, что у вас импортирована библиотека OpenCV, используя:

import cv2

В OpenCV существует четыре основных метода размытия изображения.

Во-первых, есть усреднение, которое берет все значения пикселей в указанной области, усредняет их и заменяет центральный пиксель этим усредненным значением. (также известный как свертка)

Функция:

cv2.blur(ksize, ksize)

Пример:

img = cv2.imread(‘image.png’)
avgBlur = cv2.blur(img, (5, 5))

Далее идет размытие по Гауссу, в котором в качестве фильтра используется ядро ​​Гаусса вместо окружающих пикселей. Эта форма размытия очень эффективна для удаления шума с изображения.

Функция:

cv2.GaussianBlur(inputImage, (ksize, ksize), sigmaX)

Пример:

img = cv2.imread(‘image.png’)
gaussBlur = cv2.GaussianBlur(img, (5, 5), 0)

После этого идет медианное размытие, которое похоже на то, как работает размытие усреднения, за исключением того, что оно берет медиану значений окружающих пикселей вместо среднего. Он заменит центральный пиксель этим усредненным значением. Эта форма размытия также эффективна для удаления шума с изображения.

Функция:

cv2.medianBlur(inputImage, ksize)

Пример:

img = cv2.imread(‘image.png’)
medianBlur = cv2.medianBlur(img, 5)

Наконец, есть двусторонняя фильтрация, которая будет учитывать как близость пикселей вокруг центрального пикселя, так и интенсивность этих пикселей. Если разница в интенсивности между центральным пикселем и другим соседним пикселем велика, то она не будет учитываться в функции размытия. По этой причине двусторонняя фильтрация очень эффективно удаляет шум, сохраняя при этом четкие края изображения.

Функция:

cv2.bilateralFilter(inputImage, diameter, sigmaColor, sigmaSpace)

Пример:

img = cv2.imread(‘image.png’)
bilateralFilterBlur = cv2.bilateralFilter(img, 9, 75, 75)

Окончательный код должен выглядеть так (blur_function — один из продемонстрированных выше методов размытия)

import cv2
import sys

img = cv2.imread('image.png')

if img == None:
    sys.exit("Could not read the image.")

blurred_img = cv2.blur_function(img, ...)

cv2.imshow("Display window", blurred_img)

cv2.waitKey(0)

Поворот изображения

Как обычно, библиотеку OpenCV необходимо импортировать.

import cv2

Воспользуемся очень удобной функцией

cv2.rotate(src, rotateCode)

Первый параметр — это исходное изображение, а второй параметр — это перечисление, указывающее, насколько нужно повернуть изображение. Есть три очевидных параметра: cv2.ROTATE_90_CLOCKWISE, cv2.ROTATE_180 и cv2.ROTATE_90_COUNTERCLOCKWISE.

Пример:

src = cv2.imread(‘image.png’)
image = cv2.rotate(src, cv2.ROTATE_90_COUNTERCLOCKWISE)

Окончательный код должен выглядеть так

import cv2
import sys

src = cv2.imread('image.png')

if src == None:
    sys.exit("Could not read the image.")

image = cv2.rotate(src, cv2.ROTATE_90_COUNTERCLOCKWISE)

cv2.imshow("Display window", image)

cv2.waitKey(0)

Заключение

В этом блоге вы узнали, как изменять различные свойства изображения, а также отслеживать изображения в режиме реального времени. Изучение того, как использовать функции веб-камеры, является важным аспектом OpenCV. В сочетании с функциями обработки изображений, предоставляемыми OpenCV, вы можете создавать мощные, реальные приложения и многое другое.

Если вам понравился этот блог, посмотрите этот блог о мощном использовании I2C, протокола последовательной связи.