基於OpenCV的車輛變道檢測

2020-12-20 易車網

本期教程我們將和小夥伴們一起研究如何使用計算機視覺和圖像處理技術來檢測汽車在行駛中時汽車是否在改變車道!大家一定聽說過使用OpenCV的haar級聯文件可以檢測到面部、眼睛等,但是如果目標是汽車,公共汽車呢?

01.數據集

我們將道路上汽車的視頻文件用作數據集。當然可以使用圖像數據集檢測來汽車,但是由於汽車在變道時我們需要通過彈出窗口提供警報,因此對於這些動態情況,視頻輸入更為可行。

02.輸入

第一步是提供要在本教程中使用的輸入-OpenCV的haar級聯文件,用於檢測汽車的坐標,道路上的汽車的視頻文件-

cascade_src='cascade/cars.xml'video_src='dataset/cars.mp4'cap=cv2.VideoCapture(video_src)car_cascade=cv2.CascadeClassifier(cascade_src)

cv2.VideoCapture()方法用於捕獲輸入視頻,視頻通常為每秒25個圖像/幀(fps)。捕獲輸入後,使用循環提取幀,並使用汽車的haar級聯文件檢測到的坐標,我們在循環中在汽車周圍繪製一個矩形,以在對捕獲的幀執行其他操作時獲得一致性。

while(1):#Takeeachframe_,frame=cap.read()cars=car_cascade.detectMultiScale(frame,1.1,1)for(x,y,w,h)incars:roi=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)#ROIisregionofinterest

在OpenCV中,使用BGR而不是RGB,因此(0,0,255)將在汽車上繪製一個紅色矩形,而不是藍色。

03.圖像處理

如果幀的解析度很高,則會減慢執行的操作,此外,該幀還包含噪聲,可以使用模糊降低噪聲,這裡使用高斯模糊。

3.1HSV框架

在此,我們使用從cv2.VideoCapture()捕獲的幀中獲得的HSV幀僅突出顯示汽車轉彎的點,並遮擋其餘道路和在道路上直行的汽車。設置上限和下限閾值是為了定義HSV中的顏色範圍,以查看汽車改變車道的點,並用作框架的遮罩。以下是用於獲取此代碼的代碼段-

#cancelingnoiseinthevideoframesusingblurframe=cv2.GaussianBlur(frame,(21,21),0)#ConvertBGRtoHSVhsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)#definerangeofcolorinHSVtoseethepointsatwhichthecarischangingangleslower_limit=np.array([0,150,150])upper_limit=np.array([10,255,255])#ThresholdtheHSVimagetogetonlythethresholdedcolorsmask=cv2.inRange(hsv,lower_limit,upper_limit)

3.2腐蝕與膨脹

腐蝕和膨脹是圖像處理中常使用的兩個基本形態學操作。腐蝕算子在內核區域上具有局部最小值的作用。腐蝕用於減少圖像中的斑點噪聲,斑點會從圖像中的對象邊界腐蝕掉。膨脹具有局部最大值運算符的作用。當添加像素以平滑圖像中對象的邊界時,將使用膨脹來重新獲得一些丟失的區域。現在,通過基本形態學操作(腐蝕和膨脹)處理從HSV幀的第一步生成的蒙版。通過將幀和掩碼之間的按位與運算應用於獲取ROI(感興趣區域),可以生成結果幀。

kernel=np.ones((3,3),np.uint8)kernel_lg=np.ones((15,15),np.uint8)#imageprocessingtechniquecalledtheerosionisusedfornoisereductionmask=cv2.erode(mask,kernel,iterations=1)#imageprocessingtechniquecalledthedilationisusedtoregainsomelostareamask=cv2.dilate(mask,kernel_lg,iterations=1)#Bitwise-ANDtogetblackeverywhereelseexcepttheregionofinterestresult=cv2.bitwise_and(frame,frame,mask=mask)

3.3車道檢測

canny邊緣檢測器與霍夫線變換一起用於檢測車道。

