生活随笔
收集整理的這篇文章主要介紹了
交通标志定位与识别python和opencv
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
交通標志定位與識別
最近在用python和opencv做交通標志的定位和檢測,本案例只能檢測出限速標志的交通標志,第一次寫博客,寫的不好請見諒.
博主也是剛剛接觸機器視覺的學習,后期會繼續發布一些這方面的內容,希望我們可以互相學習,共同進步,
先說一下代碼的運行效果吧
這里是一張圖片的原圖和運行以后的結果
1.導入需要模塊,先創建一個變量a后面會用到
import cv2
as cv
import numpy
as np
import os
a
=0
2,加載圖片
src
=cv
.imread
('tim.jpg')
3,提取紅色和藍色部分,這張圖片只有紅色的部分,但是有的圖片上的交通標志是藍色的,所以這里就提取了紅藍兩種顏色**
hsv
= cv
.cvtColor
(src
,cv
.COLOR_BGR2HSV
)
low_hsv
=np
.array
([0,43,46])
high_hsv
=np
.array
([10,255,255])
low_hsv2
=np
.array
([100,43,46])
high_hsv2
=np
.array
([124,255,255])
mask
=cv
.inRange
(hsv
,lowerb
=low_hsv
,upperb
=high_hsv
)
mask2
=cv
.inRange
(hsv
,lowerb
=low_hsv2
,upperb
=high_hsv2
)
print(type(mask
))
red_blue
=cv
.bitwise_or
(mask
,mask2
)
cv
.imshow
('red_blue',red_blue
)
4,對圖像進行一些形態學操作把一些白色的小點去掉,把輪廓邊緣變得更加清晰
mohu
=cv
.GaussianBlur
(red_blue
,(5,5),0)
thresh
=cv
.threshold
(mohu
,0,255,cv
.THRESH_BINARY
| cv
.THRESH_OTSU
)[1]
ker
=np
.ones
((5,5),np
.uint8
)
close
=cv
.morphologyEx
(thresh
,cv
.MORPH_CLOSE
,ker
)
cv
.imshow
('close',close
)
5,找到上面圖像的所有外輪廓,可以看到上面圖像上有很多的輪廓,我們需要分別獲得他們的外接矩形,然后根據矩形的面積和矩形的長寬比例來選擇合適的輪廓,然后在原圖上把這些輪廓的外接矩形截取下來,對他們進行一些形態學操作,提取到矩形中間的數字和我們的模板進行匹配,模板文件夾我放在最后了,下面是代碼
contours
,hierarchy
=cv
.findContours
(close
,cv
.RETR_EXTERNAL
,cv
.CHAIN_APPROX_NONE
)
print('總輪廓=',len(contours
))
for i
in contours
:if 0.8 <=w
/h
<=1.3:if w
*h
<200:passelse:a
+=1img
=src
[y
:y
+h
,x
:x
+w
]img
=cv
.resize
(img
,(500,460))cv
.rectangle
(src
,(x
-5,y
-5),(x
+w
+5,y
+h
+5),(0,255,0),2)gray
= cv
.cvtColor
(img
, cv
.COLOR_BGR2GRAY
)ret
, thresh
= cv
.threshold
(gray
, 70, 255, cv
.THRESH_BINARY_INV
)ker
= np
.ones
((6, 6), np
.uint8
)close
= cv
.morphologyEx
(thresh
, cv
.MORPH_CLOSE
, ker
)h
, w
= gray
.shape
[0], gray
.shape
[1]point1
= [0.15 * w
, h
/ 4]point2
= [0.15 * w
, 4 * h
/ 5]point3
= [0.83 * w
, 4 * h
/ 5]point4
= [0.83 * w
, h
/ 4]list1
= np
.array
([[point1
, point2
, point3
, point4
]], dtype
=np
.int32
)mask
= np
.zeros_like
(gray
)mask
= cv
.fillConvexPoly
(mask
, list1
, 255)mask1
= cv
.bitwise_and
(mask
, thresh
)ker
= np
.ones
((6, 6), np
.uint8
)mask1
= cv
.morphologyEx
(mask1
, cv
.MORPH_OPEN
, ker
)ker
= np
.ones
((5, 5), np
.uint8
)mask1
= cv
.morphologyEx
(mask1
, cv
.MORPH_CLOSE
, ker
)contours1
, hierarchy1
= cv
.findContours
(mask1
, cv
.RETR_EXTERNAL
, cv
.CHAIN_APPROX_NONE
)a
= len(contours1
)if 0<a
<=3:print('單個矩形內的輪廓', a
)list3
=[]for i
,element
in enumerate(contours1
):x2
, y2
, w2
, h2
= cv
.boundingRect
(element
)list3
.append
(x2
)list2
= []for lk
in contours1
:x1
, y1
, w1
, h1
= cv
.boundingRect
(lk
)roi
= mask1
[y1
:y1
+ h1
, x1
:x1
+ w1
]roi
= cv
.resize
(roi
, (60, 90))roi
=cv
.cvtColor
(roi
,cv
.COLOR_GRAY2BGR
)list2
.append
(roi
)filename
= os
.listdir
(r'D:\圖片處理\muban')scores
= []for i
in range(9):src1
= cv
.imread
('muban/' + filename
[i
])result
= cv
.matchTemplate
(src1
, roi
, cv
.TM_CCOEFF
)(_
, score
, _
, _
) = cv
.minMaxLoc
(result
)scores
.append
(score
)print('得分列表:',scores
)x3
= np
.argmax
(scores
) y3
=scores
[x3
]print('最可能取值:', x3
,'分數=',scores
[x3
])if y3
>158063248:print('x1=',x1
,list3
)if x1
==min(list3
):cv
.putText
(src
,'limt:'+str(x3
),(x
,y
+20),cv
.FONT_HERSHEY_DUPLEX
,1,(255,0,0),2)elif x1
==max(list3
):cv
.putText
(src
, 'limt:'+' '+str(x3
), (x
,y
+20), cv
.FONT_HERSHEY_DUPLEX
, 1, (255,0,0), 2)else:cv
.putText
(src
, 'limt:' +' '+ str(x3
), (x
, y
+ 20), cv
.FONT_HERSHEY_DUPLEX
, 1,(255,0,0), 2)else:passelse:passelse:pass
cv
.imshow
('src',src
)cv
.waitKey
(0)
cv
.destroyAllWindows
()
這是最終的運行結果
模板文件夾好像沒法上傳上來,你們可以自己做一個模板
模板大概就是下面圖片的樣子
``
總結
以上是生活随笔為你收集整理的交通标志定位与识别python和opencv的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。