如何使用OpenCV Python在图像中检测矩形和正方形?

如何使用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)

如果近似轮廓中的顶点点数为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()

将下面的图像视为上述程序代码中的输入文件。

如何使用OpenCV Python在图像中检测矩形和正方形?

输出

当您执行上述代码时,它会产生以下输出。

Number of contours detected: 4

然后我们会得到如下窗口,显示输出结果 −

如何使用OpenCV Python在图像中检测矩形和正方形?

在上面的输出图像中,检测到一个矩形和一个正方形。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程