使用 Python 的 OpenCV 绘制矩形并提取对象

pythonserver side programmingprogramming

OpenCV 是 Python 中的开源计算机视觉库。它提供了许多函数来执行各种图像和视频处理操作。该库使用 Numpy 模块将所有视频帧和图像表示为 ndarray 类型。它需要 numpy 库,我们需要确保 numpy 模块也安装在我们的 Python 解释器中。

在本文中,我们将看到使用 Python OpenCV 绘制矩形和提取对象的不同方法。

绘制矩形

要在图像上绘制矩形,Python OpenCV 模块提供了一种名为 cv2.rectangle() 的方法。此方法将在图像上绘制矩形。以下是语法 –

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

参数

  • img:绘制矩形的源图像。

  • pt1:包含矩形顶点之一(矩形左上角)的 x 和 y 坐标的元组

  • pt2:包含矩形对角顶点(矩形右下角)的 x 和 y 坐标的元组。

  • color:指定矩形的颜色。

  • thickness:可选参数,指定矩形的线条粗细,默认为1。

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

因此,pt1 pt2 的坐标分别为 (x1,y1) 和 (x2,y2)。

使用预定义尺寸

在此方法中,我们将使用预定义坐标在图像上绘制矩形。这意味着我们将手动定义 pt1、pt2 值。

示例

在此示例中,我们将使用图像坐标绘制并从矩形中提取对象。

import cv2
import numpy as np

# 加载图像
img = cv2.imread("Images/Tajmahal.jpg")

# 使用两个点定义矩形的尺寸和位置
top_left = (80, 80)
bottom_right = (500, 300)

# 定义矩形的颜色和厚度
thickness = 2
color = (0, 255, 0) # 绿色
shape = cv2.rectangle(img, top_left, bottom_right, color, thick)

# 从矩形区域中提取对象
rect_area = img[top_left[0]:bottom_right[1], top_left[1]:bottom_right[0]]

# 显示绘制了矩形的图像
cv2.imshow("Image with Rectangle", img)

# 显示提取的矩形区域
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:鼠标事件的回调函数。

  • Userdata:传递给回调的可选参数。

可以使用命令行界面执行此方法。因此,我们将在这里使用 argparse 模块,因为它提供了一个方便的接口来处理命令行参数。

首先,我们将鼠标回调函数设置为 namedWindow() 方法来读取用户绘制的矩形坐标。通过使用鼠标单击事件,我们将识别 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):
    # 获取全局变量的引用
    global point, crop
    
    # 记录单击鼠标左键时的起始(x,y)坐标
    if event == cv2.EVENT_LBUTTONDOWN:
    	point = [(x, y)]
    
    # 检查鼠标左键是否被释放
    elif event == cv2.EVENT_LBUTTONUP:
        # 记录结束 (x, y) 坐标
        point.append((x, y))
        
        # 绘制矩形
        cv2.rectangle(image, point[0], point[1], (0, 255, 0), 2)
        cv2.imshow("image", image)
  
    # 构造参数解析器并解析参数
    ap = argparse.ArgumentParser()
    ap.add_argument("-i", "--image", required = True, help ="Images/Dog.jpg")
    args = vars(ap.parse_args())
    
    # 加载图像
    image = cv2.imread(args["image"])
    clone = image.copy()
    cv2.namedWindow("image")
    # 设置鼠标回调函数
    cv2.setMouseCallback("image", shape_selection)

# 继续循环直到按下"q"键
while True:
    # 显示图像并等待按键
    cv2.imshow("image", image)
    key = cv2.waitKey(1) & 0xFF
    
    # 按"r"重置窗口
    if key == ord("r"):
        image = clone.copy()
    
    # 如果按下"c"键,则退出循环
    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)

	# 关闭所有打开的窗口
cv2.destroyAllWindows()

打开命令提示符并使用以下命令执行上述程序 -

python test.py --image image5.jpg

这将生成一个显示输入图像的窗口,您可以在其中选择所需的对象,如下所示 -

注意 - 选择所需的图像区域后,按键盘上的 C 键进行裁剪。

我们已经成功绘制了矩形并从图像中提取了选定的对象。


相关文章