Pycharm open CV learning 8

Eddie Chen
20 min readJun 2, 2021

Shape detection

圖形偵測

import cv2
import numpy as np

path = 'resources/shape.PNG'
img=cv2.imread(path)

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)


cv2.imshow('kevin',img)
cv2.imshow('kevin gray',imgGray)
cv2.imshow('kevin blur',imgBlur)
cv2.waitKey(0)

計算圖形程式

import cv2
import numpy as np

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)

path = 'resources/shape.PNG'
img=cv2.imread(path)

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)

#imgStack = stackImages(0.6,([img,imgGray,imgBlur]))


#cv2.imshow('kevin',img )
#cv2.imshow('kevin gray',imgGray)
cv2.imshow('kevin blur',imgBlur)
cv2.imshow('kevin Cblur',imgCanny)

cv2.waitKey(0)

下定義前面

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)

再去得到值

getContours(imgCanny)

計算後並描繪圖形

import cv2
import numpy as np

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3)

path = 'resources/shape.PNG'
img=cv2.imread(path)

imgContour = img.copy() #impoart

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)




cv2.imshow('kevin',img )
cv2.imshow('kevin gray',imgGray)
cv2.imshow('kevin blur',imgBlur)
cv2.imshow('kevin Cblur',imgCanny)
cv2.imshow('kevin Contour',imgContour) #impoart
cv2.waitKey(0)

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -

Very important

重點來了,利用面積大小來重新繪製圖面我們只需要圖形不需要字體


import cv2
import numpy as np

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)
#如果圖形大於多少面積才需要重苗
if area>500:
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3)
#如果圖形數值大於500(可以重對話框中讀取值)
path = 'resources/shape.PNG'
img=cv2.imread(path)

imgContour = img.copy() #impoart

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)

#imgStack = stackImages(0.6,([img,imgGray,imgBlur]))


cv2.imshow('kevin',img )
cv2.imshow('kevin gray',imgGray)
#cv2.imshow('kevin blur',imgBlur)
cv2.imshow('kevin Cblur',imgCanny)
cv2.imshow('kevin Contour',imgContour)
cv2.waitKey(0)

計算真的圖形,有面積的程式

import cv2
import numpy as np

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)

if area>500:
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3)
peri = cv2.arcLength(cnt,True)
print(peri)

path = 'resources/shape.PNG'
img=cv2.imread(path)

imgContour = img.copy() #impoart

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)

#imgStack = stackImages(0.6,([img,imgGray,imgBlur]))


cv2.imshow('kevin',img )
cv2.imshow('kevin gray',imgGray)
#cv2.imshow('kevin blur',imgBlur)
cv2.imshow('kevin Cblur',imgCanny)
cv2.imshow('kevin Contour',imgContour)
cv2.waitKey(0)

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ->

import cv2
import numpy as np

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)

if area>500:
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3)
peri = cv2.arcLength(cnt,True)
#print(peri)
approx = cv2.approxPolyDP(cnt,0.02*peri,True)
print(approx)

path = 'resources/shape.PNG'
img=cv2.imread(path)

imgContour = img.copy() #impoart

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)

#imgStack = stackImages(0.6,([img,imgGray,imgBlur]))


cv2.imshow('kevin',img )
cv2.imshow('kevin gray',imgGray)
#cv2.imshow('kevin blur',imgBlur)
cv2.imshow('kevin Cblur',imgCanny)
cv2.imshow('kevin Contour',imgContour)
cv2.waitKey(0)

— — — — — — — — — — — — — — — — — — — — — — — — — — — — <

下面利用這段程式算出圖形的節點

3->代表三角形

4->代表正方形

增加下面這一行在程式內

approx = cv2.approxPolyDP(cnt,0.02*peri,True)
print(len(approx))
import cv2
import numpy as np

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)

if area>500:
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3)
peri = cv2.arcLength(cnt,True)
#print(peri)
approx = cv2.approxPolyDP(cnt,0.02*peri,True)
print(len(approx))

path = 'resources/shape.PNG'
img=cv2.imread(path)

imgContour = img.copy() #impoart

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)

#imgStack = stackImages(0.6,([img,imgGray,imgBlur]))


