如何使用OpenCV Python檢測影像中的矩形和正方形?


要檢測影像中的矩形和正方形,我們首先檢測影像中的所有輪廓。然後遍歷所有輪廓。為每個輪廓找到近似的輪廓。如果近似輪廓中的頂點數量為4,則我們計算縱橫比以區分矩形和正方形。如果縱橫比在0.9到1.1之間,則認為它是正方形,否則是矩形。請參見下面的虛擬碼。

for cnt in contours:
approx = cv2.approxPolyDP(cnt)
if len(approx) == 4:
   x, y, w, h = cv2.boundingRect(cnt)
   ratio= float(w)/h
   if ratio>=0.9 and ratio<=1.1:
      cv2.putText('Square')
   else:
      cv2.putText('Rectangle')

步驟

您可以使用以下步驟來檢測輸入影像中的矩形和正方形:

匯入所需的庫。在以下所有Python示例中,所需的Python庫是OpenCV。確保您已安裝它。

import cv2

使用cv2.imread()讀取輸入影像並將其轉換為灰度影像。

img = cv2.imread('shapes.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

對灰度影像應用閾值處理以建立二值影像。調整第二個引數以獲得更好的輪廓檢測。

ret,thresh = cv2.threshold(gray,50,255,0)

使用cv2.findContours()函式查詢影像中的輪廓。

contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

從輪廓列表中選擇一個輪廓(例如第一個輪廓)cnt。或者遍歷所有輪廓。

使用cv2.approxPolyDP()函式計算每個輪廓cnt的近似輪廓點。

approx = cv2.approxPolyDP(cnt,epsilon,True)

如果近似輪廓approx中的頂點數量為4,則在影像上繪製輪廓。

計算輪廓cnt的縱橫比。設定一個縱橫比範圍來檢測正方形。我們將其設定為[0.9, 1.1]。如果比率在0.9到1.1之間,則檢測到的輪廓是正方形,否則是矩形。

顯示帶有檢測到的矩形、正方形和已繪製輪廓的影像。

cv2.imshow("Shapes", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

讓我們看一些例子以便更好地理解。

示例

在下面的Python程式碼中,我們檢測輸入影像中的矩形和正方形。

import cv2 import numpy as np img = cv2.imread('shapes.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(gray,50,255,0) contours,hierarchy = cv2.findContours(thresh, 1, 2) print("Number of contours detected:", len(contours)) for cnt in contours: x1,y1 = cnt[0][0] approx = cv2.approxPolyDP(cnt, 0.01*cv2.arcLength(cnt, True), True) if len(approx) == 4: x, y, w, h = cv2.boundingRect(cnt) ratio = float(w)/h if ratio >= 0.9 and ratio <= 1.1: img = cv2.drawContours(img, [cnt], -1, (0,255,255), 3) cv2.putText(img, 'Square', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 0), 2) else: cv2.putText(img, 'Rectangle', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) img = cv2.drawContours(img, [cnt], -1, (0,255,0), 3) cv2.imshow("Shapes", img) cv2.waitKey(0) cv2.destroyAllWindows()

將以下影像視為上述程式程式碼中的輸入檔案

輸出

執行上述程式碼後,將產生以下輸出

Number of contours detected: 4

我們將得到以下視窗,顯示輸出:

在上面的輸出影像中,檢測到一個矩形和一個正方形。

更新於:2023年8月26日

39K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告