如何使用OpenCV Python计算图像对象的范围?
对象的范围被计算为轮廓面积与其边界矩形面积的比率。因此,为了计算范围,我们首先必须找到轮廓面积和边界矩形面积。可以使用cv2.contourArea()函数找到对象的轮廓面积。
语法
如下所示可以计算范围 –
area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area
这里,“ cnt ”是图像中对象轮廓点的numpy数组。
步骤
您可以使用以下步骤计算图像中对象的范围 –
导入所需的库。在接下来的所有Python示例中,所需的Python库为 OpenCV 。请确保您已经安装了它。
import cv2
使用 cv2.imread() 读取输入图像并将其转换为灰度。
img = cv2.imread('star1.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]
area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area
可以选择在输入图像上绘制轮廓和边界矩形。还在图像上将范围作为文本显示。
cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
打印计算出的范围,并显示带有绘制的轮廓、边界矩形的图像。
print("对象的范围:
", ext)
cv2.imshow("Extent", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
下面看一些示例,以获得更好的理解。
示例1:
在此Python程序中,我们计算图像中对象的范围。我们在图像上为对象绘制轮廓和边界矩形。我们还将范围值作为对象的文本。
# 导入必要的库
import cv2
# 加载输入图像
img = cv2.imread('star1.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 extent(cnt):
area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area
return extent
# 选择第一个轮廓
cnt = contours[0]
# 查找范围
ext = extent(cnt)
# 将范围四舍五入到三个小数点
ext = round(ext, 3)
# 绘制轮廓
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'Extent={ext}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255), 2)
print("对象的范围:",ext)
cv2.imshow("范围", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用以下图像作为程序中的 输入文件 −
输出
当我们执行上面的代码时,它将生成以下输出 −
检测到的对象数:1
对象的范围:0.487
并且我们得到以下的输出窗口 −
轮廓用绿色绘制,边界矩形用蓝色绘制。检测到的对象的范围用红色写出。
示例2
在这个Python程序中,我们计算图像中多个对象的范围。我们在图像上绘制轮廓和边界矩形。我们还将所有对象的范围作为文本放置在上面。
# 导入所需库
import cv2
# 加载输入图像
img = cv2.imread('shapes2.png')
# 将图像转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用阈值处理,将灰度转换为二进制图像
ret,thresh = cv2.threshold(gray,40,255,0)
# 查找轮廓
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的物体数量:", len(contours))
# 定义计算范围的函数
def extent(cnt):
area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area
return extent
# 循环所有轮廓
for i, cnt in enumerate(contours):
ext = extent(cnt)
ext = round(ext, 2)
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.drawContours(img,[cnt],0,(0,255,0),2)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
cv2.putText(img, f'Extent={ext}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
print(f"物体{i+1}的范围:, ext)
cv2.imshow("范围", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用以下图像作为此程序的输入文件 –
输出
当我们执行上面的代码时,它将产生以下输出 –
检测到的对象数量:7
对象1的范围:0.98
对象2的范围:0.49
对象3的范围:0.48
对象4的范围:0.67
对象5的范围:0.73
对象6的范围:0.49
对象7的范围:0.77
我们得到以下输出window −
轮廓用绿色绘制,边界矩形用黄色绘制。检测到的对象的范围用红色书写。