Python-OpenCV 笔记6 -- 轮廓(Contours)
生活随笔
收集整理的這篇文章主要介紹了
Python-OpenCV 笔记6 -- 轮廓(Contours)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Python-OpenCV 筆記6 – 輪廓(Contours)
參考文檔: https://docs.opencv.org/3.4/dd/d49/tutorial_py_contour_features.html
1、查找輪廓 findContours
函數(shù)原型
image, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])參數(shù):
- image:8位單通道二值圖,如果為灰度圖非0值為1
- mode:輪廓的檢索模式
- cv2.RETR_EXTERNAL:表示只檢測外輪廓
- cv2.RETR_LIST:檢測的輪廓不建立等級關系
- cv2.RETR_CCOMP:建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內孔的邊界信息。如果內孔內還有一個連通物體,這個物體的邊界也在頂層
- cv2.RETR_TREE:建立一個等級樹結構的輪廓
- method:輪廓的近似辦法
- cv2.CHAIN_APPROX_NONE:存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))== 1
- cv2.CHAIN_APPROX_SIMPLE:壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標,例如一個矩形輪廓只需4個點來保存輪廓信息
- cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
返回值:
- image:被處理的圖片,正常沒用
- contours:numpy的ndarray,每個元素都是圖像中的一個輪廓,每個元素包括多個點
- hierarchy:numpy的ndarray,元素個數(shù)和輪廓個數(shù)相同,輪廓 contours[i] 對應于hierarchy[i],每個 hierarchy 元素包括四個元素 hierarchy[i][0] ~ hierarchy[i][3],分別表示后一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,則該值為負數(shù)。
2、繪制輪廓 findContours
函數(shù)原型
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])參數(shù):
- image:輸入圖像
- contours:輪廓,一個輪廓2個點的維數(shù)為(1,1,2,1,2)
- contourIdx:繪制contours中的哪條輪廓,如果是-1,則繪制其中的所有輪廓
- color:繪制的輪廓的顏色
- thickness:輪廓線的寬度,如果是 -1(cv2.FILLED),則為填充模式
3、輪廓的特征 Contour Features
3.1、矩:cv2.moments()
函數(shù)原型:
cv2.moments(array[, binaryImage])- array:單個輪廓,1xNx1x2維的數(shù)組,即N個二維點
- binaryImage:如果為True,非0的像素值=1,默認為False
- 返回輪廓區(qū)域的矩的字典
實例:
import numpy as np import cv2img = cv2.imread('star.jpg',0) ret, thresh = cv2.threshold(img,127,255,0) im2,contours,hierarchy = cv2.findContours(thresh, 1, 2) cnt = contours[0] M = cv2.moments(cnt)# 計算x,y軸的矩 cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00'])3.2、面積:cv2.contourArea()
函數(shù)原型:
cv2.contourArea(contour[, oriented])- contour:單個輪廓,1xNx1x2維的數(shù)組,即N個二維點
- oriented:如果為True,可以獲得輪廓的方向標志,默認為False
- 返回輪廓區(qū)域的面積
實例:
area = cv2.contourArea(cnt)3.3、周長:cv2.arcLength()
函數(shù)原型:
cv2.arcLength(curve, closed)- curve:單個輪廓,1xNx1x2維的數(shù)組,即N個二維點
- closed:指示曲線是否閉合的標志
- 返回輪廓區(qū)域的周長
實例:
perimeter = cv2.arcLength(cnt, True)3.4、凸性檢測:cv2.isContourConvex()
函數(shù)原型:
cv2.isContourConvex(contour)- contour:單個輪廓,1xNx1x2維的數(shù)組,即N個二維點
- 返回輪廓是否為凸性的,是為True,否為False
實例:
k = cv2.isContourConvex(cnt)4、輪廓近似 Contour Approximation
4.1、多邊形近似:cv2.approxPolyDP()
函數(shù)原型:
cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])- curve:單個輪廓,1xNx1x2維的數(shù)組,即N個二維點
- epsilon:點的最大距離
- closed:設置曲線是否閉合,即得到首尾兩點是否為同一點
- 返回近似輪廓的二維點集
實例:
epsilon = 0.1*cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, epsilon, True)4.2、凸包近似:cv2.convexHull()
函數(shù)原型:
cv2.convexHull(points[, hull[, clockwise[, returnPoints]]])- points:單個輪廓,1xNx1x2維的數(shù)組,即N個二維點
- hull:輸出數(shù)組,正常不用
- clockwise:如果True,輸出的凸包是順時針方向,否則為默認的逆時針。
- returnPoints:默認值為True,返回凸包上點的坐標,如果為False,返回與凸包點對應的輪廓上的點。
- 返回近似輪廓的二維點集
實例:
hull = cv2.convexHull(cnt)4.3、矩形近似:Bounding Rectangle
函數(shù)原型:
# 普通矩形 cv2.boundingRect(points) # 1# 可旋轉矩形,即最小的外包矩形 cv2.minAreaRect(points) # 2# 矩形表達形式的裝換 cv2.boxPoints(box) # 3- points:單個輪廓,1xNx1x2維的數(shù)組,即N個二維點
- box:四個二維點的數(shù)組
- 返回:
- 1:近似矩形的左上角點坐標、矩形的寬和高(x,y,w,h)
- 2:近似矩形的最上角點坐標(x,y),矩形的寬和高(w,h)及旋轉角度θ(°)
- 3:轉換為矩形的四個角點坐標
實例:
# 普通矩形 x,y,w,h = cv2.boundingRect(cnt) cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)# 可旋轉矩形,即最小的外包矩形 rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect) box = np.int0(box) cv2.drawContours(img,[box],0,(0,0,255),2)4.4、其它近似
# 最小外接圓 (x,y),radius = cv2.minEnclosingCircle(cnt) center = (int(x),int(y)) radius = int(radius) cv2.circle(img,center,radius,(0,255,0),2)# 最小外接橢圓 ellipse = cv2.fitEllipse(cnt) cv2.ellipse(img,ellipse,(0,255,0),2)# 擬合直線 rows,cols = img.shape[:2] [vx,vy,x,y] = cv2.fitLine(cnt, cv.DIST_L2,0,0.01,0.01) lefty = int((-x*vy/vx) + y) righty = int(((cols-x)*vy/vx)+y) cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的Python-OpenCV 笔记6 -- 轮廓(Contours)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java string... 参数_Ja
- 下一篇: ajax调用java程序,从微信小程序到