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()
輸出:
可以看到,每張圖片都被提取出來,分別儲存在當前儲存程式碼檔案的目錄下。