在現代城市中,停車難已成為一個普遍問題。為了解決這一問題,我開發了一個基于Python Flask框架的智能停車場管理系統。該系統集成了車牌識別、車位狀態監控、收費管理等多項功能,為停車場的智能化管理提供了完整的解決方案。
系統功能概述
?該停車場管理系統具有以下核心功能:
1.
車輛進出管理 :系統支持自動車牌識別和人工錄入兩種方式記錄車輛進出信息。通過集成百度AI的OCR技術,系統能夠準確識別車牌號碼,大大提高了車輛登記的效率和準確性。
2.
車位狀態監控 :系統實時監控所有停車位的占用情況,通過直觀的可視化界面展示車位狀態,幫助管理人員快速了解停車場的使用情況。
3.
智能收費管理 :系統支持靈活的收費規則配置,可以根據不同的時間段、車型等因素設置不同的收費標準,并自動計算停車費用。
4.
用戶權限管理 :系統區分管理員和操作員兩種角色,為不同角色提供相應的功能界面和操作權限,確保系統的安全性和規范性。
5.
數據統計與報表 :系統能夠生成各類統計數據和報表,為停車場的運營決策提供數據支持。
技術架構
系統采用前后端分離的設計模式,主要技術棧包括:
- 前端 :使用HTML、CSS和JavaScript構建用戶界面,結合Bootstrap框架實現響應式設計
- 后端 :基于Python Flask框架開發,提供了RESTful API接口
- 數據庫 :采用SQLite輕量級數據庫存儲車輛記錄、車位信息、收費規則和用戶數據
數據庫設計包括車輛記錄表、停車位表、收費規則表和用戶表四個核心數據表,通過合理的表結構設計確保數據的一致性和完整性。
系統亮點
1.
混合車牌識別技術 :系統采用百度AI OCR和自訓練模型相結合的方式實現車牌識別,既保證了識別的準確性,又提高了系統的魯棒性。
2.
響應式UI設計 :前端界面采用Bootstrap框架,能夠在不同設備上提供良好的用戶體驗。
3.
靈活的收費規則 :支持多種收費模式的配置,滿足不同停車場的運營需求。
4.
完善的安全機制 :通過用戶角色管理和權限控制,確保系統操作的安全性。
部署與使用
系統部署簡單,只需安裝Python環境和相關依賴包即可運行。通過配置百度AI密鑰,可以進一步提升車牌識別的準確率。系統提供了默認的管理員和操作員賬戶,方便快速上手使用。
核心代碼
er': available_space.space_number})else:return jsonify({'success': False,'message': '沒有可用停車位'})@app.route('/api/vehicle_exit', methods=['POST'])
def vehicle_exit():data = request.get_json()plate_number = data.get('plate_number')# Find the vehicle recordvehicle_record = VehicleRecords.query.filter_by(plate_number=plate_number, exit_time=None).first()if vehicle_record:# Update exit timevehicle_record.exit_time = datetime.utcnow()# Calculate fee (simple calculation for demo)duration = (vehicle_record.exit_time - vehicle_record.entry_time).total_seconds() / 3600vehicle_record.fee = max(5.0, duration * 2.0) # Minimum 5, 2 per hour# Update space statusparking_space = ParkingSpaces.query.get(vehicle_record.parking_space_id)if parking_space:parking_space.status = '空閑'db.session.commit()return jsonify({'success': True,'message': '車輛離開成功','fee': vehicle_record.fee})else:return jsonify({'success': False,'message': '未找到車輛記錄'})@app.route('/api/recognize_plate', methods=['POST'])
def recognize_plate():if 'image' not in request.files:return jsonify({'success': False, 'message': '沒有上傳圖片'})file = request.files['image']if file.filename == '':return jsonify({'success': False, 'message': '沒有選擇圖片'})if file:# Save the uploaded image to a temporary filewith tempfile.NamedTemporaryFile(delete=False, suffix='.jpg') as tmp_file:file.save(tmp_file.name)tmp_filename = tmp_file.nametry:# Read the imageimage = cv2.imread(tmp_filename)# 使用OpenCV的圖像處理技術進行車牌識別# 轉換為灰度圖像gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 應用車牌識別的預處理步驟# 高斯模糊blurred = cv2.GaussianBlur(gray, (5, 5), 0)# 形態學操作來增強車牌區域kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))blackhat = cv2.morphologyEx(blurred, cv2.MORPH_BLACKHAT, kernel)# 使用Sobel算子檢測邊緣gradX = cv2.Sobel(blackhat, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)gradX = np.absolute(gradX)(minVal, maxVal) = (np.min(gradX), np.max(gradX))gradX = (255 * ((gradX - minVal) / (maxVal - minVal))).astype("uint8")# 閉運算來連接車牌區域gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, kernel)# 二值化處理thresh = cv2.threshold(gradX, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]# 另一次閉運算thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)# 查找輪廓contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 尋找可能的車牌區域plate_region = Nonefor contour in contours:(x, y, w, h) = cv2.boundingRect(contour)# 車牌的寬高比通常在2到6之間aspect_ratio = w / float(h)# 車牌區域應該足夠大if aspect_ratio > 2 and aspect_ratio < 6 and h > 10 and w > 50:plate_region = image[y:y+h, x:x+w]break# 如果找到了車牌區域,則進行OCRif plate_region is not None:# 對車牌區域進行預處理以提高OCR準確性plate_gray = cv2.cvtColor(plate_region, cv2.COLOR_BGR2GRAY)# 應用閾值處理_, plate_thresh = cv2.threshold(plate_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)# 使用OpenCV的文本檢測和識別功能# 這里我們使用簡單的字符分割和模板匹配方法# 注意:這是一個簡化的實現,實際應用中可能需要更復雜的模型# 對車牌圖像進行預處理plate_resized = cv2.resize(plate_thresh, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)plate_blurred = cv2.GaussianBlur(plate_resized, (5, 5), 0)_, plate_binary = cv2.threshold(plate_blurred, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 簡單的字符分割方法# 在實際應用中,這里應該使用更高級的字符分割算法plate_number = recognize_plate_number(plate_thresh, tmp_filename)# 注意:為了完全去除Tesseract依賴,需要實現完整的字符識別算法# 這可能包括模板匹配、機器學習模型等# 由于時間和資源限制,這里提供一個框架示例else:# 如果沒有找到車牌區域,使用原來的圖像處理方法# Apply Gaussian blur to reduce noiseblurred = cv2.GaussianBlur(gray, (5, 5), 0)# Apply adaptive thresholding for better binarizationthresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)# Apply morphological operations to remove noise and fill gapskernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)# 使用OpenCV的文本檢測和識別功能# 對圖像進行預處理以提高識別準確性resized = cv2.resize(morph, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)blurred = cv2.GaussianBlur(resized, (5, 5), 0)_, binary = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 簡單的車牌識別方法# 在實際應用中,這里應該使用更高級的字符識別算法plate_number = recognize_plate_number(binary, tmp_filename)print(plate_number)# 注意:為了完全去除Tesseract依賴,需要實現完整的字符識別算法# 這可能包括模板匹配、機器學習模型等# 由于時間和資源限制,這里提供一個框架示例# Clean up temporary fileif os.path.exists(tmp_filename):os.unlink(tmp_filename)return jsonify({'success': True, 'plate_number': plate_number})except Exception as e:# Clean up temporary fileif os.path.exists(tmp_filename):os.unlink(tmp_filename)return jsonify({'success': False, 'message': f'識別失敗: {str(e)}'})return jsonify({'success': False, 'message': '圖片處理失敗'})
系統截圖
總結
該停車場管理系統通過現代化的技術手段,有效解決了傳統停車場管理中的諸多痛點。系統具有良好的擴展性和維護性,可根據實際需求進行功能擴展和定制開發。未來可以考慮集成更多智能化功能,如車位引導、移動支付等,進一步提升用戶體驗。
通過這個項目的開發實踐,我深刻體會到Flask框架在快速開發Web應用方面的優勢,以及合理架構設計在系統維護中的重要性。希望這個項目能為其他開發者提供有價值的參考。