Pycharm open CV learning 8
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)