vcs-python-repository/Server/PipeServer/handle_connection.py

90 lines
3.7 KiB
Python
Raw Permalink Normal View History

import cv2
from websocket import create_connection
import win32file
import struct
import numpy as np
from ultralytics import YOLO
# object classes
classNames = ["person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck", "boat",
"traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat",
"dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella",
"handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat",
"baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup",
"fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli",
"carrot", "hot dog", "pizza", "donut", "cake", "chair", "sofa", "pottedplant", "bed",
"diningtable", "toilet", "tvmonitor", "laptop", "mouse", "remote", "keyboard", "cell phone",
"microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors",
"teddy bear", "hair drier", "toothbrush"
]
def handle_connection(pipe):
# Load YOLO model
model = YOLO('yolov8s.pt') # Load an official Detect model
print("Pipe connected!")
try:
while True:
data = win32file.ReadFile(pipe, 640*480*3)[1]
if not data:
return
nparr = np.frombuffer(data, np.uint8).reshape((480, 640, 3))
# frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
frame = cv2.cvtColor(nparr, cv2.COLOR_BGR2RGB)
# Perform object detection
results = model.track(frame, persist=True)
for r in results:
lines = ""
boxes = r.boxes
for box in boxes:
if box.cls[0].item() == 0 and not box.id is None:
# bounding box
id = box.id.int().cpu().tolist()
# x1, y1, x2, y2 = box.xyxy[0]
# # 2.08333 = 1/480 * 1000 or normalize, then save 4 sig-figures and cast to int
# # 1.5625 = 1/640 * 1000 or normalize, then save 4 sig-figures and cast to int
# x1, x2, y1, y2 = int(x1), int(x2), int(y1), int(y2)
# # put box in cam
# cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 255), 3)
# # class name
# cls = int(box.cls[0])
# # object details
# org = [x1, y1]
# org2 = [x1, y1+50]
# font = cv2.FONT_HERSHEY_SIMPLEX
# fontScale = 1
# color = (255, 0, 0)
# color_w = (255, 255, 255)
# thickness = 2
# cv2.putText(frame, classNames[cls], org, font, fontScale, color, thickness)
# cv2.putText(frame, str(id), org2, font, fontScale, color_w, thickness)
x1, y1, x2, y2 = box.xyxyn[0]
x1, y1, x2, y2 = int(x1 * 1000), int(y1 * 1000), int(x2 * 1000), int(y2 * 1000)
lines += f"{id} {x1}:{y1} {x2}:{y2}\n"
# cv2.imshow('Webcam', frame)
# if cv2.waitKey(1) == ord('q'):
# break
ret = lines.encode('utf-8')
length_prefix = struct.pack('I', len(ret))
win32file.WriteFile(pipe, length_prefix+ret)
except Exception as e:
print("Pipe closed with error: " + str(e))
return
# finally:
# cv2.destroyAllWindows()