Привет, Хабр! Запускаю цикл статей по библиотеке OpenCV в Python. Кому интересно, добро пожаловать под кат!
Введение
OpenCV — это open source библиотека компьютерного зрения, которая предназначена для анализа, классификации и обработки изображений. Широко используется в таких языках как C, C++, Python и Java.
Установка
Будем считать, что Python и библиотека OpenCV у вас уже установлены, если нет, то вот инструкция для установки python на windows и на ubuntu, установка OpenCV на windows и на ubuntu.
Немного про пиксели и цветовые пространства
Перед тем как перейти к практике, нам нужно разобраться немного с теорией. Каждое изображение состоит из набора пикселей. Пиксель — это строительный блок изображения. Если представить изображение в виде сетки, то каждый квадрат в сетке содержит один пиксель, где точке с координатой ( 0, 0 ) соответствует верхний левый угол изображения.
Hand Tracking 30 FPS using CPU | OpenCV Python (2021) | Computer Vision
К примеру, представим, что у нас есть изображение с разрешением 400×300 пикселей. Это означает, что наша сетка состоит из 400 строк и 300 столбцов. В совокупности в нашем изображении есть 400*300 = 120000 пикселей.
В большинстве изображений пиксели представлены двумя способами: в оттенках серого и в цветовом пространстве RGB. В изображениях в оттенках серого каждый пиксель имеет значение между 0 и 255, где 0 соответствует чёрному, а 255 соответствует белому. А значения между 0 и 255 принимают различные оттенки серого, где значения ближе к 0 более тёмные, а значения ближе к 255 более светлые:
Цветные пиксели обычно представлены в цветовом пространстве RGB(red, green, blue — красный, зелёный, синий), где одно значение для красной компоненты, одно для зелёной и одно для синей. Каждая из трёх компонент представлена целым числом в диапазоне от 0 до 255 включительно, которое указывает как «много» цвета содержится.
Исходя из того, что каждая компонента представлена в диапазоне [0,255], то для того, чтобы представить насыщенность каждого цвета, нам будет достаточно 8-битного целого беззнакового числа. Затем мы объединяем значения всех трёх компонент в кортеж вида (красный, зеленый, синий). К примеру, чтобы получить белый цвет, каждая из компонент должна равняться 255: (255, 255, 255). Тогда, чтобы получить чёрный цвет, каждая из компонент должна быть равной 0: (0, 0, 0). Ниже приведены распространённые цвета, представленные в виде RGB кортежей:
Импорт библиотеки OpenCV
Теперь перейдём к практической части. Первое, что нам необходимо сделать — это импортировать библиотеку. Есть несколько путей импорта, самый распространённый — это использовать выражение:
OpenCV Python Tutorial #3 — Cameras and VideoCapture
import cv2
Также можно встретить следующую конструкцию для импорта данной библиотеки:
from cv2 import cv2
Загрузка, отображение и сохранение изображения
def loading_displaying_saving(): img = cv2.imread(‘girl.jpg’, cv2.IMREAD_GRAYSCALE) cv2.imshow(‘girl’, img) cv2.waitKey(0) cv2.imwrite(‘graygirl.jpg’, img)
Для загрузки изображения мы используем функцию cv2.imread(), где первым аргументом указывается путь к изображению, а вторым аргументом, который является необязательным, мы указываем, в каком цветовом пространстве мы хотим считать наше изображение. Чтобы считать изображение в RGB — cv2.IMREAD_COLOR, в оттенках серого — cv2.IMREAD_GRAYSCALE. По умолчанию данный аргумент принимает значение cv2.IMREAD_COLOR.
Данная функция возвращает 2D (для изображения в оттенках серого) либо 3D (для цветного изображения) массив NumPy. Форма массива для цветного изображения: высота x ширина x 3, где 3 — это байты, по одному байту на каждую из компонент. В изображениях в оттенках серого всё немного проще: высота x ширина.
С помощью функции cv2.imshow() мы отображаем изображение на нашем экране. В качестве первого аргумента мы передаём функции название нашего окна, а вторым аргументом изображение, которое мы загрузили с диска, однако, если мы далее не укажем функцию cv2.waitKey(), то изображение моментально закроется. Данная функция останавливает выполнение программы до нажатия клавиши, которую нужно передать первым аргументом. Для того, чтобы любая клавиша была засчитана передаётся 0. Слева представлено изображение в оттенках серого, а справа в формате RGB:
И, наконец, с помощью функции cv2.imwrite() записываем изображение в файл в формате jpg(данная библиотека поддерживает все популярные форматы изображений:png, tiff,jpeg,bmp и т. д., поэтому можно было сохранить наше изображение в любом из этих форматов), где первым аргументом передаётся непосредственно само название и расширение, а следующим параметром изображение, которое мы хотим сохранить.
Доступ к пикселям и манипулирование ими
Для того, чтобы узнать высоту, ширину и количество каналов у изображения можно использовать атрибут shape:
print(«Высота:»+str(img.shape[0])) print(«Ширина:» + str(img.shape[1])) print(«Количество каналов:» + str(img.shape[2]))
Важно помнить, что у изображений в оттенках серого img.shape[2] будет недоступно, так как данные изображения представлены в виде 2D массива.
Чтобы получить доступ к значению пикселя, нам просто нужно указать координаты x и y пикселя, который нас интересует. Также важно помнить, что библиотека OpenCV хранит каналы формата RGB в обратном порядке, в то время как мы думаем в терминах красного, зеленого и синего, то OpenCV хранит их в порядке синего, зеленого и красного цветов:
(b, g, r) = img[0, 0] print(«Красный: <>, Зелёный: <>, Синий: <>».format(r, g, b))
Cначала мы берём пиксель, который расположен в точке (0,0). Данный пиксель, да и любой другой пиксель, представлены в виде кортежа. Заметьте, что название переменных расположены в порядке b, g и r. В следующей строке выводим значение каждого канала на экран. Как можно увидеть, доступ к значениям пикселей довольно прост, также просто можно и манипулировать значениями пикселей:
img[0, 0] = (255, 0, 0) (b, g, r) = img[0, 0] print(«Красный: <>, Зелёный: <>, Синий: <>».format(r, g, b))
В первой строке мы устанавливаем значение пикселя (0, 0) равным (255, 0, 0), затем мы снова берём значение данного пикселя и выводим его на экран, в результате мне на консоль вывелось следующее:
Красный: 251, Зелёный: 43, Синий: 65 Красный: 0, Зелёный: 0, Синий: 255
На этом у нас конец первой части. Если вдруг кому-то нужен исходный код и картинка, то вот ссылка на github. Всем спасибо за внимание!
Источник: habr.com
Освоение OpenCV с помощью Python: Полное руководство по обработке изображений и компьютерному зрению
OpenCV (Библиотека компьютерного зрения с открытым исходным кодом) – это мощная и широко используемая библиотека для обработки изображений и задач компьютерного зрения. Используя Python, популярный и простой в освоении язык программирования, разработчики могут создавать эффективные приложения для таких задач, как обработка изображений, обнаружение объектов и распознавание лиц. В этой статье мы рассмотрим библиотеку Python OpenCV, продемонстрируем, как использовать её для решения распространённых проблем, и приведём практические примеры кода. Давайте начинать!
OpenCV – это библиотека с открытым исходным кодом, которая предоставляет разработчикам инструменты и алгоритмы для задач компьютерного зрения и машинного обучения. Она поддерживает несколько языков программирования, включая C++, Java и Python. Привязки Python для OpenCV, известные как opencv-python , позволяют разработчикам Python легко использовать возможности OpenCV в своих приложениях.
1. Установка OpenCV с помощью Python
Вы можете установить библиотеку OpenCV с привязками Python с помощью pip, менеджера пакетов Python:
pip install opencv-python pip install numpy pip install opencv-python-headless # If you do not need GUI features
2. Основные операции OpenCV
Давайте рассмотрим некоторые основные операции OpenCV.
2.1. Чтение и отображение изображений
Чтобы прочитать и отобразить изображение с помощью OpenCV, вы можете использовать следующий код:
import cv2 # Read an image from a file image = cv2.imread(‘image.jpg’) # Display the image in a window cv2.imshow(‘Image’, image) # Wait for a key press and close the window cv2.waitKey(0) cv2.destroyAllWindows()
2.2. Основные манипуляции с изображениями
Вот как изменить размер, повернуть и перевернуть изображение с помощью OpenCV:
import cv2 # Read an image from a file image = cv2.imread(‘image.jpg’) # Resize the image resized_image = cv2.resize(image, (100, 100)) # Resize the image to 100×100 pixels # Rotate the image (rows, cols) = image.shape[:2] # Get the number of rows and columns in the original image center = (cols // 2, rows // 2) # Calculate the center point of the image rotation_matrix = cv2.getRotationMatrix2D(center, 45, 1) # Create a rotation matrix for a 45-degree rotation around the center point rotated_image = cv2.warpAffine(image, rotation_matrix, (cols, rows)) # Apply the rotation to the original image # Flip the image flipped_image = cv2.flip(image, 1) # 0 for vertical flip, 1 for horizontal flip, -1 for both # Display the images cv2.imshow(‘Original’, image) cv2.imshow(‘Resized’, resized_image) cv2.imshow(‘Rotated’, rotated_image) cv2.imshow(‘Flipped’, flipped_image) cv2.waitKey(0) # Wait for a key press cv2.destroyAllWindows() # Close all windows
2.3. Преобразование цветовых пространств
OpenCV позволяет конвертировать изображения между различными цветовыми пространствами, такими как RGB, HSV и оттенки серого:
import cv2 # Read an image from a file image = cv2.imread(‘image.jpg’) # Convert the image to grayscale gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Convert the image to HSV hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # Hue, Saturation, Value # Display the images cv2.imshow(‘Original’, image) cv2.imshow(‘Grayscale’, gray_image) cv2.imshow(‘HSV’, hsv_image) cv2.waitKey(0) cv2.destroyAllWindows()
3. Решения реальных проблем с помощью Python OpenCV
Давайте рассмотрим пару примеров из реального мира, где Python OpenCV может быть полезен.
3.1. Выделение границ
Выделение границ – это метод, используемый для определения границ объектов на изображениях. Одним из популярных алгоритмов обнаружения границ является алгоритм Canny. Вот как применить осторожное выделение границ с помощью OpenCV:
import cv2 # Read an image from a file image = cv2.imread(‘image.jpg’) # Convert the image to grayscale gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Apply Canny edge detection edges = cv2.Canny(gray_image, 100, 200) # 100 and 200 are the thresholds # The Canny edge detector uses two thresholds to detect a wide range of edges. # The first threshold is used to detect strong edges (strong gradient) while the second threshold is used to detect weak edges (weak gradient). # Any gradient value larger than the upper threshold is considered to be an edge. # Any value below the lower threshold is considered not to be an edge. # Display the images cv2.imshow(‘Original’, image) cv2.imshow(‘Edges’, edges) cv2.waitKey(0) cv2.destroyAllWindows()
3.2. Распознавание лиц
Распознавание лиц – это метод компьютерного зрения, используемый для определения местоположения лиц на изображениях. OpenCV предоставляет предварительно обученные модели, такие как каскады Haar, для выполнения распознавания лиц. Вот как определить лица на изображении с помощью OpenCV:
- Загрузите изображение, содержащее лица, из Unsplash. Например, вы можете использовать это изображение или выбрать другое. Сохраните изображение как input_image.jpg в той же папке, что и ваш скрипт на Python.
- Загрузите предварительно обученную каскадную модель Haar для распознавания лиц. Вы можете скачать файл haarcascade_frontalface_default.xml из репозитория OpenCV на GitHub. Сохраните его в той же папке, что и ваш скрипт на Python.
- Создайте скрипт на Python с именем face_detection.py со следующим кодом:
import cv2 # Load the pre-trained Haar cascade model for face detection face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’) # Read an image from a file image = cv2.imread(‘input_image.jpg’) # Convert the image to grayscale gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Detect faces in the image faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5) # Draw rectangles around detected faces for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2) # Display the image with face detections cv2.imshow(‘Faces’, image) cv2.waitKey(0) cv2.destroyAllWindows()
Запустите скрипт face_detection.py :
python face_detection.py
3.3. Отслеживание объектов
Отслеживание объекта – это процесс определения местоположения движущегося объекта и следования за ним с течением времени в последовательности видеокадров. Алгоритм Meanshift является одним из многих алгоритмов отслеживания объектов, доступных в OpenCV. Вот краткий пример того, как реализовать отслеживание объектов с использованием алгоритма Meanshift:
import cv2 import numpy as np # Open a video file or webcam for processing cap = cv2.VideoCapture(‘video.mp4’) # Read the first frame of the video _, frame = cap.read() # Define the initial location of the object to track x, y, w, h = 100, 100, 50, 50 track_window = (x, y, w, h) # Convert the region of interest to HSV color space roi = frame[y:y + h, x:x + w] hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # Create a mask and compute the histogram of the ROI mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.))) roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180]) # Normalize the histogram cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX) # Define the termination criteria for the Meanshift algorithm term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1) while True: _, frame = cap.read() if frame is None: break # Convert the frame to HSV color space hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # Compute the back projection of the histogram dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1) # Apply the Meanshift algorithm to track the object _, track_window = cv2.meanShift(dst, track_window, term_crit) # Draw the tracked object on the frame x, y, w, h = track_window tracked_object = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # Display the frame cv2.imshow(‘Tracked Object’, tracked_object) if cv2.waitKey(1) 0xFF == ord(‘q’): break # Update the previous frame and points old_gray = frame_gray.copy() old_points = good_new.reshape(-1, 1, 2) cap.release() cv2.destroyAllWindows()
Заключение
В заключение, я хотел бы выразить свою искреннюю благодарность всем моим читателям за то, что они нашли время для знакомства с увлекательным миром компьютерного зрения. Я надеюсь, что концепции, методы и примеры кода, которыми я поделился в этой статье, дали ценную информацию и вдохновили вас на создание инновационных приложений с использованием Python и OpenCV. Ваша постоянная поддержка и вовлечённость – это то, что побуждает меня создавать качественный контент и ресурсы, которые помогут вам на вашем пути к становлению опытным разработчиком.
Источник: uproger.com