canny邊緣檢測(作者提供的圖像)

04.邊緣檢測

諸如canny邊緣檢測器之類的算法用於查找將圖像中的邊緣像素,但是由於我們無法融合某些點和邊緣,因此它無法找到實際對象,在這裡我們可以使用OpenCV中的cv2.findContours()實現輪廓的查找。

定義-「輪廓是代表圖像中曲線的點的列表。」等高線由序列表示(序列是結構的鍊表),每個序列都編碼有關下一點位置的信息。我們在ROI中多次運行cv2.findContours()以獲得實體,然後使用cv2.drawContours()繪製輪廓區域。等高線可以是點,邊,多邊形等,因此在繪製等高線時,我們進行多邊形近似,以找到邊的長度和區域的面積。函數cv2.drawContours()的工作方式是從根節點開始繪製一棵樹(數據結構),然後將後續點,邊界框和freeman鏈代碼連接在一起。

找到輪廓後的另一個重要任務是匹配它們。輪廓匹配意味著我們有兩個單獨的計算輪廓相互比較,或者輪廓與抽象模板相比較。

thresh=maskcontours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#defineaminimumareaforacontour(ignoringallvaluesbelowmin)min_area=1000cont_filtered=[]#filteroutallcontoursbelowamin_areaforcontincontours:ifcv2.contourArea(cont)>min_area:cont_filtered.append(cont)cnt=cont_filtered[0]#drawtherectanglesaroundcontoursrect=cv2.minAreaRect(cnt)box=cv2.boxPoints(rect)box=np.int0(box)cv2.drawContours(frame,[box],0,(0,0,255),2)rows,cols=thresh.shape[:2][vx,vy,x,y]=cv2.fitLine(cnt,cv2.DIST_L2,0,0.01,0.01)lefty=int((-x*vy/vx)+y)righty=int(((cols-x)*vy/vx)+y)cv2.line(frame,(cols-1,righty),(0,lefty),(0,255,0),2)

05.中心矩

我們可以通過計算輪廓矩來比較兩個輪廓。「中心矩是通過將輪廓的所有像素相加而得出的輪廓的總體特徵。」

中心矩型-

  • 空間矩:m00,m10,m01,m20,m11,m02,m30,m21,m12,m03。
  • 中心矩:mu20,mu11,mu02,mu30,mu21,mu12,mu03。
  • Hu矩:有七個Hu矩(h0—h6)或(h1—h7),兩種表示法都使用。

我們使用cv2.fitEllipse()計算矩並將橢圓擬合在這些點上。從輪廓和力矩中得出角度,因為改變車道需要45度旋轉,這被認為是汽車轉彎角度的閾值。

現在,我們不僅可以列印檢測變化的車道,還可以使用Tkinter作為一個簡單的彈出窗口來提醒更改。

使用Greenline測量角度,並在框架中的汽車上繪製矩形

彈出警報(作者提供的圖片)

輸出

06.總結

在本教程中,使用車道變更檢測方法探索了智能汽車導航的小型演示。計算機視覺正在迅速發展,其應用不僅在汽車的本地導航中而且在火星導航和產品檢查領域中也在不斷發展,甚至醫療應用也正在開發中,並可以在早期用於檢測X射線圖像中的癌症和腫瘤階段。

參考文獻:

  1. Bradski,GaryandKaehler,Adrian,LearningOpenCV:ComputerVisioninC++withtheOpenCVLibrary,O』ReillyMedia,Inc.,2ndedition,2013,@10.5555/2523356,ISBN—1449314651.
  2. Laganiere,Robert,OpenCVComputerVisionApplicationProgrammingCookbook,PacktPublishing,2ndedition,2014,@10.5555/2692691,ISBN—1782161481.

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。

易車號作者提供

