OpenCV凸包檢測和凸缺陷學(xué)習(xí)示例
1、凸包檢測與凸缺陷定義
凸包是將最外層的點連接起來構(gòu)成的凸多邊形,它能包含點擊中所有的點。物體的凸包檢測常應(yīng)用在物體識別、手勢識別及邊界檢測等領(lǐng)域。
凸包檢測常常用在輪廓分析之后。對二值圖像進(jìn)行輪廓分析之后,可以構(gòu)建每個輪廓的凸包,構(gòu)建完成之后會返回該凸包包含的點集。根據(jù)返回的凸包點集可以繪制該輪廓對應(yīng)的凸包。一般來說,凸性曲線總是凸出來的,至少是平的。如果有地方凹進(jìn)去了就被叫做凸性缺陷。
下圖可以更加直接的了解凸包和凸缺陷的定義:
2、opencv相關(guān)實現(xiàn)函數(shù)
OpenCV中提供了函數(shù)convexHull 用于對物體輪廓凸包進(jìn)行檢測,函數(shù)convexityDefect進(jìn)行凸缺陷的檢測。首先來了解一下各參數(shù)意義:
hull = cv2.convexHull(points, clockwise, returnpoints)
各參數(shù)意義:
points:輸入的輪廓點集
clockwise:方向標(biāo)志,如果設(shè)置為True,輸出的凸包是順時針方向的,否則為逆時針方向。
returnPoints:是否返回點集
hull : 輸出凸包結(jié)果,當(dāng)參數(shù)returnPoints為ture的時候返回凸包的頂點坐標(biāo)是個點集、returnPoints為false的是返回與凸包點對應(yīng)的輪廓上的點對應(yīng)的index
下面這個函數(shù)可以幫助我們找到凸缺陷:
convexityDefects = cv2.convexityDefect(contour, convexhull)
注意:
進(jìn)行凸檢測時,凸包檢測中的returnPoints要設(shè)置為False
凸缺陷返回一個數(shù)組,每一行包含值是起點,終點,最遠(yuǎn)的點,到最遠(yuǎn)點的近似距離,返回的前三個點都是輪廓索引。
contour: 檢測到的輪廓,可以調(diào)用findContours函數(shù)得到
convexhull:檢測到的凸包,可以調(diào)用convexHull函數(shù)得到。
convexityDefects:輸出參數(shù),檢測到的最終結(jié)果,返回一個數(shù)組,其中每一行包含的值是[起點,終點,最遠(yuǎn)的點,到最遠(yuǎn)點的近似距離]。前三個點都是輪廓索引。
前三個值得含義分別為:凸缺陷的起始點,凸缺陷的終點,凸缺陷的最深點(即邊緣點到凸包距離最大點)
3、代碼實踐
我們可以在一張圖上顯示輪廓的凸包和凸缺陷。
我們將起點和終點用一條紅線 連接,在最遠(yuǎn)點畫一個藍(lán)色的圓圈,要記住的是返回結(jié)果的前三個值是輪廓點的索引。 所以我們還要到輪廓點中去找它們。
前三個值得含義分別為:凸缺陷的起始點,凸缺陷的終點,凸缺陷的最深點(即邊緣點到凸包距離最大點)。
凸包檢測和凸缺陷檢測的代碼如下:
# 凸包檢測和凸缺陷 import cv2 as cv # 讀取圖像 src1 = cv.imread("000.jpg") # 轉(zhuǎn)換為灰度圖像 gray = cv.cvtColor(src1, cv.COLOR_BGR2GRAY) # 二值化 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # 獲取結(jié)構(gòu)元素 k = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) # 開操作 binary = cv.morphologyEx(binary, cv.MORPH_OPEN, k) # 輪廓發(fā)現(xiàn) contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 在原圖上繪制輪廓,以方便和凸包對比,發(fā)現(xiàn)凸缺陷 cv.drawContours(src1, contours, -1, (0, 225, 0), 3) for c in range(len(contours)): # 是否為凸包 ret = cv.isContourConvex(contours[c]) # 凸缺陷 # 凸包檢測,returnPoints為false的是返回與凸包點對應(yīng)的輪廓上的點對應(yīng)的index hull = cv.convexHull(contours[c], returnPoints=False) defects = cv.convexityDefects(contours[c], hull) print('defects', defects) for j in range(defects.shape[0]): s, e, f, d = defects[j, 0] start = tuple(contours[c][s][0]) end = tuple(contours[c][e][0]) far = tuple(contours[c][f][0]) # 用紅色連接凸缺陷的起始點和終止點 cv.line(src1, start, end, (0, 0, 225), 2) # 用藍(lán)色最遠(yuǎn)點畫一個圓圈 cv.circle(src1, far, 5, (225, 0, 0), -1) # 顯示 cv.imshow("result", src1) cv.waitKey(0) cv.destroyAllWindows()
凸缺陷的部分輸出:前三個為凸缺陷的起始點,凸缺陷的終點,凸缺陷的最深點(即邊緣點到凸包距離最大點)。凸包檢測輸出的也是輪廓上的點的索引。
凸缺陷檢測的效果圖:
紅色為凸包,藍(lán)色點為凸缺陷的最深點(即邊緣點到凸包距離最大點),綠色是輪廓。紅色與綠色之間的區(qū)域即為凸缺陷。
4、總結(jié)
(1)cv2.convexityDefect函數(shù)進(jìn)行凸缺陷檢測時,凸包檢測函數(shù)中cv2.convexHull中的returnPoints要設(shè)置為False,返回輪廓中與凸包點對應(yīng)的輪廓點的index。
(2)cv2.convexityDefect函數(shù)的返回值是一系列數(shù)組,[凸缺陷的起點,凸缺陷的終點,凸缺陷的最深的點,到最遠(yuǎn)點的近似距離],前三個是索引值,終點和起點連接即得到凸包。
(3)凸缺陷的最深的點:即邊緣點到凸包距離最大點到最遠(yuǎn)點的近似距離:邊緣點到凸包的最大距離。
(4)利用凸包檢測可以得到進(jìn)一步的輪廓信息,可進(jìn)行邊界檢測,結(jié)合凸缺陷可以實現(xiàn)手勢識別和物體識別。
以上就是OpenCV凸包檢測和凸缺陷學(xué)習(xí)示例的詳細(xì)內(nèi)容,更多關(guān)于OpenCV凸包檢測和凸缺陷的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pycharm下打開、執(zhí)行并調(diào)試scrapy爬蟲程序的方法
本篇文章主要介紹了pycharm下打開、執(zhí)行并調(diào)試scrapy爬蟲程序的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11解決Keras TensorFlow 混編中 trainable=False設(shè)置無效問題
這篇文章主要介紹了解決Keras TensorFlow 混編中 trainable=False設(shè)置無效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06學(xué)會使用Python?Configparser處理ini文件模塊
這篇文章主要為大家介紹了使用Python?Configparser處理ini文件模塊的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06python利用os模塊編寫文件復(fù)制功能——copy()函數(shù)用法
這篇文章主要介紹了python利用os模塊編寫文件復(fù)制功能——copy()函數(shù)用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07