123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- import asyncio
- import aiohttp
- import time
- import cv2
- from stream import StreamCapture
- from infer import DoorInference
- from logger import logger
- import time
- from datetime import datetime
- def is_time_in_period(start_time_str, end_time_str):
-
- start_time = datetime.strptime(start_time_str, "%H:%M").time()
- end_time = datetime.strptime(end_time_str, "%H:%M").time()
- current_time = datetime.now().time()
-
-
- if start_time <= end_time:
-
- return start_time <= current_time <= end_time
- else:
-
- return current_time >= start_time or current_time <= end_time
- async def upload_image(session, url, payload, files):
- try:
- form_data = aiohttp.FormData()
-
- for key, value in payload.items():
- form_data.add_field(key, value)
-
- for key, (filename, content, content_type) in files:
- form_data.add_field(key, content, filename=filename, content_type=content_type)
-
-
- async with session.post(url, data=form_data) as response:
- result = await response.text()
- logger.info(result)
- except Exception as error:
- logger.error(f'Error: {str(error)}')
- async def process_stream():
- logger.info("====== Start Server =======")
- human_model_path = "models/yolo11m.pt"
- door_model_path = "models/door_classify.pt"
- test_area = [[(222, 59), (432, 3), (528, 96), (318, 198)]]
-
- instance = DoorInference(human_model_path, door_model_path, person_areas=None)
- ip = '172.19.152.231'
- channel = '45'
- stream = StreamCapture(ip, channel)
-
- start_det_time = "06:00"
- end_det_time = "18:00"
- posttime = time.time() - 30
- async with aiohttp.ClientSession() as session:
- while True:
- if not is_time_in_period(start_det_time, end_det_time):
- time.sleep(10)
- continue
- for frame, ret in stream():
- if not is_time_in_period(start_det_time, end_det_time):
- logger.info(f"当前时间不在时间段 {start_det_time} ~ {end_det_time}")
- stream.close()
- break
- if not ret:
- continue
- if time.time() - posttime < 30:
- continue
- image = frame.copy()
- result = instance(image)
- if len(result) > 0:
- try:
- posttime = time.time()
- videoTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
- fileTime = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime())
- filename = fileTime + ".jpg"
- filenameori = fileTime + "det.jpg"
- logger.info(videoTime)
- logger.info(result)
-
- for res in result:
- cv2.rectangle(image, tuple(map(int, (res.left, res.top))),
- tuple(map(int, (res.right, res.bottom))), (255, 0, 0), 4)
-
- success, encoded_image = cv2.imencode('.jpg', image)
- if not success:
- logger.error('imencode image error')
- continue
- content = encoded_image.tobytes()
- successori, encoded_imageori = cv2.imencode('.jpg', frame)
- if not successori:
- logger.error('imencode original image error')
- continue
- contentori = encoded_imageori.tobytes()
-
- payload = {
- 'channel': '45',
- 'classIndex': '8',
- 'ip': '172.19.152.231',
- 'videoTime': videoTime,
- 'videoUrl': stream.stream_url
- }
-
- files = [
- ('file', (filename, content, 'image/jpeg')),
- ('oldFile', (filenameori, contentori, 'image/jpeg'))
- ]
-
-
- await upload_image(session, 'http://172.19.152.231/open/api/operate/upload', payload, files)
- except Exception as error:
- logger.error(f'Error: {str(error)}')
- logger.info("======= EXIT =======")
- if __name__ == "__main__":
- asyncio.run(process_stream())
|