<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用OpenCV搭建違章停車檢測系統(tǒng)

          共 3893字,需瀏覽 8分鐘

           ·

          2022-02-26 23:28

          ↑ 點擊藍(lán)字?關(guān)注極市平臺

          作者丨小白
          來源丨小白學(xué)視覺
          編輯丨極市平臺

          極市導(dǎo)讀

          ?

          今天將會帶領(lǐng)大家一起學(xué)習(xí)如何搭建一個違章停車檢測系統(tǒng)。需要重點說明的是,今天使用的邏輯和判定條件比較難,尤其是他的編程實現(xiàn)。?>>加入極市CV技術(shù)交流群,走在計算機視覺的最前沿

          項目的開源代碼,具體鏈接如下:

          https://github.com/hasantha-nirmal/Traffic_Violation_Detection_Yolov4_Deep-Sort

          接下來我們將詳細(xì)介紹如何實現(xiàn)這個系統(tǒng)

          首先,我們需要簡要了解一下這個項目中的停車違章檢測是什么意思。為了介紹方便,我們將穿插使用學(xué)術(shù)術(shù)語和生活用語。想象一下,我們有一個感興趣的區(qū)域也可以稱為某個地方,車輛不應(yīng)該停放在那里。但是,如果車輛只是停在那里一會兒,我們也不能將其是為為違章,例如馬路邊允許臨時停車的區(qū)域。如果我們正在談?wù)摰倪@個區(qū)域離道路太近,那么經(jīng)過的車輛可能會與這個感興趣的區(qū)域相交,并且會立即被視為違章。所以首先,我們必須消除這種情況。也就是首先解決臨時停車不會判定為違章的情況。最簡單的解決方案是為每輛單獨的車輛引入計時器。由此,我們可以確保車輛已經(jīng)在該限制區(qū)域內(nèi)停留了多長時間。

          采用感興趣區(qū)域作為停車位,我們只需使用一個攝像頭即可,同時這個攝像頭不僅可以同時監(jiān)控和檢測特定車輛占用該停車位的時間,還可以計算出每輛車必須支付的費用停車場。當(dāng)然了,這需要額外的開發(fā),這里小白不做過多的介紹。

          我們前面說過,我們需要建立一個計時器。這個任務(wù)的難點是需要考慮許多車輛肯定會同時出現(xiàn),這使得任務(wù)變得比較復(fù)雜。不過也沒有關(guān)系,我們只需要為不同的車輛設(shè)置不同的計時器即可。

          接下來我們將詳細(xì)介紹如何通過代碼實現(xiàn)上述的功能。

          #?Parking?space?coordinates;?#line?113
          parking_co?=?[]

          #blanked?=?np.zeros((658,1024),?dtype=np.uint8)
          blanked?=?np.zeros((2048,?1024),?dtype=np.uint8)
          #pts?=?np.array(([156,?704],?[2,?893],?[476,?932],?[270,?708]))
          pts?=?np.array(([513,?716],?[321,?943],?[884,?979],?[630,?701]))
          #blanked?=?np.zeros((720,1280),?dtype=np.uint8)
          #pts?=?np.array(([38,?433],?[95,?322],?[1246,?570],?[1065,?709]))
          cv2.fillPoly(blanked,?np.int32([pts]),?255)

          上面的代碼給出了我們?nèi)绾芜x擇停車位作為我們的感興趣區(qū)域。我們首先定義了一個名為park_co的空白數(shù)組,之后創(chuàng)建了一個于圖像分辨率具有相同高度或者相同寬度的一個權(quán)威零的數(shù)組。之后選擇感興趣區(qū)域的頂點坐標(biāo)。在pts變量中存放我們選擇的感興趣區(qū)域的頂點坐標(biāo)。之后我們使用OpenCV中的fillPoly函數(shù)將感興趣區(qū)域填充上,以便于我們判斷車輛是否與感興趣區(qū)域相交。

          感興趣區(qū)域的選擇如下圖所示:

          現(xiàn)在,我們有了感興趣的區(qū)域或禁止車輛停放的地方的像素的所有坐標(biāo)點。然后我們選取車輛的邊界框坐標(biāo)(如何識別車輛呢,可以參考小白之前的文章)。但是,這又帶來了一個問題。如果相機離這個感興趣區(qū)域太近,當(dāng)有車輛接近該區(qū)域時,它的邊界框會占據(jù)非常多的坐標(biāo)點,當(dāng)同時有車輛時,必須對視頻的每一幀重復(fù)這個過程,導(dǎo)致幀率急劇下降。所以,我對這個案例提出了一個假設(shè):如果一個車輛/邊界框與這個 ROI 相交,它肯定也與邊界框的底線相交。所以就像在車道線違例中一樣,而不是取車輛的所有邊界框坐標(biāo)

          bbox_bottom_line_co?=?list(zip(*line(*(int(bbox[0])+50,int(bbox[3])),?*(int(bbox[2])-50,int(bbox[3])))))

          上面是提取底線坐標(biāo)的代碼。我們通過從線條的每一側(cè)移除 50 個像素坐標(biāo)來減少線條長度,以便更好地表示車輛。因此,該線始終停留在車輛區(qū)域內(nèi),并且不占用其周圍的任何空閑空間。

          if?len(intersection(parking_co,?bbox_bottom_line_co))?>?0:
          frame_matrix.append((str(frame_num)?+?class_name?+?str(t),
          (
          str(int(bbox[0])).zfill(4),?str(int(bbox[1])).zfill(4),?str(int(bbox[2])).zfill(4),
          str(int(bbox[3])).zfill(4))))

          想象一輛車第一次與該地區(qū)相交。當(dāng)它發(fā)生在特定幀內(nèi)的那一刻,我們立即附加該事件的幀號frame_num車輛類型(class_name),車輛跟蹤 ID(str(t))和該車輛在該幀的邊界框坐標(biāo)

          chk_index = str(frame_matrix).find(str(frame_num — 1) + class_name + str(t))

          然后立即檢查前一幀是否為同一車輛發(fā)生了相同類型的相交點。如果這個相交點是第一次發(fā)生,則不滿足這個條件,程序進入下一幀,沒有任何進一步的交互。但是想象一下,如果這是車輛與感興趣區(qū)域相交后的第二幀,那么會為這個chk_index變量賦一個值。

          if?bool(chk_index?+?1)?==?True:
          previous_bbox_co_str?=?str(frame_matrix)[
          (chk_index?—?1)?+?len(str(frame_num?—?1))?+?len(class_name?+?str(t))?+?5:(chk_index?—?1)?+?len(str(frame_num?—?1))?+?len(class_name?+?str(t))?+?5?+?30]

          我們首先對( chk_index+1 )的布爾值給出一個正值。設(shè)置為1的原因是,對于特定車輛,它的日志詳細(xì)信息可能從數(shù)組的最開頭開始,因此將其在數(shù)組中的放置值設(shè)置為 0。如果發(fā)生這種情況,bool(0)會使條件為 false即使它為真。如果沒有這樣的日志條目,則 chk_index僅返回 -1,當(dāng)設(shè)為 +1 時,它會給出所需的 False 輸出。

          此外,當(dāng)該條件為真時,將會有關(guān)于邊界框的前一幀日志詳細(xì)信息獲取到另一個名為previous_bbox_co_str的變量中。

          現(xiàn)在我們知道了車輛在當(dāng)前幀和前一幀的邊界框坐標(biāo)。由于我們一直都知道車輛一直在 ROI 中,因此我們需要確定車輛是靜止(不動)還是移動的。這里我們聲明了一個名為immobile的新函數(shù),用于實現(xiàn)這個功能。

          #?Check?the?immobility?of?vehicle?#line?99
          def?immobile(bbox,?previous_bbox_str):
          previous_bbox0?=?int(previous_bbox_str[1:5])
          previous_bbox1?=?int(previous_bbox_str[9:13])
          previous_bbox2?=?int(previous_bbox_str[17:21])
          previous_bbox3?=?int(previous_bbox_str[25:29])

          total?=?abs(bbox[0]?—?previous_bbox0)?+?abs(bbox[1]?—?previous_bbox1)?+?abs(bbox[2]?—?previous_bbox2)?+?abs(
          bbox[3]?—?previous_bbox3)
          if?total?<=?4:
          return?True
          else:
          return?False

          這里我們使用了previous_bbox_co_str作為函數(shù)的屬性,以及當(dāng)前的邊界框坐標(biāo)。我們分別計算xmin、ymin、xmax 和 ymax 值的差值,如果絕對差值小于 4,輸出 True,表示車輛是不動的,否則輸出 False。需要注意,即使車輛或任何物體完全停止,YOLO 也會給出波動的邊界框坐標(biāo)。為避免這個現(xiàn)象并使此過程穩(wěn)健,我們在此處將判定變量設(shè)置為比較高的值。該值越高,程序?qū)吔缈虻碾S機波動就越魯棒。因此,如果作為車輛的函數(shù)輸出是不動的(靜止的),那么我們需要立即檢查 cache_matrix 中是否有任何先前記錄的條目,如果沒有,我們需要加上當(dāng)前時間(t_start)和車輛類型(class_name)并跟蹤標(biāo)識(str(t))

          if?str((class_name?+?str(t)))?not?in?str(cache_matrix):?#line?310?t_start
          =?datetime.now()
          cache_matrix.append((str(t_start),?class_name?+?str(t)))
          print(cache_matrix)

          之后,我們檢查車輛是否在cache_matrix中。同時還要檢查同一輛車是否也在viol_matrix中。(因為我已經(jīng)將違規(guī)車輛記錄,這些車輛已經(jīng)靜止并超過了時間限制)。如果不是,我們應(yīng)立即檢索該特定車輛的t_start值并使用當(dāng)前時間檢查不同的時間。

          index?=?(str(cache_matrix).find(str((class_name?+?str(t)))))?#line?318
          t_start_cm?=?str(cache_matrix)[index?—?28:index?—?11]
          t_spending?=?(datetime.now()?—?datetime.strptime(t_start_cm,
          ‘%y-%m-%d?%H:%M:%S’)).total_seconds()

          如果時間差 (t_spending) 超過時間限制,那么我們將詳細(xì)信息記錄到電子表格中,其中包括車輛第一次進入時間 (t_start_cm)、車輛類型 (class_name) 和車輛跟蹤 ID (str(t)) . 在這種情況下,出于演示目的,我們將計時器設(shè)置為 10 秒。示例如下

          sheet.write(row_num,?0,?str(t_start_cm),?style)?#line?328
          #?sheet.write(row_num,?1,?str(round(t_spending,?2)),?style)
          sheet.write(row_num,?1,?str(class_name?)?+?str(t),?style)
          row_num?+=?1
          workbook.save('outputs/xlsx/parking/details.xls')

          然后我們必須將這輛特定車輛作為日志條目放入viol_matrix數(shù)組中,因為該車輛現(xiàn)在已經(jīng)違規(guī)了。這避免了進一步的重復(fù)和錯誤的日志條目。然后,我們可以拍攝該違規(guī)車輛的圖像并將其保存為車輛類型,并將跟蹤 ID 作為其名稱。

          viol_matrix.append((str((class_name?+?str(t)))))?#line?334
          #?print(t_start_cm,?t_spending,?datetime.now())
          cropped?=?image.crop((int(bbox[0]),?int?(bbox[1]),?int(bbox[2]),?int(bbox[3])))
          cropped.save(
          'outputs/caps_of_detections/parking/'?+?str(
          class_name)?+?str(t)?+?str('?.jpg'))

          以上基本上是我們設(shè)計的違章停車檢測系統(tǒng)的想法。為避免frame_matrix的內(nèi)存過載,每超過107 個條目使用以下函數(shù)刷新該數(shù)組。

          #Avoid?buffer?overflow?#line?353
          if?len(frame_matrix)>10?:
          frame_matrix
          =[]

          以上就是本文的全部內(nèi)容啦,感興趣的小伙伴們可以操練其來了!

          公眾號后臺回復(fù)“數(shù)據(jù)集”獲取30+深度學(xué)習(xí)數(shù)據(jù)集下載~

          △點擊卡片關(guān)注極市平臺,獲取最新CV干貨
          極市干貨
          數(shù)據(jù)集資源匯總:10個開源工業(yè)檢測數(shù)據(jù)集匯總21個深度學(xué)習(xí)開源數(shù)據(jù)集分類匯總
          算法trick目標(biāo)檢測比賽中的tricks集錦從39個kaggle競賽中總結(jié)出來的圖像分割的Tips和Tricks
          技術(shù)綜述:一文弄懂各種loss function工業(yè)圖像異常檢測最新研究總結(jié)(2019-2020)


          #?CV技術(shù)社群邀請函?#

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart4)

          備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳)


          即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術(shù)交流群


          每月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~


          覺得有用麻煩給個在看啦~??
          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色婷婷在线精品视频 | 色综合天天 | 国内精品综合 | 豆花视频综合 | 草草草视频|