Освоение OpenCV с помощью Python: Полное руководство по обработке изображений и компьютерному зрению

Освоение OpenCV с помощью Python: Полное руководство по обработке изображений и компьютерному зрению

OpenCV (Библиотека компьютерного зрения с открытым исходным кодом) - это мощная и широко используемая библиотека для обработки изображений и задач компьютерного зрения. Используя Python, популярный и простой в освоении язык программирования, разработчики могут создавать эффективные приложения для таких задач, как обработка изображений, обнаружение объектов и распознавание лиц. В этой статье мы рассмотрим библиотеку Python OpenCV, продемонстрируем, как использовать её для решения распространённых проблем, и приведём практические примеры кода. Давайте начинать!

OpenCV - это библиотека с открытым исходным кодом, которая предоставляет разработчикам инструменты и алгоритмы для задач компьютерного зрения и машинного обучения. Она поддерживает несколько языков программирования, включая C++, Java и Python. Привязки Python для OpenCV, известные как opencv-python, позволяют разработчикам Python легко использовать возможности OpenCV в своих приложениях.

t.me/ai_machinelearning_big_data - огромное количество уроков, бесплатных нейросетей , Python гайдов и другого крутого материала в моем телеграм канале.

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()
Освоение OpenCV с помощью Python: Полное руководство по обработке изображений и компьютерному зрению

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 100x100 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()
Освоение OpenCV с помощью Python: Полное руководство по обработке изображений и компьютерному зрению
Освоение OpenCV с помощью Python: Полное руководство по обработке изображений и компьютерному зрению

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()
Освоение OpenCV с помощью Python: Полное руководство по обработке изображений и компьютерному зрению

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 cap.release() cv2.destroyAllWindows()

3.4. Сопоставление функций

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

import cv2 import numpy as np # Load two images image1 = cv2.imread('image1.jpg') image2 = cv2.imread('image2.jpg') # Initialize the ORB detector and compute the keypoints and descriptors orb = cv2.ORB_create() kp1, des1 = orb.detectAndCompute(image1, None) kp2, des2 = orb.detectAndCompute(image2, None) # Create a Brute-Force matcher and match the descriptors bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1, des2) # Sort the matches based on their distance (the lower the distance, the better the match) matches = sorted(matches, key=lambda x: x.distance) # Draw the top 50 matches result = cv2.drawMatches(image1, kp1, image2, kp2, matches[:50], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) # Display the matched features cv2.imshow('Feature Matching', result) cv2.waitKey(0) cv2.destroyAllWindows()

3.5. Оптический поток

Оптический поток - это движение объектов между последовательными кадрами в видеопоследовательности. Его можно использовать для анализа движения объектов в видеороликах или для стабилизации видео. Алгоритм Лукаса-Канаде является одним из многих алгоритмов оптического потока, доступных в OpenCV. Вот пример того, как реализовать оптический поток с использованием алгоритма Лукаса-Канаде:

import cv2 import numpy as np # Open a video file or webcam for processing cap = cv2.VideoCapture('video.mp4') # Read the first frame and convert it to grayscale _, old_frame = cap.read() old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY) # Initialize Shi-Tomasi corner detector parameters and detect the corners in the first frame feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7) old_points = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params) # Define the Lucas-Kanade method parameters lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # Create a random color mask for drawing optical flow color = np.random.randint(0, 255, (100, 3)) while True: _, frame = cap.read() if frame is None: break # Convert the frame to grayscale frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Compute the optical flow using the Lucas-Kanade method new_points, status, _ = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, old_points, None, **lk_params) # Select the good points (those that have been successfully tracked) good_new = new_points[status == 1] good_old = old_points[status == 1] # Draw the optical flow on the frame for i, (new, old) in enumerate(zip(good_new, good_old)): a, b = map(int, new.ravel()) c, d = map(int, old.ravel()) frame = cv2.line(frame, (a, b), (c, d), color[i].tolist(), 2) frame = cv2.circle(frame, (a, b), 5, color[i].tolist(), -1) # Display the frame with optical flow # Resize the frame resized_frame = cv2.resize(frame, (680, 460)) # Display the resized frame cv2.imshow('Optical Flow', resized_frame) 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. Ваша постоянная поддержка и вовлечённость - это то, что побуждает меня создавать качественный контент и ресурсы, которые помогут вам на вашем пути к становлению опытным разработчиком.

Статья была взята из этого источника:

6
1
Начать дискуссию