
小編今天跟大家推薦的這篇文章是關于停車系統的。停車位問題一直是有車一族最為頭疼的,這篇文章基于python和OpenCV教大家簡單構建一個智能停車系統。
文章來源: 小白學視覺
作者: 努比
當今時代最令人頭疼的事情就是找不到停車位,尤其是找20分鐘還沒有找到停車位。
根據復雜性和效率的不同,任何問題都具有一個或多個解決方案。目前智能停車系統的解決方案,主要包括基于深度學習實現,以及基于重量傳感器、光傳感器實現等。
本期我們將一起通過使用攝像頭和少量代碼來實現最簡單的智能停車系統。該解決方案所使用的概念非常簡單。它由具有以下兩個腳本組成:
1. 選擇停車位的坐標并將其保存到文件中。
2. 從文件中獲取坐標,并確定該點是否可用。
將該解決方案分成兩個腳本的原因是,避免在每次確定是否有可用停車位的時候,就進行停車位的選擇。
為了使這一過程盡可能簡單,從現在開始,我們將這兩個腳本稱為selector和detector。
相關依賴
在本文中,我們使用python 3.7.6,但其他版本(例如3.6或3.8)當然也可以使用。首先我們要檢查python的版本,我們通過在控制臺中編寫python –version,即可返回已安裝的python版本。
C:\Users\Razvan>python --version Python 3.7.6
在開始構建該系統依賴項之前,我們可以設置一個虛擬環境。通過以下鏈接我們可以了解更多有關虛擬環境的信息https://docs.python.org/3.7/tutorial/venv.html。
也可以使用conda創建和管理環境。有關更多信息見https://docs.anaconda.com/anaconda/。
在python中設置完所有內容后, 最重要的依賴關系將是OpenCV庫。通過pip將其添加到虛擬環境中,可以運行pip install opencv-python。
要檢查所有設置是否正確,我們可以使用以下cv2.__version__命令打印環境中可用的當前OpenCV版本。
(OpenCV) C:\Users\Razvan>python Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> print(cv2.__version__) 4.2.0 >>>
在第一行中,我們可以看到在該項目中使用了名為OpenCV的虛擬環境。
步驟
首先,我們需要安裝一個停車場攝像頭。由于我們并沒有一個窗戶可以看到的任何停車場,因此我們選擇使用舊汽車玩具和印刷紙。另外,我在停車場上方設置了一個網絡攝像頭,以獲取良好的圖像,因此我們正在處理的圖像如下所示:
selector選擇器
接下來,我們來介紹編碼部分。首先,我們需要構建選擇器。我們從導入所需模塊開始
import cv2 import csv
之后,我們開始獲取圖像,在該圖像上選擇停車位。為此,我們可以選擇攝網絡攝像頭提供的第一幀,保存并使用該圖像選擇停車位。下面的代碼是這樣的:
1. 打開image變量中的視頻流;suc確定流是否成功打開。
2. 將第一幀寫入frame0.jpg。
3. 流被釋放,所有窗口都關閉。
4. 新保存的圖片將以img變量形式讀取。
VIDEO_SOURCE = 1 cap = cv2.VideoCapture(VIDEO_SOURCE) suc, image = cap.read() cv2.imwrite("frame0.jpg", image) cap.release() cv2.destroyAllWindows() img = cv2.imread("frame0.jpg")
現在,我們已經保存了第一幀并在img變量中將其打開,可以使用selectROIs函數標記停車位。ROI被定義為感興趣的區域,代表圖像的一部分,我們將在其上應用不同的函數以及濾波器來獲取結果。
返回到selectROIs函數,這將返回一個列表(類型:numpy.ndarray),其中包含我們組裝圖像所需的數字及其邊界ROI。
r = cv2.selectROIs('Selector', img, showCrosshair = False, fromCenter = False)
我們的列表將保存在變量r中。賦予cv2.selectROIs函數的參數如下:
1. “選擇器”是允許我們選擇投資回報率的窗口的名稱。
2. img是包含我們要選擇圖像的變量。
3. showCrosshair = Flase刪除選區內部的中心線??梢詫⑵湓O置為True,因為對結果沒有影響。
4. fromCenter = False是一個非常重要的參數,因為如果將其設置為True,則正確的選擇會困難得多。
選擇所有停車位之后,是時候將它們寫入.csv文件了。為此,我們需要將r變量轉換為python列表,可以使用rlist = r.tolist()命令實現。
擁有適當的數據后,我們將其保存到.csv文件中,以備將來使用。
with open('data/rois.csv', 'w', newline='') as outf: csvw = csv.writer(outf) csvw.writerows(rlist)
detector探測器
現在我們已經選擇了停車位,是時候進行一些圖像處理了。解決這個問題的方法如下:
1. 從.csv文件獲取坐標。
2. 從中構建新圖像。
3. 應用OpenCV中可用的Canny函數。
4. 計算新圖像內的白色像素。
5. 建立一個點內的像素范圍將被占用。
6. 在實時供稿上繪制一個紅色或綠色矩形。
對于所有這些操作,我們需要定義一個要應用于每個位置的函數。該函數如下所示:
def drawRectangle(img, a, b, c, d): sub_img = img[b:b + d, a:a + c] edges = cv2.Canny(sub_img, lowThreshold, highThreshold) pix = cv2.countNonZero(edges) if pix in range(min, max): cv2.rectangle(img, (a, b), (a + c, b + d), (0, 255, 0), 3) spots.loc += 1 else: cv2.rectangle(img, (a, b), (a + c, b + d), (0, 0, 255), 3)
現在我們已經實現了所需的功能,如果我們直接將其應用于.csv文件中的每組坐標效果可能并不好。因此我們做如下處理
首先,我們的有一些參數如果可以在腳本運行時(也可以在通過GUI)實時調整它們,那就更好了。為此,我們需要構建一些軌跡欄。OpenCV為我們提供這項功能。
我們需要一個回調函數,該函數不執行任何操作,但作為使用OpenCV創建軌跡欄的參數是必需的。實際上,回調參數具有明確定義的用途,但我們在此不使用它。要了解有關此內容的更多信息,查閱OpenCV文檔。
def callback(foo): pass
現在我們需要創建軌跡欄。我們將使用cv2.namedWindow和cv2.createTrackbar功能。
cv2.namedWindow('parameters') cv2.createTrackbar('Threshold1', 'parameters', 186, 700, callback) cv2.createTrackbar('Threshold2', 'parameters', 122, 700, callback) cv2.createTrackbar('Min pixels', 'parameters', 100, 1500, callback) cv2.createTrackbar('Max pixels', 'parameters', 323, 1500, callback)
現在,我們已經創建了用于操作參數的GUI,只剩下一件事了。這就是圖像中可用斑點的數量。在drawRectangle中定義為spot.loc。這是一個靜態變量,必須在程序開始時進行定義。該變量為靜態變量的原因是,我們希望調用的每個drawRectangle函數都將其寫入相同的全局變量,而不是每個函數都使用一個單獨的變量。這樣可以防止返回的可用空間數量大于實際的可用空間數量。
為了實現這一點,我們只需要使用它的loc靜態變量創建spots類。
class spots: loc = 0
現在我們已經準備就緒,只需要從.csv文件中獲取數據,將其所有數據轉換為整數,然后在無限循環中應用構建的函數即可。
with open('data/rois.csv', 'r', newline='') as inf: csvr = csv.reader(inf) rois = list(csvr) rois = [[int(float(j)) for j in i] for i in rois] VIDEO_SOURCE = 1 cap = cv2.VideoCapture(VIDEO_SOURCE) while True: spots.loc = 0 ret, frame = cap.read() ret2, frame2 = cap.read() min = cv2.getTrackbarPos('Min pixels', 'parameters') max = cv2.getTrackbarPos('Max pixels', 'parameters') lowThreshold = cv2.getTrackbarPos('Threshold1', 'parameters') highThreshold = cv2.getTrackbarPos('Threshold2', 'parameters') for i in range(len(rois)): drawRectangle(frame, rois[i][0], rois[i][1], rois[i][2], rois[i][3]) font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(frame, 'Available spots: ' + str(spots.loc), (10, 30), font, 1, (0, 255, 0), 3) cv2.imshow('Detector', frame) canny = cv2.Canny(frame2, lowThreshold, highThreshold) cv2.imshow('canny', canny) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
拓展
在我們的循環中實際上只是調用的構建函數要復雜一點。
首先,我們將空間的數量初始化為0,以防止每幀添加數字。
其次,我們進入兩個處理流以顯示真實圖像和已處理的圖像。這有助于更好地了解此腳本的工作方式以及圖像的處理方式。
然后,我們需要在每次迭代中獲取我們創建的參數 GUI中的參數值。這是通過cv2.getTrackbarPos功能完成的。
接下來最重要的部分,將drawRectangle函數應用到Selector腳本獲取的所有坐標上。
最后,在結果圖像上寫下可用斑點的數量,顯示Canny函數的結果,顯然,這是一種眾所周知的停止循環的方法。
我們現在便完成了一個智能停車項目!
總結
如今,智能停車已成為熱門話題之一,并且有許多實現方式可以導致良好的功能系統。我們這處理方法并不是完美的,有許多方法可以更好地優化結果,并且可以在更多情況下使用。但是,即使這不能解決停車場危機,也可能是導致危機 的主要原因。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25在當今數字化時代,數據分析師的重要性與日俱增。但許多人在踏上這條職業道路時,往往充滿疑惑: 如何成為一名數據分析師?成為 ...
2025-04-24以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《劉靜:10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda ...
2025-04-23