銅陵網(wǎng)站開(kāi)發(fā)交換友情鏈接的注意事項(xiàng)
目錄
引入
基本理解
加深理解
①比如我們可以獲取我們的第一個(gè)輪廓,只展示第一個(gè)輪廓
②我們還可以用一個(gè)矩形把我們的輪廓給框出來(lái)
③計(jì)算輪廓的周長(zhǎng)和面積
引入
顧名思義,就是把我們圖片的輪廓全部都描邊出來(lái)
也就是我們?cè)谌粘I钪忻娌孔R(shí)別的時(shí)候會(huì)有一個(gè)框,那玩意就是
基本理解
我們還是通過(guò)例子來(lái)基本的理解以下opencv是如何實(shí)現(xiàn)輪廓識(shí)別的
這是我們的原圖像? test.png
實(shí)現(xiàn)代碼
cv2.findContours(img,mode,method)
img:輪廓檢索模式:
- 傳入的圖像
mode:輪廓檢索模式:
- RETR_EXTERNAL :只檢索最外面的輪廓;
- RETR_LIST:檢索所有的輪廓,并將其保存到一條鏈表當(dāng)中;
- RETR_CCOMP:檢索所有的輪廓,并將他們組織為兩層:頂層是各部分的外部邊界,第二層是空洞的邊界;
- RETR_TREE:檢索所有的輪廓,并重構(gòu)嵌套輪廓的整個(gè)層次;(一般只用這種)
method:輪廓逼近方法
- CHAIN_APPROX_NONE:以Freeman鏈碼的方式輸出輪廓,輸出完整的輪廓(一般用這種)
- CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部分,也就是,函數(shù)只保留他們的終點(diǎn)部分。(即只保留輪廓點(diǎn))
返回的值:
contours 獲取到的輪廓點(diǎn) hierarchy???層數(shù)(可以不用管)
cv2.drawContours(圖像,輪廓,輪廓索引,顏色模式,線條厚度)
注意:會(huì)影響我們傳入的原圖像,記得定義一個(gè)臨時(shí)圖像傳入進(jìn)去
import cv2img = cv2.imread("test.png")
img = cv2.resize(img,(500,400))
# 轉(zhuǎn)換為灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 閾值處理,讓圖像顏色只有2種顏色 提高準(zhǔn)確性
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 進(jìn)行輪廓處理
# cv2.findContours返回兩個(gè)值
# contours 輪廓點(diǎn)(是個(gè)列表)
# hierarchy 層數(shù)(用不到)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 輪廓描邊后會(huì)影響原圖,所以我們定義一個(gè)臨時(shí)的圖片
temp_img = img.copy()
# 進(jìn)行輪廓描邊
# contours 獲取到的輪廓點(diǎn)
# -1 表示的畫(huà)出所有的輪廓,eg:0就表示我們列表中第一個(gè)輪廓
# (0, 0, 255) 表示我們用紅色線條來(lái)繪畫(huà) bgr
# 2 表示線條粗細(xì)
res = cv2.drawContours(temp_img, contours, -1, (0, 0, 255), 2)cv2.imshow("res",res)
cv2.waitKey()
cv2.destroyAllWindows()
結(jié)果:
加深理解
除了最基本的用法,我們還有很多擴(kuò)充的用法
①比如我們可以獲取我們的第一個(gè)輪廓,只展示第一個(gè)輪廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 取出列表中第一個(gè)
con = contours[0]
# 繪制
res = cv2.drawContours(temp_img, con, -1, (0, 0, 255), 2)
# 展示
cv2.imshow("res",res)
我們可以看到,只出現(xiàn)了我們列表第一個(gè)的輪廓
②我們還可以用一個(gè)矩形把我們的輪廓給框出來(lái)
原圖像:
實(shí)現(xiàn)代碼:
img = cv2.imread('contours.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
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')
x,y,w,h = cv2.boundingRect(cnt)
返回我們的x和y的坐標(biāo)? 以及寬和高
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
繪制我們的矩形
(x,y)表示我們的開(kāi)始坐標(biāo)
(x+w,y+h)表示我們的邊
最后會(huì)自動(dòng)把對(duì)邊連接起來(lái)形成一個(gè)矩形
結(jié)果:
③計(jì)算輪廓的周長(zhǎng)和面積
這個(gè)很簡(jiǎn)單,就是調(diào)用兩個(gè)函數(shù)就能實(shí)現(xiàn)對(duì)應(yīng)得功能
cnt = contours[0]
#面積
cv2.contourArea(cnt)
#周長(zhǎng),True表示閉合的
cv2.arcLength(cnt,True)