main.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import asyncio
  2. import aiohttp
  3. import time
  4. import cv2
  5. from stream import StreamCapture
  6. from infer import DoorInference
  7. from logger import logger
  8. import time
  9. from datetime import datetime
  10. def is_time_in_period(start_time_str, end_time_str):
  11. # 解析开始和结束时间字符串为time对象
  12. start_time = datetime.strptime(start_time_str, "%H:%M").time()
  13. end_time = datetime.strptime(end_time_str, "%H:%M").time()
  14. current_time = datetime.now().time()
  15. # 判断时间段是否跨天
  16. if start_time <= end_time:
  17. # 时间段在同一天
  18. return start_time <= current_time <= end_time
  19. else:
  20. # 时间段跨天(如22:00到次日02:00)
  21. return current_time >= start_time or current_time <= end_time
  22. async def upload_image(session, url, payload, files):
  23. try:
  24. form_data = aiohttp.FormData()
  25. # 添加普通表单数据
  26. for key, value in payload.items():
  27. form_data.add_field(key, value)
  28. # 添加文件数据
  29. for key, (filename, content, content_type) in files:
  30. form_data.add_field(key, content, filename=filename, content_type=content_type)
  31. # 发起 POST 请求
  32. async with session.post(url, data=form_data) as response:
  33. result = await response.text()
  34. logger.info(result)
  35. except Exception as error:
  36. logger.error(f'Error: {str(error)}')
  37. async def process_stream():
  38. logger.info("====== Start Server =======")
  39. human_model_path = "models/yolo11m.pt"
  40. door_model_path = "models/door_classify.pt"
  41. test_area = [[(222, 59), (432, 3), (528, 96), (318, 198)]]
  42. instance = DoorInference(human_model_path, door_model_path, person_areas=None)
  43. ip = '172.19.152.231'
  44. channel = '45'
  45. stream = StreamCapture(ip, channel)
  46. start_det_time = "06:00"
  47. end_det_time = "18:00"
  48. posttime = time.time() - 30
  49. async with aiohttp.ClientSession() as session:
  50. while True:
  51. if not is_time_in_period(start_det_time, end_det_time):
  52. time.sleep(10)
  53. continue
  54. for frame, ret in stream():
  55. if not is_time_in_period(start_det_time, end_det_time):
  56. logger.info(f"当前时间不在时间段 {start_det_time} ~ {end_det_time}")
  57. stream.close()
  58. break
  59. if not ret:
  60. continue
  61. if time.time() - posttime < 30:
  62. continue
  63. image = frame.copy()
  64. result = instance(image)
  65. if len(result) > 0:
  66. try:
  67. posttime = time.time()
  68. videoTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
  69. fileTime = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime())
  70. filename = fileTime + ".jpg"
  71. filenameori = fileTime + "det.jpg"
  72. logger.info(videoTime)
  73. logger.info(result)
  74. for res in result:
  75. cv2.rectangle(image, tuple(map(int, (res.left, res.top))),
  76. tuple(map(int, (res.right, res.bottom))), (255, 0, 0), 4)
  77. success, encoded_image = cv2.imencode('.jpg', image)
  78. if not success:
  79. logger.error('imencode image error')
  80. continue
  81. content = encoded_image.tobytes()
  82. successori, encoded_imageori = cv2.imencode('.jpg', frame)
  83. if not successori:
  84. logger.error('imencode original image error')
  85. continue
  86. contentori = encoded_imageori.tobytes()
  87. payload = {
  88. 'channel': '45',
  89. 'classIndex': '8',
  90. 'ip': '172.19.152.231',
  91. 'videoTime': videoTime,
  92. 'videoUrl': stream.stream_url
  93. }
  94. files = [
  95. ('file', (filename, content, 'image/jpeg')),
  96. ('oldFile', (filenameori, contentori, 'image/jpeg'))
  97. ]
  98. # 使用协程上传图像
  99. await upload_image(session, 'http://172.19.152.231/open/api/operate/upload', payload, files)
  100. except Exception as error:
  101. logger.error(f'Error: {str(error)}')
  102. logger.info("======= EXIT =======")
  103. if __name__ == "__main__":
  104. asyncio.run(process_stream())