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