cv2.imshow('kevin',img )
cv2.imshow('kevin gray',imgGray)
#cv2.imshow('kevin blur',imgBlur)
cv2.imshow('kevin Cblur',imgCanny)
cv2.imshow('kevin Contour',imgContour)
cv2.waitKey(0)

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -

圖形辨識->利用圖形面積變是圖形,並在圖形上加放方框標示出來

完整程式碼如下:

import cv2
import numpy as np

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)

if area>500:
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3)
peri = cv2.arcLength(cnt,True)
#print(peri)
approx = cv2.approxPolyDP(cnt,0.02*peri,True)
print(len(approx))
objCor = len(approx)
x, y, w, h = cv2.boundingRect(approx)

cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,255,0),2)

path = 'resources/shape.PNG'
img=cv2.imread(path)

imgContour = img.copy() #impoart

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)

#imgStack = stackImages(0.6,([img,imgGray,imgBlur]))


cv2.imshow('kevin',img )
cv2.imshow('kevin gray',imgGray)
#cv2.imshow('kevin blur',imgBlur)
cv2.imshow('kevin Cblur',imgCanny)
cv2.imshow('kevin Contour',imgContour)
cv2.waitKey(0)

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -

增加文字跟辨識形狀程式

if objCor == 3:objectType = "Tri"
else:objectType="None"
import cv2
import numpy as np

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)

if area>500:
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3)
peri = cv2.arcLength(cnt,True)
#print(peri)
approx = cv2.approxPolyDP(cnt,0.02*peri,True)
print(len(approx))
objCor = len(approx)
x, y, w, h = cv2.boundingRect(approx)

if objCor == 3:objectType = "Tri"
else:objectType="None"

cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,255,0),2)
cv2.putText(imgContour,objectType,
(x+(w//2)-10,y+(h//2)-10),cv2.FONT_HERSHEY_COMPLEX,0.5,
(0,255,255),2)

path = 'resources/shape.PNG'
img=cv2.imread(path)

imgContour = img.copy() #impoart

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)

#imgStack = stackImages(0.6,([img,imgGray,imgBlur]))


cv2.imshow('kevin',img )
cv2.imshow('kevin gray',imgGray)
#cv2.imshow('kevin blur',imgBlur)
cv2.imshow('kevin Cblur',imgCanny)
cv2.imshow('kevin Contour',imgContour)
cv2.waitKey(0)

可將文字改為黑色

cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,255,0),2)
cv2.putText(imgContour,objectType,
(x+(w//2)-10,y+(h//2)-10),cv2.FONT_HERSHEY_COMPLEX,0.5,
(0,0,0),1)

之前為黃色

cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,255,0),2)
cv2.putText(imgContour,objectType,
(x+(w//2)-10,y+(h//2)-10),cv2.FONT_HERSHEY_COMPLEX,0.5,
(0,255,255),1)

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

除了三角形外在加上其他判斷形狀

import cv2
import numpy as np

def getContours(img):
contours,hierarchy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)

if area>500:
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3)
peri = cv2.arcLength(cnt,True)
#print(peri)
approx = cv2.approxPolyDP(cnt,0.02*peri,True)
print(len(approx))
objCor = len(approx)
x, y, w, h = cv2.boundingRect(approx)

if objCor == 3:objectType = "Tri"
elif objCor == 4:
aspRatio = w/float(h)
if aspRatio>0.95 and aspRatio <1.05: objectType="square"
else:objectType="NO DATA"

cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,255,0),2)
cv2.putText(imgContour,objectType,
(x+(w//2)-10,y+(h//2)-10),cv2.FONT_HERSHEY_COMPLEX,0.5,
(0,0,0),1)

path = 'resources/shape.PNG'
img=cv2.imread(path)

imgContour = img.copy() #impoart

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)

#imgStack = stackImages(0.6,([img,imgGray,imgBlur]))


cv2.imshow('kevin',img )
cv2.imshow('kevin gray',imgGray)
#cv2.imshow('kevin blur',imgBlur)
cv2.imshow('kevin Cblur',imgCanny)
cv2.imshow('kevin Contour',imgContour)
cv2.waitKey(0)

--

--