WARNING ⚠️ Unable to automatically guess model task, assuming ‘task=detect’. Explicitly define task for your model, i.e. ‘task=detectt’, ‘segment’, ‘classify’,’pose’ or ‘obb’.
[http @ 00000265b0ce1a80] Stream ends prematurely at 40818, should be 18446744073709551615
[http @ 00000265b0ce1a80] Stream ends prematurely at 40818, should be 18446744073709551615
Code:
import cv2
import numpy as np
from ultralytics import YOLO
from sort.sort import Sort
from util import read_license_plate
import streamlit as st
import pandas as pd
import io
class LicensePlateDetector:
def init(self, model_path):
self.model = YOLO(model_path)
def detect(self, frame):
return self.model(frame)[0]
class LicensePlateProcessor:
@staticmethod
def process(license_plate_crop):
if license_plate_crop.size == 0:
return None
license_plate_crop_gray = cv2.cvtColor(license_plate_crop, cv2.COLOR_BGR2GRAY)
_, license_plate_crop_thresh = cv2.threshold(
license_plate_crop_gray, 125, 255, cv2.THRESH_BINARY_INV
)
return license_plate_crop_thresh
@staticmethod
def read(license_plate_crop_thresh):
if license_plate_crop_thresh is None or license_plate_crop_thresh.size == 0:
return None, 0
return read_license_plate(license_plate_crop_thresh)
def main():
st.title(“Live Stream License Plate Detection”)
video_url = st.text_input("Enter video stream URL (http/rtsp):")
if video_url:
license_plate_detector = LicensePlateDetector(
""
)
license_plate_processor = LicensePlateProcessor()
cap = cv2.VideoCapture(video_url)
if not cap.isOpened():
st.error("Error opening video stream.")
return
while True:
ret, frame = cap.read()
if not ret:
st.error("Error reading frame.")
break
# Process frame
license_plates = license_plate_detector.detect(frame)
for license_plate in license_plates.boxes.data.tolist():
x1, y1, x2, y2, score, class_id = license_plate
license_plate_crop = frame[int(y1) : int(y2), int(x1) : int(x2), :]
license_plate_crop_thresh = license_plate_processor.process(
license_plate_crop
)
license_plate_text, license_plate_text_score = (
license_plate_processor.read(license_plate_crop_thresh)
)
if license_plate_text is not None:
# Draw bounding box on frame
cv2.rectangle(
frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2
)
cv2.putText(
frame,
license_plate_text,
(int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX,
0.9,
(36, 255, 12),
2,
)
# Display result
st.image(frame, channels="BGR", use_column_width=True)
cap.release()
if name == “main“:
main()
DEV NAYEE is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.