Python OpenCV 圖像區(qū)域輪廓標(biāo)記(框選各種小紙條)
學(xué)在前面
上篇 OpenCV 博客原計劃完成一個 識別銀行卡號 的項目,但是寫的過程中發(fā)現(xiàn),技術(shù)儲備不足,我無法在下述圖片中,提取出卡號區(qū)域,也就無法進(jìn)行后續(xù)的識別了,再次意識到了自己技術(shù)還不達(dá)標(biāo),繼續(xù)學(xué)習(xí)。完不成,就實現(xiàn)其它學(xué)習(xí)項目。
輪廓識別實戰(zhàn)
先看一下最終實現(xiàn)的效果,針對一張圖片(該圖片前景色和背景色差異較大),進(jìn)行輪廓標(biāo)記。
圖片基本處理
import cv2 as cv src = cv.imread("./demo.jpg") gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) # cv.imshow("src", src) gray = cv.GaussianBlur(gray, (5, 5), 0) edges = cv.Canny(gray, 70, 210) cv.imshow("edged", edges)
轉(zhuǎn)換成灰度圖,高斯模糊去噪,Canny 邊緣檢測,這些都是圖像處理的基本函數(shù),使用方法已經(jīng)在前文進(jìn)行過相關(guān)學(xué)習(xí)。
運行上述代碼之后,獲取基本邊緣數(shù)據(jù)。
輪廓檢測
下面就是檢測圖像輪廓具體位置的代碼了:
contours, hierarchy = cv.findContours(edges.copy(), cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE) print(f"輪廓數(shù)量:{len(contours)}")
在 cv.findContours(edges, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
中,第二個參數(shù)使用的是 cv.RETR_LIST
,該參數(shù)值表示檢測所有輪廓,不建立等級關(guān)系,彼此獨立。如果只想獲取輪廓邊緣信息,不關(guān)心是否嵌套在另一個輪廓之內(nèi),使用該參數(shù)值即可。
第三個參數(shù)使用的是 cv.CHAIN_APPROX_SIMPLE
,表示壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標(biāo),例如一個矩形輪廓只需 4 個點來保存輪廓信息,這也是為了后面便于計算。
觀察上圖,可以發(fā)現(xiàn)最外側(cè)的邊緣面積是最大的,所以依據(jù)面積進(jìn)行排序,依據(jù)其他值也可以,獲取面積最大的輪廓。
contours = sorted(contours, key = cv.contourArea, reverse = True)[:3]
對輪廓進(jìn)行簡單繪制,獲得下圖效果。
cv.drawContours(src,contours,-1,(0,0,255),2)
遍歷輪廓,計算輪廓近似
先看代碼:
# 遍歷輪廓 for c in contours: # 計算輪廓近似 peri = cv.arcLength(c, True) approx = cv.approxPolyDP(c, 0.02 * peri, True)
一個新的函數(shù) cv.arcLength
,該函數(shù)的原型如下:
retval = cv2.arcLength(curve, closed)
該函數(shù)用于計算輪廓的周長。
下面的 cv.approxPolyDP
函數(shù)原型如下:
approxCurve = cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])
函數(shù)參數(shù)如下:
curve
:源圖像的某個輪廓;epsilon
:距離值,表示多邊形的輪廓接近實際輪廓的程度,值越小,越精確;closed
:輪廓是否閉合。
最重要的參數(shù)就是 epsilon
簡單記憶為:該值越小,得到的多邊形角點越多,輪廓越接近實際輪廓,該參數(shù)是一個準(zhǔn)確度參數(shù)。
該函數(shù)返回值為輪廓近似多邊形的角點。
繪制輪廓
最后判斷,當(dāng)上文返回的角點為 4 的時候,提取輪廓,代碼如下:
# 遍歷輪廓 for c in contours: # 計算輪廓近似 peri = cv.arcLength(c, True) approx = cv.approxPolyDP(c, 0.02 * peri, True) # 當(dāng)恰好是 4 個角點的時候,獲取輪廓。 if len(approx) == 4: screen_cnt = approx break # 結(jié)果顯示 cv.drawContours(src, [screen_cnt], -1, (0, 0, 255), 2)
更換圖片,進(jìn)行再次輪廓檢測,注意修改輪廓近似部分代碼即可。
# 遍歷輪廓 for c in contours: # 計算輪廓近似 approx = cv.approxPolyDP(c, 30, True) if len(approx) == 4: screen_cnt = approx break
到此這篇關(guān)于Python OpenCV 圖像區(qū)域輪廓標(biāo)記(框選各種小紙條)的文章就介紹到這了,更多相關(guān)Python OpenCV區(qū)域輪廓標(biāo)記內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jupyter notebook 寫代碼自動補全的實現(xiàn)
這篇文章主要介紹了jupyter notebook 寫代碼自動補全的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11python使用多線程查詢數(shù)據(jù)庫的實現(xiàn)示例
這篇文章主要介紹了python使用多線程查詢數(shù)據(jù)庫的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Flask Paginate實現(xiàn)表格分頁的使用示例
flask_paginate是Flask框架的一個分頁擴展,用于處理分頁相關(guān)的功能,本文就來介紹一下Flask Paginate實現(xiàn)表格分頁的使用示例,感興趣的可以了解一下2023-11-11python爬蟲把url鏈接編碼成gbk2312格式過程解析
這篇文章主要介紹了python爬蟲把url鏈接編碼成gbk2312格式過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06