如何在OpenCV Python中检查图像轮廓是否凸?

如何在OpenCV Python中检查图像轮廓是否凸?

函数 cv2.isContourConvex() 用于检查曲线(轮廓)是否凸。图像中的一个对象的轮廓是一条连接所有沿边界连续的点的曲线,具有相同的颜色或强度。轮廓用于形状分析、目标检测和识别等方面。

语法

cv2.isContourConvex() 的语法如下−

cv2.isContourConvex(cnt)

cnt ”是图像中一个对象的轮廓点的numpy数组。如果轮廓cnt是凸的,则返回 True ,否则返回 False

步骤

你可以按照以下步骤检查图像中的轮廓是否凸实现−

导入所需的库。在以下所有Python示例中,所需的Python库是 OpenCV 。确保您已经安装了它。

import cv2

使用 cv2.imread() 读取输入图像并将其转换为灰度图像。

img = cv2.imread('pentagon.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)

使用 cv2.isContourConvex(cnt) 计算凸性。如果轮廓是凸的,则返回 True ,否则返回false。

cnt= contours[0]
k = cv2.isContourConvex(cnt)

在输入图像上绘制轮廓。

cv2.drawContours(img, [cnt], -1, (0,255,255), 3)

打印图像中一个对象的轮廓的凸性。

print("Convexity:", k)

让我们举几个示例,以更好地理解。

示例1

在下面的Python示例中,我们检查一个矩形的轮廓是否凸。

import cv2
import numpy as np

img = cv2.imread("star.png", cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

print("Number of contours:", len(contours))
cnt = contours[0]
hull = cv2.convexHull(cnt)
print("Hull points:", hull)
print("Number of hull points:", len(hull))
print("Is convexity obtained?", cv2.isContourConvex(hull))

# Draw the contour with green color
cv2.drawContours(img, [cnt], -1, (0,255,0), 3)
# Draw the convex hull with red color
cv2.drawContours(img, [hull], -1, (0,0,255), 3;)

输出

输出如下 −

Number of contours: 1
Hull points: [[ 46 234]
 [ 67 203]
 [214   4]
 [216   5]
 [223   7]
 [270  44]
 [276  49]
 [337 161]
 [341 167]
 [342 168]
 [342 197]
 [341 198]
 [324 214]
 [208 341]
 [207 342]
 [190 342]
 [167 321]
 [117 267]
 [ 94 246]
 [ 85 239]
 [ 75 236]
 [ 68 237]]
Number of hull points: 22
Is convexity obtained? True
import cv2
import numpy as np

img1 = cv2.imread('star.png')
img = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(img,0,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
print("轮廓数:", len(contours))
cnt= contours[0]
k = cv2.isContourConvex(cnt)
print("凸度:", k)
x, y = cnt[0][0]

cv2.drawContours(img1, [cnt], -1, (0,255,255), 3)
cv2.putText(img1, f'凸度:{k}', (x, y+30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)

cv2.imshow("图像", img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个程序将使用以下图像作为输入文件。

如何在OpenCV Python中检查图像轮廓是否凸?

输出

当执行后,控制台将输出以下内容 −

轮廓数: 1 
凸度: False

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

如何在OpenCV Python中检查图像轮廓是否凸?

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV