如何在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()
这个程序将使用以下图像作为输入文件。
输出
当执行后,控制台将输出以下内容 −
轮廓数: 1
凸度: False
然后我们得到以下窗口,显示输出 −