| | import time |
| | import cv2 |
| | from ultralytics import YOLO |
| | from paho.mqtt import client as mqtt |
| | import json |
| | import random |
| | import threading |
| |
|
| | |
| | class VideoCapture: |
| | def __init__(self, name): |
| | self.cap = cv2.VideoCapture(name) |
| | self.lock = threading.Lock() |
| | self.t = threading.Thread(target=self._reader) |
| | self.t.daemon = True |
| | self.t.start() |
| |
|
| | |
| | def _reader(self): |
| | while True: |
| | with self.lock: |
| | ret = self.cap.grab() |
| | if not ret: |
| | break |
| |
|
| | |
| | def read(self): |
| | print("read"); |
| | with self.lock: |
| | _, frame = self.cap.retrieve() |
| | return frame |
| | |
| |
|
| | |
| | frame_rate = 1 |
| |
|
| | |
| | mqtt_username = "mqtt-user" |
| | mqtt_password = "mqtt-password" |
| |
|
| | broker = 'ip' |
| | port = 1883 |
| | topic = "your_topic/subject" |
| | client_id = f'publish-{random.randint(0, 1000)}' |
| | retain = False |
| | aantal_eieren_detected = 0 |
| |
|
| | |
| | model = YOLO("./best.pt") |
| |
|
| |
|
| | |
| | |
| |
|
| | |
| | |
| |
|
| |
|
| | |
| | url = "rtsp://admin:password@ip:8554/Streaming/Channels/101" |
| | cap = cv2.VideoCapture(url) |
| |
|
| |
|
| | def open_stream(url): |
| | cap = cv2.VideoCapture(url) |
| | return cap |
| |
|
| | def restart_stream_input(): |
| | cap.release() |
| | cap = cv2.VideoCapture(url) |
| |
|
| | mqtt_client = mqtt.Client() |
| | mqtt_client.username_pw_set(mqtt_username, mqtt_password) |
| | mqtt_client.connect(broker, port) |
| | mqtt_client.loop_start() |
| |
|
| | config_payload_json = { |
| | "object_id": client_id, |
| | "name": "kwartel_eieren", |
| | "aantal_eieren": aantal_eieren_detected |
| | } |
| | def make_payload(aantal_eieren_detected): |
| | config_payload_json = { |
| | "object_id": client_id, |
| | "name": "kwartel_eieren", |
| | "aantal_eieren": aantal_eieren_detected |
| | } |
| | config_payload = json.dumps(config_payload_json); |
| | return config_payload; |
| |
|
| | |
| | mqtt_client.publish(topic, json.dumps(config_payload_json), retain=retain, qos=1) |
| | print("Published", aantal_eieren_detected, "eieren detected") |
| |
|
| | |
| | start_time = time.time() |
| | prev_frame_time = start_time |
| |
|
| |
|
| | |
| | while True: |
| | cap = open_stream(url); |
| | |
| | while cap.isOpened(): |
| | |
| | current_time = time.time() |
| | |
| | elapsed_time = current_time - prev_frame_time |
| | |
| | if elapsed_time < 1.0 / frame_rate: |
| | ret, _ = cap.read() |
| | continue |
| | |
| | prev_frame_time = current_time |
| |
|
| | |
| | success, frame = cap.read() |
| |
|
| | if success: |
| | |
| | results = model(frame); |
| |
|
| | |
| | aantal_eieren_detected = len(results[0]); |
| |
|
| | |
| | print(f"Number of detections in frame: {aantal_eieren_detected}"); |
| | payload = make_payload(aantal_eieren_detected); |
| |
|
| | mqtt_client.publish(topic, payload, retain=retain, qos=1); |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | |
| | if cv2.waitKey(1) & 0xFF == ord("q"): |
| | break |
| |
|
| | else: |
| | |
| | print("End of video reached") |
| | break |
| | cap.release() |
| | cv2.destroyAllWindows() |
| | time.sleep(.2); |
| |
|
| | |
| | cap.release() |
| | cv2.destroyAllWindows() |