直接上代码和效果图,因为用了高德的api接口,无法达到实时性
import sys
import argparse
from yolo_xie import YOLO, detect_video
from PIL import Image
import cv2
import os
import time
import numpy as np
from datetime import datetime
import math
import glob
import urllib.request
import urllib
from urllib.parse import urlparse
import cv2
import json
timenow = time.strftime('%Y%m%d_%H%M%S')
import socket
os.environ["CUDA_VISIBLE_DEVICES"] = "3"
# python yolo_video_xie.py --input path
import threading
class RTSCapture(cv2.VideoCapture):
"""Real Time Streaming Capture.
"""
_cur_frame = None
_reading = False
@staticmethod
def create(url):
"""这个类必须使用 RTSCapture.create 方法创建,请不要直接实例化"""
rtscap = RTSCapture(url)
rtscap.frame_receiver = threading.Thread(target=rtscap.recv_frame, daemon=True)
if isinstance(url, str) and url.startswith(("rtsp://", "rtmp://")):
rtscap._reading = True
return rtscap
def isStarted(self):
"""替代 VideoCapture.isOpened() """
ok = self.isOpened()
if ok and self._reading:
ok = self.frame_receiver.is_alive()
return ok
def recv_frame(self):
"""子线程读取最新视频帧方法"""
while self._reading and self.isOpened():
ok, frame = self.read()
if not ok: break
self._cur_frame = frame
self._reading = False
def read2(self):
"""读取最新视频帧
返回结果格式与 VideoCapture.read() 一样
"""
frame = self._cur_frame
self._cur_frame = None
return frame is not None, frame
def start_read(self):
"""启动子线程读取视频帧"""
self.frame_receiver.start()
self.read_latest_frame = self.read2 if self._reading else self.read
def stop_read(self):
"""退出子线程方法"""
self._reading = False