日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

交通标志定位与识别python和opencv

發(fā)布時間:2023/12/29 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 交通标志定位与识别python和opencv 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

交通標志定位與識別

最近在用python和opencv做交通標志的定位和檢測,本案例只能檢測出限速標志的交通標志,第一次寫博客,寫的不好請見諒.
博主也是剛剛接觸機器視覺的學(xué)習(xí),后期會繼續(xù)發(fā)布一些這方面的內(nèi)容,希望我們可以互相學(xué)習(xí),共同進步,

先說一下代碼的運行效果吧
這里是一張圖片的原圖和運行以后的結(jié)果

1.導(dǎo)入需要模塊,先創(chuàng)建一個變量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,對圖像進行一些形態(tài)學(xué)操作把一些白色的小點去掉,把輪廓邊緣變得更加清晰

#高斯模糊 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,找到上面圖像的所有外輪廓,可以看到上面圖像上有很多的輪廓,我們需要分別獲得他們的外接矩形,然后根據(jù)矩形的面積和矩形的長寬比例來選擇合適的輪廓,然后在原圖上把這些輪廓的外接矩形截取下來,對他們進行一些形態(tài)學(xué)操作,提取到矩形中間的數(shù)字和我們的模板進行匹配,模板文件夾我放在最后了,下面是代碼

contours,hierarchy=cv.findContours(close,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE) print('總輪廓=',len(contours)) for i in contours:# print(cv.contourArea(i),cv.arcLength(i,True))#計算輪廓面積和周長#獲取輪廓外接矩形左上角坐標(x,y)和矩形的寬高#然后提取寬高比例在0.8到1.3和面積大于200的輪廓#x,y,w,h=cv.boundingRect(i)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)#cv.drawContours(src, contours1, -1, (0, 255, 0), 3)if 0<a<=3:print('單個矩形內(nèi)的輪廓', a)list3=[]for i,element in enumerate(contours1):x2, y2, w2, h2 = cv.boundingRect(element)# print('x2,y2,w2,h2=', x2, y2, w2, h2)# dist1[str(i)]=x2list3.append(x2)# print('list3=',min(list3))# print(type(element))# 輪廓外接矩形# boundingboxes = [cv.boundingRect(c) for c in close] # 返回外接矩形的四個值x,y,h,wlist2 = []#存放輪廓列表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變成三通道圖像roi=cv.cvtColor(roi,cv.COLOR_GRAY2BGR)list2.append(roi)#cv.imshow('a4',list2[0])#遍歷模板,進行模板匹配filename = os.listdir(r'D:\圖片處理\muban')scores = []for i in range(9):src1 = cv.imread('muban/' + filename[i])# gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)# ret,thresh=cv.threshold(gray,70,255,cv.THRESH_BINARY)result = cv.matchTemplate(src1, roi, cv.TM_CCOEFF)(_, score, _, _) = cv.minMaxLoc(result)scores.append(score)print('得分列表:',scores)x3 = np.argmax(scores) # x是列表最大值所對應(yīng)的下標y3=scores[x3]print('最可能取值:', x3,'分數(shù)=',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('img',img) # cv.imshow('mask1',mask1) cv.imshow('src',src)cv.waitKey(0) cv.destroyAllWindows()

這是最終的運行結(jié)果

模板文件夾好像沒法上傳上來,你們可以自己做一個模板
模板大概就是下面圖片的樣子

``

總結(jié)

以上是生活随笔為你收集整理的交通标志定位与识别python和opencv的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。