Dans lequel l'image de contour (périmètre, la surface et un contour extérieur est approximativement rectangulaire cercle circonscrit et) de OpenCV

Sur un blog parlant de la façon de trouver et d'en tirer les grandes lignes d'une image, venez maintenant parler des caractéristiques communes de ces profils et comment utiliser OpenCV dans la fonction correspondante.

1. cv2.contourArea(cnt, oriented = False)  # 计算轮廓的面积

参数说明:cnt为输入的单个轮廓值;oriented:默认值false,面向区域标识符,
如果为true,该函数返回一个带符号的面积,其正负取决于轮廓的方向(顺时针还是逆时针)。
根据这个特性可以根据面积的符号来确定轮廓的位置。如果是默认值false,则面积以绝对值的形式返回.

2. cv2.arcLength(cnt, closed)   #  计算轮廓的周长

参数说明:cnt为输入的单个轮廓值,closed表示用来指定对象的形状是
闭合的(True),还是打开的一条曲线(False)3. cv2.aprroxPolyDP(cnt, epsilon, True)  # 用于获得轮廓的近似值,使用cv2.drawCountors进行画图操作

 参数说明:cnt为输入的轮廓值, epsilon为阈值T,
 通常使用轮廓的周长作为阈值,True表示的是轮廓是闭合的

4. x, y, w, h = cv2.boudingrect(cnt) # 获得外接矩形

参数说明:x,y, w, h 分别表示外接矩形的x轴和y轴的坐标,
以及矩形的宽和高, cnt表示输入的轮廓值

5.cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)  # 根据坐标在图像上画出矩形

参数说明: img表示传入的图片, (x, y)表示左上角的位置, 
(x+w, y+h)表示加上右下角的位置,(0, 255, 0)表示颜色,2表示线条的粗细

6. (x, y), radius = cv2.minEnclosingCircle(cnt) # 获得外接圆的位置信息

参数说明: (x, y)表示外接圆的圆心,radius表示外接圆的半径,cnt表示输入的轮廓

7. cv2.Cricle(img, center, radius, (0, 255, 0), 2)  # 根据坐标在图上画出圆

参数说明:img表示需要画的图片,center表示圆的中心点,
radius表示圆的半径, (0, 255, 0)表示颜色, 2表示线条的粗细

Une approximation du contour:

Supposons qu'il y ait une courbe A, B, C est présent à un point de la courbe, la plus éloignée distance du segment de droite AB, dite d1, si d1 <T (propre seuil défini), comme une alternative au segment AB de la courbe AB, NO en connectant AC et BC, le point D sur le segment de ligne à courant alternatif est calculé à partir de la plus éloignée AB, notée d2, si d2 <T, la courbe ligne AC en variante, il faut continuer la connexion est divisée.
Insérer ici l'image Description

img = cv2.imread('contours2.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

draw_img = img.copy()
res = cv2.drawContours(draw_img, [cnt], -1, (0, 0, 255), 2)
cv_show(res,'res')

Insérer ici l'image Description

epsilon = 0.05*cv2.arcLength(cnt,True) 
approx = cv2.approxPolyDP(cnt,epsilon,True)

draw_img = img.copy()
res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)
cv_show(res,'res')

Insérer ici l'image Description

En second lieu, le rectangle de délimitation et le cercle circonscrit

img = cv2.imread('contours.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv_show(img,'img')

Insérer ici l'image Description
Insérer ici l'image Description

Publié 27 articles originaux · a gagné les éloges 20 · vues 1547

Je suppose que tu aimes

Origine blog.csdn.net/qq_39507748/article/details/104550500
conseillé
Classement