OpenCV 边界框
本教程将讨论使用 OpenCV 的 boundingRect()
函数查找图像中存在的形状周围的边界框。
使用 OpenCV 的 boundingRect()
函数查找图像中存在的形状周围的边界框
我们可以使用 OpenCV 的 boundingRect()
函数在图像中的形状周围找到并添加边界矩形或框。
boundingRect()
函数返回 x 和 y 坐标以及矩形的宽度和高度,我们可以使用这些值使用 rectangle()
函数围绕图像中存在的形状绘制一个矩形。
我们必须在 boundingRect()
函数内传递轮廓。我们可以使用 OpenCV 的 findContours()
函数找到给定图像的轮廓,但我们必须在 findContours()
函数中使用二进制或黑白图像。
要将给定的图像转换为二进制,我们必须使用 OpenCV 的 cvtColor()
和 threshold()
函数。cvtColor()
函数用于将一种颜色空间转换为另一种颜色空间,我们将使用它来将 BGR 图像转换为灰度。
threshold()
函数将灰度图像转换为只有两个值 0
和 255
的二进制图像。例如,让我们围绕给定图像中存在的每个形状绘制一个边界框。
请参阅下面的代码。
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()
输出:
可以看到,每张图片都被提取出来,分别保存在当前保存代码文件的目录下。