如何使用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
我们将得到以下窗口,显示输出:

在上面的输出图像中,检测到一个矩形和一个正方形。
广告
数据结构
网络
关系数据库管理系统(RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP