OpenCV findContours 與 drawContours 用法
一、獲取輪廓--findContours
cv2.findContours() 的第二個引數主要有
- cv2.RETR_LIST:檢測的輪廓不建立等級關係
- cv2.RETR_TREE:L建立一個等級樹結構的輪廓。
- cv2.RETR_CCOMP:建立兩個等級的輪廓,上面的一層為外邊界,裡面的一層為內孔的邊界資訊。
- cv2.RETR_EXTERNAL:表示只檢測外輪廓
cv2.findContours() 的第三個引數 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, hierarchy
- contour返回值
cv2.findContours()函式首先返回一個list,list中每個元素都是影像中的一個輪廓,用numpy中的ndarray表示。 - hierarchy返回值
該函式還可返回一個可選的hiararchy結果,這是一個ndarray,其中的元素個數和輪廓個數相同,每個輪廓contours[i]對應4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別表示後一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,則該值為負數。
二、繪出輪廓--drawContours
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
- 第一個引數是指明在哪幅影像上繪製輪廓;
- 第二個引數是輪廓本身,在Python中是一個list。
- 第三個引數指定繪製輪廓list中的哪條輪廓,如果是-1,則繪製其中的所有輪廓。後面的引數很簡單。其中thickness表明輪廓線的寬度,如果是-1(cv2.FILLED),則為填充模式。繪製引數將在以後獨立詳細介紹。
三、測試
import cv2
img = cv2.imread('test.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
相關文章
- 【python】OpenCV—findContours(4)PythonOpenCV
- OpenCV中的findContours函式引數詳解OpenCV函式
- OpenCv查詢輪廓-cv2.findContours()函式OpenCV函式
- OpenCV的SVM用法OpenCV
- 【Python】【OpenCV】關於cv2.findContours()輪廓索引(編號)解析(RETR_TREE)PythonOpenCV索引
- OpenCV 與 SVMOpenCV
- opencv呼叫cv2.dnn_DetectionModel 用法OpenCVDNN
- opencv查詢輪廓---cvFindContours && cvDrawCountours 用法及例子OpenCV
- opencv——影像直方圖與反向投影OpenCV直方圖
- 解決ubuntu16.04 opencv2與opencv3共存問題UbuntuOpenCV
- RewriteCond與RewriteRule用法
- js中的||與&&用法JS
- 【OpenCv】OpenCv原始版本與新版本(2.4.10)的一個簡單對比OpenCV
- opencv圖片處理與OCR識別OpenCV
- GitHub 的用法與禮儀Github
- Androidlistview與adapter用法AndroidViewAPT
- Nmap掃描原理與用法
- 【OpenCV】OpenCV中GPU模組使用OpenCVGPU
- 詳解not in與not exists的區別與用法
- opencv 影像的 ROI、通道的拆分與合併OpenCV
- 嵌入式程式除錯與opencv影像庫除錯OpenCV
- 【Halcon】Halcon與OpenCV介紹、比較OpenCV
- OpenCV----實現目標識別與分割OpenCV
- opencvOpenCV
- OpenCV()OpenCV
- OpenCV&Qt學習之四——OpenCV 實現人臉檢測與相關知識整理OpenCVQT
- Vue中scoped與CSSModules的用法VueCSSSSM
- curl與wget高階用法wget
- split用法與影像預處理
- InfluxDB簡介與php用法UXPHP
- pageYOffset與pageXOffset屬性用法
- Android listview與adapter用法AndroidViewAPT
- IOS中 Block簡介與用法iOSBloC
- 上帝與集合的正確用法
- 詳解OpenCV For Java環境搭建與功能演示OpenCVJava
- OpenCV在Android中的整合與簡單使用OpenCVAndroid
- 使用 OpenCV 與 Face++ 實現人臉解鎖OpenCV
- delphi opencvOpenCV