目標
理解什麼是輪廓
找輪廓、繪製輪廓
學習如下函數cv2.findContours(), cv2.drawContours()
什麼是輪廓?
輪廓可以理解為將所有連續的像素點(沿著邊界)連接咋我一起的曲線,這些像素有相同的顏色或者灰度。輪廓在形狀分析和物體識別上有重要應用。 - 為了提高精確度、要使用二值圖像。尋找輪廓前,要進行閾值化處理或者canny邊緣檢測
- 查找輪廓會修改原始圖像,所以原始圖像要備份
- 要找的物體應該是白色的,在黑色的背景當中
- import numpy as np
- import cv2
- im = cv2.imread('3.jpg')
- imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
- ret,thresh = cv2.threshold(imgray,127,255,0)
- image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
- cv2.imshow('res',image)
- cv2.waitKey(0)
複製代碼
cv2.findContours()輸入三個參數,第一個參數是輸入圖像,第二個參數是輪廓查找方式,第三個參數是輪廓近似方法。
返回值有三個,第一個是圖像(二值),第二個是純輪廓,第三個是輪廓層次 返回的純輪廓是一個python的列表,此處存儲所有圖像中的輪廓,每一個輪廓都是numpy數組,包含檢測物體邊界點
新版OPENCV只有兩個參數,才能正常動作 - contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
複製代碼
如何繪製輪廓?
cv2.drawContours()函數來繪製輪廓,根據用戶提供的邊界點繪製任何形狀。
輸入參數為,原始圖像,輪廓(列表),輪廓索引(繪製獨立輪廓時有用,-1繪製所有輪廓)
,輪廓顏色,輪廓厚度等等。 在圖像中繪製所有輪廓 - import numpy as np
- import cv2
- im = cv2.imread('1.jpg')
- imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
- ret,thresh = cv2.threshold(imgray,127,255,0)
- image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
- img = cv2.drawContours(im, contours, -1, (0,255,0), 3)
- cv2.imshow('res',img)
- cv2.waitKey(0)
複製代碼
繪製第四個輪廓 - import numpy as np
- import cv2
- im = cv2.imread('1.jpg')
- imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
- ret,thresh = cv2.threshold(imgray,127,255,0)
- image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
- img = cv2.drawContours(im, contours, 3, (0,255,0), 3)
- cv2.imshow('res',img)
- cv2.waitKey(0)
複製代碼
多數情況下這樣使用,與上面結果一樣 - import numpy as np
- import cv2
- im = cv2.imread('1.jpg')
- imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
- ret,thresh = cv2.threshold(imgray,127,255,0)
- image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
- cnt = contours[3]
- img = cv2.drawContours(im, [cnt], 0, (0,255,0), 3)
- cv2.imshow('res',img)
- cv2.waitKey(0)
複製代碼
輪廓近似方法 cv2.findCountours()函數的第三個參數,是什麼意思?
輪廓是形狀具有相同灰度的邊界值,在輪廓中會存儲所有邊界上的(x,y)坐標。但是不一定需要全部存儲,這時用參數來控制。 參數在設置為cv2.CHAIN_APPROX_NONE時所有邊界點會被存儲,但是事實上並不一定需要那麼多,例如邊界是一條直線時,你不需要直線上的所有點,有兩個端點即可,這就是cv2.CHAIN_APPROX_SIMPLE參數提供的,它會去電多餘的點。
文章出處
|