如何使用OpenCV Python计算图像中物体的长宽比?
物体的长宽比是指物体的边框的宽度和高度之比。因此,要计算长宽比,我们首先必须找到物体的边框。可以使用 cv2.boundingRect() 函数找到物体的边框。
该函数接受物体的轮廓点,并返回边框的左上角坐标(x,y)以及 宽度和高度 。我们使用 宽度 和 高度 来计算长宽比。
语法
x, y, w, h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h
在此” cnt “是图像中物体轮廓点的numpy数组。
步骤
可以按以下步骤计算图像中物体的长宽比 –
导入所需的库。在以下所有Python示例中,所需的Python库是 OpenCV 。请确保您已安装它。
import cv2
使用 cv2.imread() 读取输入图像并将其转换为灰度图像。
img = cv2.imread('fourpoint-star.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
在灰度图像上应用阈值,以创建二进制图像。调整第二个参数以更好地检测轮廓。
ret,thresh = cv2.threshold(gray,150,255,0)
使用 cv2.findContours() 函数在图像中查找轮廓。
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
选择轮廓 cnt 或遍历所有轮廓。使用物体的边框的宽度和高度计算长宽比。
cnt = contours[0]
x, y, w, h = cv2.boundingRect(cnt)
ar = float(w)/h
可选地,在输入图像上绘制轮廓和边框。还可以将长宽比作为文本放在图像上。
cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
打印长宽比并显示带有绘制的轮廓和边框的图像。
print("物体的长宽比:", ar)
cv2.imshow("Aspect Ratio", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
让我们看一些示例,以更清晰地理解。
示例1
在此Python程序中,我们计算图像中物体的长宽比。我们在图像上绘制物体的轮廓和边框。我们还将长宽比作为物体的文本呈现。
# 导入必要的库
import cv2
# 加载输入图像
img = cv2.imread('fourpoint-star.png')
# 将图像转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用阈值处理以将灰度图像转换为二进制图像
ret,thresh = cv2.threshold(gray,150,255,0)
# 找到轮廓
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的对象数量:" , len(contours))
# 定义计算长宽比的函数
def aspect_ratio(cnt):
x, y, w, h = cv2.boundingRect(cnt)
ratio = float(w)/h
return ratio
# 选择第一个轮廓
cnt = contours[0]
# 找到长宽比
ar = aspect_ratio(cnt)
# 保留两位小数的长宽比
ar = round(ar, 2)
# 绘制轮廓
cv2.drawContours(img,[cnt],0,(0,255,0),2)
# 绘制边界矩形
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 在图像上放置文本
cv2.putText(img, f'长宽比={ar}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255, 255), 2)
print(f"对象1的长宽比=", ar)
cv2.imshow("长宽比", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用以下图像作为此程序的 输入文件 −
输出结果
当我们执行上述代码时,它将产生以下输出结果
检测到的对象数量:1
对象1的长宽比=1.71
然后,我们将得到以下输出窗口−
等高线用绿色绘制,边界矩形用蓝色绘制。检测到的对象的宽高比以白色显示。
样例2
在这个Python程序中,我们计算图像中所有对象的宽高比。我们在图片上绘制所有的等高线和边界矩形。我们也将所有对象的宽高比作为文本输出。
import cv2
import numpy as np
img = cv2.imread('shapes2.png')
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(img1,40,255,0)
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的对象数目:", len(contours))
# 遍历所有等高线
for i, cnt in enumerate(contours):
ar = aspect_ratio(cnt)
ar = round(ar, 3)
x,y,w,h = cv2.boundingRect(cnt)
cv2.drawContours(img,[cnt],0,(0,255,0),2)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.putText(img, f'{ar}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
print(f"对象宽高比 {i+1} =", ar)
cv2.("宽高比", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在本程序中,我们将使用以下图像作为 输入文件 ──
输出
执行以上代码,将输出以下 结果 ──
检测到的对象数量:7
对象1的宽高比=1.662
对象2的宽高比=0.657
对象3的宽高比=0.705
对象4的宽高比=0.912
对象5的宽高比=0.94
对象6的宽高比=1.054
对象7的宽高比=1.845
然后我们在输出窗口中得到了以下结果 输出窗口
轮廓用绿色画出,边界矩形用蓝色画出。检测到的对象的宽高比以红色显示。