相關焦點

  • 使用OpenCv和Dlib進行打哈欠檢測
    打哈欠檢測與應用打哈欠檢測就是使用OpenCV和Dlib來檢測打哈欠(由於疲勞或無聊而張大嘴巴深吸氣)。可廣泛應用於自駕車、駕駛員疲勞檢測、駕駛員睡意檢測、駕駛員意識檢測等領域。安裝OpenCv和Dlib庫OpenCv的安裝如下:pip install opencv-pythonDlib的安裝如下:pip install cmake
  • OpenCV 4.5 發布!
    增加對 Macbeth 圖檢測的支持,Macbeth 圖是用於相機顏色校正的圖像色塊。(很明顯這麼基礎的功能,應該早就支持)9.RGBD 新增基於 TSDF volume 的 Hashtable ,以支持大範圍環境的深度圖的融合。10. 在Windows 發布版中 OpenJPEG 替換了 Jasper,使得對JPEG圖像的IO操作更安全高效。
  • 為躲車輛貨車急變道擦傷公交,幸無人受傷
    大河報·大河客戶端記者 寧田甜 5月6日,在鄭州市隴海快速路上,一輛由西向東直行的廂式貨車躲避右側輔道匯入的黑色轎車,貨車司機因未看清後方正常行駛的B5路公交車,變道時不慎與公交車發生擦碰,造成雙方車輛不同程度擦碰傷,幸無乘客受傷。
  • 大貨車喇叭按得震天響 轎車司機「我行我素」違規變道引發車輛剮蹭...
    面對這一突發情況,他就連續按大貨車的喇叭,想通過車喇叭的聲音來提醒轎車司機不要違規變道。但令人感到納悶的是,轎車司機對貨車司機的提醒「置若罔聞」,繼續「我行我素」向右變道,試圖進入服務區,全然不顧其他車輛的安全。為了避免和轎車發生碰撞,崔先生就急忙向右側變道進行避讓,就在這個時候,兩車狠狠地「擠」在了一起。
  • OpenCV黑魔法之隱身衣 | 附源碼
    https://www.learnopencv.com/color-spaces-in-opencv-cpp-python/所以當我說,我需要一個特定的顏色,選擇色相組件,然後根據飽和度組件,我得到了那個顏色的不同的陰影,進一步根據值組件,我得到了一個顏色的特定陰影的不同的強度。
  • 基於非接觸心率檢測的疲勞駕駛監測技術
    在疲勞狀態下駕駛車輛稱之為疲勞駕駛,當駕駛人員在長時間內持續駕駛而沒有得到足夠休息時,其生理機能和心理機能將會逐漸失調,對車輛的控制能力、注意力以及面對突發事件時的反應能力都會明顯下降,甚至可能墜入短暫睡眠,導致車輛徹底失控。疲勞駕駛的表現是怎樣的?
  • 右轉車道長期有車違停,其他車輛無奈壓實線變道,交警出手了
    楚天都市報8月30日訊(記者劉孝斌)市民反映,從東湖新技術開發區生物園西路右轉至神墩三路時,生物園西路的右轉車道長期停滿車輛,無奈只好從左轉車道借道壓實線右轉,希望有關部門加強管理。今日,楚天都市報記者報警後,東湖新技術開發區交通大隊立即出動警力現場整治。
  • 基於python+opencv的圖像目標區域自動提取
    提取矩形角落坐標矩形的檢測主要是提取邊緣,圖片顯示部分的亮度通常高於周圍環境,我們可以將圖片閾值化,將圖片部分與周圍環境明顯的分別開來,這對後邊的邊緣檢測非常有幫助檢測矩形並提取坐標需要對圖像進行預處理、邊緣檢測、提取輪廓、檢測凸包、角點檢測。
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,使用起來十分方便,把它與PyQt結合起來,就可以順利的操作視頻、圖像了。具體安裝請自行百度,這裡介紹使用方法。
  • 變道未按規定讓行,也要承擔事故責任!
    變道未按規定讓行,也要承擔事故責任!原來,是因為一輛小型轎車在躲避前方變道車輛時,急打方向盤致車輛失控撞上前面停車等待通行的貨櫃大貨車,事故導致小型轎車駕駛員腿部受傷。
  • 傳感器熱點:基於AI的有毒物質檢測技術,準確度高達95.3%!
    他們展示了聯網和自動車輛(CAV)如何使用一種名為合作感知或集體感知信息傳遞(CPM)的新興技術。 CPM允許智能交通系統(ITS)站,或者智能路邊單元(IRSU),通過使用車輛到X(V2X)通信技術,與他人共享本地感知信息。這種新興技術不僅能讓駕車者的道路更加安全,還能保護弱勢用戶,如慢跑者、行人和騎車者。
  • 使用Python+OpenCV進行面部合成
    原文 http://www.learnopencv.com/face-morph-using-opencv-cpp-python/
  • 我沒變道!行車記錄儀:不,你變了
    當民警詢問事故發生的原因時,後車駕駛人稱,由於有車輛遮擋視線,當發現正在變道的前車時,躲避不及追尾。而前車駕駛人卻堅稱自己沒有變道:「這雙線,我沒變。」甚至還稱事故是後車駕駛人「走神兒」所致↓然而,前車的行車記錄儀記錄下了事故發生的瞬間▼原來,前車想要從黃驊北收費站下高速,由於駕駛人不熟悉路線,在快要錯過出口時才開始準備變道,由於後方車輛較多,該車在變道時直接停在了快車道上,就在其想要向匝道行駛時,與後方正常行駛車輛相撞。
  • 又兩輛魯R車輛被網友舉報!
    違法變道12月6日,有網友在鄄城交警大隊微信平臺上舉報稱,12月6日12時4分,一輛小型轎車在鄄城縣城區禹王路建設街交叉路口實線變道,影響其他車輛正常通行,行為十分危險。鄄城縣交警大隊接到平臺信息反饋後,立即進行情況核實。
  • 小車分叉路口急變道 與半掛車刮擦後「很受傷」(圖)
    麵包車與與半掛車相刮擦後「很受傷」(圖片來源網絡)    中國江西網訊 記者周再奔報導:7月5日,中國江西網記者獲悉,在生厚高速公路往南昌與九江方向分叉口處,7月3日晚上發生一起宜春牌照轎車與湖北牌照半掛車相刮擦的交通事故,事故造成小轎車車輛受損,所幸未造成人員受傷。
  • 有信號燈的路口,主道和輔道互相變道需要打轉向燈嗎?終於明白了
    我現在在主道的最右側車道行駛,前方繼續直行,前方車輛右轉的這個地方是一個主道駛入輔道的缺口,這個缺口是斜開的,只能從主道進入輔道,輔道的車輛不能從這個缺口進入主道,在這裡進入輔道屬於變道行為,需要打右轉向燈。當然了,前面這輛車並沒有打轉向燈。
  • 紅綠燈路口前車壞了,後車壓實線變道,會不會被罰?
    大家都知道闖紅綠燈是違章的,但如果紅綠燈路口前車突然壞了無法行進,後車實線變道了,如果自己也跟著變道,到底算不算違章?我們遇到又該怎麼做呢?正常情況下壓信號燈路口的白色實線區域,處以扣3分,罰款200元的處罰!
  • 談談OpenCV中的四邊形
    另一類就是使用機器學習類算法檢測定位四個角點。這篇文章我們主要來看看使用經典圖像處理算法來解決這個問題。1.最小包絡正矩形Rect boundingRect(InputArray points)函數會給我們傳入的邊界點計算得到一個最小的包絡正矩形,並輸出這個正矩形的頂點。
  • 普陀推進車輛檢測「一件事」集成改革 帶來便利
    浙江在線-普陀新聞網12月24日訊(浙江在線記者 嚴藝偉)「這是我第一次車檢,有序不擁堵,進來信息填好,鑰匙給他們,人坐著等一會,車就檢測好了,給我們車主提供了便利。」最近,不少車主到浙江康宏檢測有限公司進行車輛檢測時,對公司提供的「交鑰匙」服務連連稱讚。