使用OpenCV Python在图像中绘制多个矩形


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

在本文中,我们将看到使用OpenCV Python在图像中绘制多个矩形的方法。为了在图像上绘制矩形形状,Python OpenCV模块提供了一个名为cv2.rectangle()的方法。

cv2.rectangle()函数

该方法将在图像上绘制矩形形状。以下是此函数的语法:

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

参数

以下是此函数的参数:

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

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

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

  • color:指定矩形的颜色。

  • thickness:这是一个可选参数。它指定矩形的线粗细。默认粗细为1。

使用预定义尺寸

在这种方法中,我们将使用预定义的坐标在图像中的多个对象周围绘制矩形形状。这意味着我们将手动定义pt1和pt2的值。

示例

在这个例子中,我们将使用列表的列表来定义图像中每个对象的坐标,然后我们将围绕这些对象绘制矩形形状。

import cv2

# Load the image
img = cv2.imread("Images/Tajmahal.jpg")
cv2.imshow('Input Image', img)

# Define the dimensions and position of the rectangle using two points
img_obj_data = [[(60, 150), (90, 250)], [(120, 170), (155, 250)],
   [(200, 120), (400, 230)], [(450, 160), (480, 250)],
   [(500, 150), (555, 255)], [(330, 80), (550, 130)]]

# defining the color and thickness of the rectangle
thickness = 2 
color = (0, 255, 0) # Green color

for dimensions in img_obj_data:
    cv2.rectangle(img, dimensions[0], dimensions[1], color, thickness)

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

cv2.waitKey(0)
cv2.destroyAllWindows()

输入图像

输出图像

我们已经通过迭代列表对象中指定的预定义坐标,成功地在图像中绘制了多个矩形。

示例

在这个例子中,我们将使用预定义坐标的字典来绘制矩形。

import cv2
from random import randint

img = cv2.imread('Images/Zoo.jpg')
cv2.imshow('Input image', img)
img_h, img_w = img.shape[:2]

img_obj_data = {'giraffe': {'center_x': 0.360333,'center_y': 0.532274,'height': 0.596343,'width': 0.144651},
   'zebra' : {'center_x': 0.545974,'center_y': 0.693267,'height': 0.301859,'width': 0.257102}}

for v in img_obj_data.values():
    x, y, h, w = v

    x_min = int((v[x]-v[w]/2)*img_w)
    y_min = int((v[y]-v[h]/2)*img_h)
    x_max = int((v[x]+v[w]/2)*img_w)
    y_max = int((v[y]+v[h]/2)*img_h)
    cv2.rectangle(img, (x_min, y_min), (x_max, y_max), color=[0, 250, 0], thickness=2)

cv2.imshow('Output image', img)
cv2.waitKey(0)

输入图像

输出图像


使用cv2.findContours()方法

python OpenCV模块中的cv2.findContours()方法用于检测二值图像中的对象。以下是图像的语法:

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

参数

  • image:一个8位单通道图像(二值图像)。

  • contours:检测到的轮廓。

方法

我们将遵循以下步骤在图像中的对象周围绘制多个矩形。

  • 加载图像。

  • 将图像转换为灰度。

  • 定义阈值。

  • 查找轮廓。

  • 遍历轮廓并使用轮廓面积进行过滤。

  • 最后,围绕每个轮廓绘制矩形。

示例

让我们举个例子,这里我们将使用cv2.findContours()和cv2.rectangle()方法在图像对象周围绘制多个矩形。

import cv2
import numpy as np

# read image
image = cv2.imread('Images/WhiteDots2.jpg')

# convert to grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

# set the thresholds
thresh = cv2.threshold(gray,128,255,cv2.THRESH_BINARY)[1]

# find contours
result = image.copy()
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
for cntr in contours:
    x,y,w,h = cv2.boundingRect(cntr)
    cv2.rectangle(result, (x, y), (x+w, y+h), (0, 0, 255), 2)   
    
# show thresh and result    
cv2.imshow("bounding_box", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

输入图像

输出图像

我们已经成功地在图像中的所有对象周围绘制了多个矩形。

更新于:2023年5月30日

804 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告