shape.jpg
首先,我們import cv2,並讀取本次學習中要用到的圖像('shape.jpg')檔。
import cv2
img = cv2.imread('shape.jpg')
接著,將圖片轉灰階。
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #轉灰階
從此處開始進入主軸,檢測圖像的邊緣(圖片, 最低門檻值, 最高門檻值)。
檢測邊緣後,如下圖canny.jpg所示。
canny = cv2.Canny(img, 150, 200) #檢測邊緣(圖片, 最低門檻值, 最高門檻值)
canny.jpg
接著這段程式碼用來偵測圖像的輪廓(做偵測的圖片, 使用的模式(外輪廓/內輪廓/內外輪廓), 近似方法(or又可稱壓縮的方法,水平輪廓點/垂直輪廓點/不做壓縮(保留所有輪廓點)))。
coutours, hierarchy = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) #偵測輪廓(做偵測的圖片, 使用的模式(外輪廓/內輪廓/內外輪廓), 近似方法(or壓縮的方法,水平輪廓點/垂直輪廓點/不做壓縮(保留所有輪廓點)))
coutours代表輪廓 ; hierarchy代表階層。
這裡我們為了與原圖進行比較,所以先複製了一張原圖來進行繪製。
首先我們將得到的所有輪廓點(coutours)進行繪製。使用cv2的drawContours,將輪廓點畫在之前複製好的原圖上。-1代表繪製每個輪廓點,(255,0,0)代表線條顏色(綠色) ,4代表線條的粗細。
area: 輪廓形狀的面積。
為了減少所受圖像中躁點的影響,將面積小於500的忽略。
peri: 輪廓外框總長,True: 輪廓為封閉,False: 輪廓非閉合。
vertices: 用多邊形近似輪廓(,近似值(大:多邊形邊增加,小:多邊形邊減少),是否閉合)。
corners: 頂點數目。
cv2.rectangle: 繪製方框(藍色線條),x,y,w,h: 方框位置,線條粗細。
最後我們可以根據頂點數目判斷它為何種圖形。3: 三角形,4: 四方型,5: 五邊形,>5: 圓形。
imgCoutour = img.copy() #複製原圖
for cnt in coutours:
cv2.drawContours(imgCoutour, cnt, -1, (255,0,0), 4) #(畫在哪張圖上, 要畫的輪廓, 要畫第幾個輪廓點(-1代表每個都畫), 要用什麼顏色來畫(綠色), 線條的粗度)
area = cv2.contourArea(cnt) # 取得輪廓形狀的面積
if area > 500:
#print(cv2.arcLength(cnt, True)) # 取得輪廓外框總長(True: 輪廓為封閉,False: 輪廓非閉合)
peri = cv2.arcLength(cnt, True)
vertices = cv2.approxPolyDP(cnt, peri*0.02, True) #用多邊形近似輪廓(,近似值(大:多邊形邊增加,小:多邊形邊減少),是否閉合)
corners = len(vertices) # 頂點數目
x,y,w,h = cv2.boundingRect(vertices)
cv2.rectangle(imgCoutour, (x,y), (x+w,y+h),(0,255,0),4) #把它框起來(藍色線條),方框位置設定
if corners == 3:
cv2.putText(imgCoutour, 'Triangle', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
elif corners == 4:
cv2.putText(imgCoutour, 'recgtangle', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
elif corners == 5:
cv2.putText(imgCoutour, 'pentagon', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
elif corners > 5:
cv2.putText(imgCoutour, 'circle', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
imgCoutour.jpg
最後,再來補充一下基本知識:
匯入影像:
img = cv2.imread('shape.jpg')
顯示影像:
cv2.imshow('img',img)
cv2.waitKey(0)
儲存影像:
cv2.imwrite('canny.jpg', canny)
筆記到此結束囉~