本期教程我們將和小夥伴們一起研究如何使用計算機視覺和圖像處理技術來檢測汽車在行駛中時汽車是否在改變車道!大家一定聽說過使用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.中心矩
我們可以通過計算輪廓矩來比較兩個輪廓。「中心矩是通過將輪廓的所有像素相加而得出的輪廓的總體特徵。」
中心矩型-
我們使用cv2.fitEllipse()計算矩並將橢圓擬合在這些點上。從輪廓和力矩中得出角度,因為改變車道需要45度旋轉,這被認為是汽車轉彎角度的閾值。
現在,我們不僅可以列印檢測變化的車道,還可以使用Tkinter作為一個簡單的彈出窗口來提醒更改。
使用Greenline測量角度,並在框架中的汽車上繪製矩形
彈出警報(作者提供的圖片)
輸出
06.總結
在本教程中,使用車道變更檢測方法探索了智能汽車導航的小型演示。計算機視覺正在迅速發展,其應用不僅在汽車的本地導航中而且在火星導航和產品檢查領域中也在不斷發展,甚至醫療應用也正在開發中,並可以在早期用於檢測X射線圖像中的癌症和腫瘤階段。
參考文獻:
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。
易車號作者提供