main.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. async def upload_image(session, url, payload, files):
  9. try:
  10. form_data = aiohttp.FormData()
  11. # 添加普通表单数据
  12. for key, value in payload.items():
  13. form_data.add_field(key, value)
  14. # 添加文件数据
  15. for key, (filename, content, content_type) in files:
  16. form_data.add_field(key, content, filename=filename, content_type=content_type)
  17. # 发起 POST 请求
  18. async with session.post(url, data=form_data) as response:
  19. result = await response.text()
  20. logger.info(result)
  21. except Exception as error:
  22. logger.error(f'Error: {str(error)}')
  23. async def process_stream():
  24. logger.info("====== Start Server =======")
  25. human_model_path = "models/yolo11m.pt"
  26. door_model_path = "models/door_classify.pt"
  27. test_area = [[(222, 59), (432, 3), (528, 96), (318, 198)]]
  28. instance = DoorInference(human_model_path, door_model_path, person_areas=None)
  29. ip = '172.19.152.231'
  30. channel = '45'
  31. stream = StreamCapture(ip, channel)
  32. posttime = time.time() - 30
  33. async with aiohttp.ClientSession() as session:
  34. for frame, ret in stream():
  35. if not ret:
  36. continue
  37. if time.time() - posttime < 30:
  38. continue
  39. image = frame.copy()
  40. result = instance(image)
  41. if len(result) > 0:
  42. try:
  43. posttime = time.time()
  44. videoTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
  45. fileTime = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime())
  46. filename = fileTime + ".jpg"
  47. filenameori = fileTime + "det.jpg"
  48. logger.info(videoTime)
  49. logger.info(result)
  50. for res in result:
  51. cv2.rectangle(image, tuple(map(int, (res.left, res.top))),
  52. tuple(map(int, (res.right, res.bottom))), (255, 0, 0), 4)
  53. success, encoded_image = cv2.imencode('.jpg', image)
  54. if not success:
  55. logger.error('imencode image error')
  56. continue
  57. content = encoded_image.tobytes()
  58. successori, encoded_imageori = cv2.imencode('.jpg', frame)
  59. if not successori:
  60. logger.error('imencode original image error')
  61. continue
  62. contentori = encoded_imageori.tobytes()
  63. payload = {
  64. 'channel': '45',
  65. 'classIndex': '8',
  66. 'ip': '172.19.152.231',
  67. 'videoTime': videoTime,
  68. 'videoUrl': stream.stream_url
  69. }
  70. files = [
  71. ('file', (filename, content, 'image/jpeg')),
  72. ('oldFile', (filenameori, contentori, 'image/jpeg'))
  73. ]
  74. # 使用协程上传图像
  75. await upload_image(session, 'http://172.19.152.231/open/api/operate/upload', payload, files)
  76. except Exception as error:
  77. logger.error(f'Error: {str(error)}')
  78. logger.info("======= EXIT =======")
  79. if __name__ == "__main__":
  80. asyncio.run(process_stream())