OpenCV-python dessinée détection de contour cadre rectangulaire (findContours \ boundingRect \ rectangle)

Article répertoire
1 acquiert le contour
1,1 Valeur de retour: Image, Contours, Hiérarchie
2 représente le profil
3 acquiert la région de contour
4 en dehors de la matrice de minimum objet l' obtention d'
1 acquiert le profil
OpenCV2 profil acquis est utilisé principalement cv2.findContours ()
 

import cv2

img = cv2.imread('wujiaoxing.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

_,contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

draw_img0 = cv2.drawContours(img.copy(),contours,0,(0,255,255),3)
draw_img1 = cv2.drawContours(img.copy(),contours,1,(255,0,255),3)
draw_img2 = cv2.drawContours(img.copy(),contours,2,(255,255,0),3)
draw_img3 = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 3)


print ("contours:类型:",type(contours))
print ("第0 个contours:",type(contours[0]))
print ("contours 数量:",len(contours))

print ("contours[0]点的个数:",len(contours[0]))
print ("contours[1]点的个数:",len(contours[1]))

cv2.imshow("img", img)
cv2.imshow("draw_img0", draw_img0)
cv2.imshow("draw_img1", draw_img1)
cv2.imshow("draw_img2", draw_img2)
cv2.imshow("draw_img3", draw_img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

输出:
contours:类型: <class 'list'>
第0 个contours: <class 'numpy.ndarray'>
contours 数量: 3
contours[0]点的个数: 6
contours[1]点的个数: 74

Dans lequel, cv2.findContours () d'un deuxième paramètres principaux

cv2.RETR_LIST: détection de contours est pas établi de relation hiérarchique
cv2.RETR_TREE: L établir un profil d'une structure d'arbre hiérarchique.
cv2.RETR_CCOMP: établir deux niveaux de contour, la limite extérieure de la couche supérieure, laquelle couche est bien dans les informations de limite.
cv2.RETR_EXTERNAL: Indique ne détecte que le contour extérieur
procédé cv2.findContours () du troisième paramètre du contour approximatif des approches

cv2.CHAIN_APPROX_NONE stocker tous les points de contour, deux points adjacents à la position de pixel de la différence ne dépasse pas 1, à savoir, max (ABS (X1-X2), ABS (Y2-Y1)) ==. 1
de compression cv2.CHAIN_APPROX_SIMPLE dans la direction horizontale, la direction verticale, une direction diagonale de l'élément, ne laissant que les coordonnées de la direction de point d'extrémité, par exemple, un profil rectangulaire seulement 4 points pour enregistrer les informations de profil
cv2.CHAIN_APPROX_TC89_L1, CV_CHAIN_APPROX_TC89_KCOS utilisant teh-Chinl algorithmes d'approximation de la chaîne
valeur 1,1-retour: image, contours , la hiérarchie
valeur de retour de contour
fonction cv2.findContours () retourne une première liste, élément de la liste est un profil de chaque image, représentée par le ndarray numpy.
hiérarchie valeur de retour
de la fonction retourne également un résultat de hiararchy en option, qui est un ndarray, dans lequel le nombre d'éléments et le même nombre de contours, chaque contour de contour [i] correspondant aux quatre éléments hiérarchie hiérarchie [i] [0] ~ hiérarchie [i] [3] , respectivement, un profil arrière, un profil frontal, le profil de parent, le profil numéro d'index incorporé, si aucune entrée correspondante, la valeur est négative.
2 représente le profil
cv2.drawContours () fonction
cv2.drawContours (image, contours, contourIdx, couleur [, épaisseur [, type de ligne [, la hiérarchie [, maxLevel [, offset]]]]])

Le premier paramètre est indiqué sur le contour dessinée qui image;
deuxième paramètre est le profil lui - même, est une liste dans le python.
Le troisième paramètre spécifie que la liste de profil de bande d' une courbe de niveau, si elle est -1, qui tirent tous contour. Ce dernier paramètre est simple. Dans lequel l'épaisseur indique que la largeur de la ligne de contour, si elle est -1 (cv2.FILLED), a été rempli le mode. paramètres Dessin après l' indépendance en détail.
Pour voir par vous - même ce qui a attiré les grandes lignes, vous pouvez utiliser la fonction cv2.boundingRect () pour obtenir le contour de la gamme, à savoir l'origine de coin supérieur gauche, ainsi que son haut et large. Puis méthode cv2.rectangle () pour tracer un profil rectangulaire

"""
x, y, w, h = cv2.boundingRect(img)   
    参数:
    img  是一个二值图
    x,y 是矩阵左上点的坐标,
    w,h 是矩阵的宽和高

cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
    img:       原图
    (x,y):   矩阵的左上点坐标
    (x+w,y+h):是矩阵的右下点坐标
    (0,255,0): 是画线对应的rgb颜色
    2:         线宽
"""
for i in range(0,len(contours)):  
    x, y, w, h = cv2.boundingRect(contours[i])   
    cv2.rectangle(image, (x,y), (x+w,y+h), (153,153,0), 5) 



3 get contour

new_image=image[y+2:y+h-2,x+2:x+w-2]    # 先用y确定高,再用x确定宽
input_dir=("E:/cut_image/")
if not os.path.isdir(input_dir):
    os.makedirs(input_dir)
cv2.imwrite( nrootdir+str(i)+".jpg",newimage) 
print (i)


4 matrice objet l' obtention ambiante minimale
utilisée cv2.minAreaRect (cnt), renvoie le rectangle circonscrit cnt ensemble de points le plus petit, est un ensemble de points ou matrice cnt vecteur du rectangle de délimitation minimum requis, le numéro du point de consigne variable.
Dans lequel: cnt = np.array ([[x1 , y1], [x2, y2], [x3, y3], [x4, y4]]) # doit être sous la forme d'un ensemble de matrice

rect = cv2.minAreaRect (cnt) # give minimum rectangle de délimitation (centre (x, y), (largeur, hauteur), angle de rotation)
Box = np.int0 (cv2.boxPoints (RECT)) sera une boîte rectangulaire par # boîte

 

Publié 86 articles originaux · louange 267 won · Vues 1,77 millions +

Je suppose que tu aimes

Origine blog.csdn.net/javastart/article/details/104348348
conseillé
Classement