如何使用OpenCV Python计算图像中物体的长宽比?

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

我们将使用以下图像作为此程序的 输入文件

如何使用OpenCV Python计算图像中物体的长宽比?

输出结果

当我们执行上述代码时,它将产生以下输出结果

检测到的对象数量:1 
对象1的长宽比=1.71

然后,我们将得到以下输出窗口−

如何使用OpenCV Python计算图像中物体的长宽比?

等高线用绿色绘制,边界矩形用蓝色绘制。检测到的对象的宽高比以白色显示。

样例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()

在本程序中,我们将使用以下图像作为 输入文件 ──

如何使用OpenCV Python计算图像中物体的长宽比?

输出

执行以上代码,将输出以下 结果 ──

检测到的对象数量:7
对象1的宽高比=1.662
对象2的宽高比=0.657
对象3的宽高比=0.705
对象4的宽高比=0.912
对象5的宽高比=0.94
对象6的宽高比=1.054
对象7的宽高比=1.845

然后我们在输出窗口中得到了以下结果 输出窗口

如何使用OpenCV Python计算图像中物体的长宽比?

轮廓用绿色画出,边界矩形用蓝色画出。检测到的对象的宽高比以红色显示。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV