Поиск по сайту:

Нарисуйте прямоугольную форму и извлеките объекты с помощью Python OpenCV.


OpenCV — это библиотека компьютерного зрения с открытым исходным кодом на Python. Он предоставляет множество функций для выполнения различных операций по обработке изображений и видео. Библиотека использует модуль Numpy для представления всех видеокадров и изображений в виде типа ndarray. Ему нужна библиотека numpy, нам нужно убедиться, что модуль numpy также установлен в нашем интерпретаторе Python.

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

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

Чтобы нарисовать прямоугольную форму на изображении, модуль Python OpenCV предоставляет метод cv2.rectangle(). Этот метод будет рисовать прямоугольные фигуры на изображении. Ниже приведен синтаксис –

cv.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]	)

Параметры

  • img: исходное изображение, на котором нужно нарисовать прямоугольник.

  • pt1: кортеж с координатами x и y одной из вершин прямоугольника (верхний левый угол прямоугольника).

  • pt2: кортеж с координатами x и y противоположной вершины прямоугольника относительно предыдущей (правый нижний угол прямоугольника).

  • цвет: определяет цвет прямоугольника.

  • толщина: это необязательный параметр. Он определяет толщину линий прямоугольника. И толщина по умолчанию равна 1.

x1,y1----------|
|		   | 
| 		   |
| ------------x2,y2

Следовательно, координаты pt1 pt2 будут (x1,y1) и (x2,y2) соответственно.

Использование заранее заданных размеров

В этом подходе мы будем рисовать прямоугольную форму на изображении, используя заранее определенные координаты. Это означает, что мы определим значения pt1, pt2 вручную.

Пример

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

import cv2
import numpy as np

# Load the image
img = cv2.imread("Images/Tajmahal.jpg")

# Define the dimensions and position of the rectangle using two points
top_left = (80, 80)
bottom_right = (500, 300)

# defining the colour and thickness of the rectangle
thickness = 2 
color = (0, 255, 0) # Green color
shape = cv2.rectangle(img, top_left, bottom_right, color, thickness)

# Extracting objects from the rectangular area
rect_area = img[top_left[0]:bottom_right[1], top_left[1]:bottom_right[0]]

# Display the image with the drawn rectangle
cv2.imshow("Image with Rectangle", img)

# Display the extracted rectangular area
cv2.imshow("Rectangular Area", rect_area)

cv2.waitKey(0)
cv2.destroyAllWindows()

Выход

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

Использование флагов событий мыши

Чтобы нарисовать прямоугольные формы на изображении, здесь мы будем использовать событие мыши ниже —

  • cv2.EVENT_RBUTTONDOWN: указывает, что нажата правая кнопка.

  • cv2.EVENT_LBUTTONUP: указывает, что левая кнопка отпущена.

Кроме того, мы будем использовать функцию setMouseCallback(), чтобы установить обработчик событий мыши для указанного окна.

Функция setMouseCallback()

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

Синтаксис

cv2.setMouseCallback(winname, onMouse, userdata)

Параметры

  • Winname: Имя конкретного окна.

  • OnMouse: функция обратного вызова для событий мыши.

  • Пользовательские данные: необязательный параметр, передаваемый обратному вызову.

Этот подход можно реализовать с использованием интерфейса командной строки. Итак, здесь мы будем использовать модуль argparse, поскольку он предоставляет удобный интерфейс для обработки аргументов командной строки.

Первоначально мы установим функцию обратного вызова мыши для метода NameWindow(), чтобы считывать прямоугольные координаты, в которых рисует пользователь. Используя события щелчка мыши, мы определим координаты x и y, а затем нарисуем прямоугольную форму с помощью функции cv2.rectangle().

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

Python program_file_name.py --image source_image_name.jpg

Пример

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

import cv2
import argparse

point = []
crop = False
  
def shape_selection(event, x, y, flags, param):
   # grab references to the global variables
   global point, crop
   
   # Record the starting(x, y) coordinates when the left mouse button was clicked
   if event == cv2.EVENT_LBUTTONDOWN:
      point = [(x, y)]
   
   # check to see if the left mouse button was released
   elif event == cv2.EVENT_LBUTTONUP:
      # record the ending (x, y) coordinates 
      point.append((x, y))
   
      # draw a rectangle
      cv2.rectangle(image, point[0], point[1], (0, 255, 0), 2)
      cv2.imshow("image", image)
  
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help ="Images/Dog.jpg")
args = vars(ap.parse_args())
  
# load the image
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
# setting the mouse callback function
cv2.setMouseCallback("image", shape_selection)
  
# keep looping until the 'q' key is pressed
while True:
    # display the image and wait for a keypress
    cv2.imshow("image", image)
    key = cv2.waitKey(1) & 0xFF
  
    # press 'r' to reset window 
    if key == ord("r"):
        image = clone.copy()
  
    # if the 'c' key is pressed, break from the loop
    elif key == ord("c"):
        break

if len(point) == 2:
    crop_img = clone[point[0][1]:point[1][1], point[0][0]:point[1][0]]
    cv2.imshow("crop_img", crop_img)
    cv2.waitKey(0)

    # close all open windows
cv2.destroyAllWindows()

Откройте командную строку и запустите вышеуказанную программу, используя следующую команду:

python test.py --image image5.jpg

При этом появится окно с входным изображением, в котором вы сможете выбрать нужный объект, как показано ниже:

Примечание. После выбора нужной области изображения нажмите клавишу C на клавиатуре, чтобы обрезать.

Мы успешно нарисовали прямоугольную форму и извлекли выбранный объект из изображения.

Статьи по данной тематике: