OpenCV 边界框

Ammar Ali 2024年2月15日
  1. 使用 OpenCV 的 boundingRect() 函数查找图像中存在的形状周围的边界框
  2. OpenCV 的 findContours()rectangle() 函数的参数
OpenCV 边界框

本教程将讨论使用 OpenCV 的 boundingRect() 函数查找图像中存在的形状周围的边界框。

使用 OpenCV 的 boundingRect() 函数查找图像中存在的形状周围的边界框

我们可以使用 OpenCV 的 boundingRect() 函数在图像中的形状周围找到并添加边界矩形或框。

boundingRect() 函数返回 x 和 y 坐标以及矩形的宽度和高度,我们可以使用这些值使用 rectangle() 函数围绕图像中存在的形状绘制一个矩形。

我们必须在 boundingRect() 函数内传递轮廓。我们可以使用 OpenCV 的 findContours() 函数找到给定图像的轮廓,但我们必须在 findContours() 函数中使用二进制或黑白图像。

要将给定的图像转换为二进制,我们必须使用 OpenCV 的 cvtColor()threshold() 函数。cvtColor() 函数用于将一种颜色空间转换为另一种颜色空间,我们将使用它来将 BGR 图像转换为灰度。

threshold() 函数将灰度图像转换为只有两个值 0255 的二进制图像。例如,让我们围绕给定图像中存在的每个形状绘制一个边界框。

请参阅下面的代码。

import cv2
import numpy as np

image = cv2.imread("shapes.png")
original = image.copy()

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

ROI_number = 0
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x, y, w, h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)

cv2.imshow("image", image)
cv2.imshow("Thresh", thresh)
cv2.waitKey()

输出:

边界框

上面的图像是只有两种颜色的二值图像,白色和黑色,下面的图像是带有边界框的原始图像。

OpenCV 的 findContours()rectangle() 函数的参数

findContours() 函数的第一个参数是二值图像,第二个参数是轮廓检索方法。

我们使用 cv2.RETR_EXTERNAL,因为我们只需要外部轮廓。第三个参数是用于查找轮廓的近似方法。

我们使用 rectangle() 函数在形状周围绘制边界框;我们使用 rectangle() 函数,它在每个形状周围绘制一个矩形。

rectangle() 函数的第一个参数是我们要在其上绘制边界框的图像。

第二个参数是起始位置,它将设置矩形的起始点。第三个参数是矩形的结束位置。

第四个参数以 BGR 三元组格式定义矩形的颜色,第五个参数是矩形的线条粗细。我们还可以将每个形状分别提取和存储为单独的图像文件。

我们可以使用矩形坐标来定义感兴趣的区域,我们可以使用 NumPy 切片提取并使用 OpenCV 的 imwrite() 函数将其保存。

每个形状的图像将存储在与原始图像相同的目录中。

例如,让我们存储上图中存在的每个形状。请参阅下面的代码。

import cv2
import numpy as np

image = cv2.imread("shapes.png")
original = image.copy()

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

ROI_number = 0
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x, y, w, h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
    ROI = original[y : y + h, x : x + w]
    cv2.imwrite("Image_{}.png".format(ROI_number), ROI)
    ROI_number += 1

cv2.imshow("image", image)
cv2.imshow("Thresh", thresh)
cv2.waitKey()

输出:

保存图像

可以看到,每张图片都被提取出来,分别保存在当前保存代码文件的目录下。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - OpenCV Image