70 lines
2.0 KiB
Python
70 lines
2.0 KiB
Python
|
||
import cv2
|
||
import numpy as np
|
||
|
||
from config import NUM_CLASSES, CRNN_WEIGHTS_PATH, YOLO_WEIGHTS_PATH
|
||
from license_plate_recognizer import LicensePlateRecognizer
|
||
|
||
# ------------------------------------------------------------
|
||
# Запуск в режиме реального времени (веб-камера)
|
||
# ------------------------------------------------------------
|
||
if __name__ == "__main__":
|
||
lpr = LicensePlateRecognizer(
|
||
yolo_model_path=YOLO_WEIGHTS_PATH,
|
||
crnn_model_path=CRNN_WEIGHTS_PATH,
|
||
num_classes=NUM_CLASSES,
|
||
device="cpu"
|
||
)
|
||
|
||
cap = cv2.VideoCapture(0)
|
||
|
||
# cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
|
||
# cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
|
||
|
||
while True:
|
||
ret, frame = cap.read()
|
||
if not ret:
|
||
print("Не удалось считать кадр с веб-камеры.")
|
||
break
|
||
|
||
detections = lpr.detect_and_recognize_frame(frame, padding=5)
|
||
|
||
for det in detections:
|
||
x1, y1, x2, y2 = det["bbox"]
|
||
text = det["text"]
|
||
|
||
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
|
||
|
||
cv2.putText(
|
||
frame, text, (x1, y1 - 10),
|
||
cv2.FONT_HERSHEY_SIMPLEX,
|
||
0.7, (0, 255, 0), 2
|
||
)
|
||
|
||
height, width, _ = frame.shape
|
||
black_bar_width = 300
|
||
black_bar = np.zeros((height, black_bar_width, 3), dtype=np.uint8)
|
||
|
||
y_start = 40
|
||
for i, det in enumerate(detections):
|
||
txt = det["text"]
|
||
cv2.putText(
|
||
black_bar,
|
||
f"Plate #{i+1}: {txt}",
|
||
(10, y_start),
|
||
cv2.FONT_HERSHEY_SIMPLEX,
|
||
0.7, (255, 255, 255), 2
|
||
)
|
||
y_start += 40
|
||
|
||
display_frame = np.hstack((frame, black_bar))
|
||
|
||
cv2.imshow("License Plate Recognition", display_frame)
|
||
|
||
key = cv2.waitKey(1) & 0xFF
|
||
if key == 27 or key == ord('q'):
|
||
break
|
||
|
||
cap.release()
|
||
cv2.destroyAllWindows()
|