identify_fish.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. """
  4. # @CreateTime: 2021/7/21 11:08
  5. # @Author: lxc
  6. # @LastEditTime:
  7. # @Desctiption: 上行数据:上传识别图像到云平台
  8. """
  9. import time
  10. import threading
  11. import json
  12. import configparser
  13. import cv2
  14. import requests
  15. import LogOut
  16. from mysqlDataBase import MysqldbOperational
  17. class MyThread(threading.Thread):
  18. """
  19. 连接摄像头的线程
  20. """
  21. def __init__(self, camera, bearer_token):
  22. threading.Thread.__init__(self)
  23. self._camera_ip = camera[1]
  24. self._camera_id = camera[2]
  25. self._token = bearer_token
  26. self._recognize_rate = camera[4]
  27. def run(self):
  28. while True:
  29. self.recognize_fish()
  30. def recognize_fish(self):
  31. """
  32. 识别是否有鱼
  33. :return:
  34. """
  35. time.sleep(0.2)
  36. time_standard = "%Y-%m-%d %H:%M:%S"
  37. try:
  38. cap = cv2.VideoCapture(self._camera_ip)
  39. ret, frame = cap.read()
  40. timing = 0 # 计时 --- 识别是否有鱼
  41. run_time = 0 # 识别频率
  42. while True:
  43. new_time = time.time()
  44. if new_time - run_time > self._recognize_rate:
  45. run_time = new_time
  46. gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 灰度化
  47. gaus_img = cv2.GaussianBlur(gray_img, (1, 1), 0) # 高斯滤波
  48. retval, dst = cv2.threshold(gaus_img, 100, 255, cv2.THRESH_BINARY) # 二值化
  49. # image, contours, hierarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找轮廓 opencv3
  50. contours, hierarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找轮廓 opencv2
  51. fish_sign = 1 # 没有鱼
  52. for contour in contours:
  53. if cv2.contourArea(contour) > 1800:
  54. fish_sign = 0 # 发现有鱼
  55. break
  56. # 未开始计时且有鱼 ---> 开始计时
  57. # 已开始计时且无鱼 ---> 计时归0,上传时间戳
  58. # 已开始计时且时长大于15min ---> 计时归0,上传时间戳
  59. if timing == 0 and fish_sign == 0:
  60. timing = time.time()
  61. elif timing != 0 and (fish_sign == 1 or time.time() - timing > 15*60):
  62. start_time = time.strftime(time_standard, time.localtime(timing))
  63. end_time = time.strftime(time_standard, time.localtime(time.time()))
  64. self.post(start_time, end_time)
  65. timing = 0
  66. cap.release()
  67. except Exception as e:
  68. _logger.error('%s --- failed --- %s' % (self._camera_ip, e))
  69. self.run()
  70. def post(self, begin, end):
  71. """
  72. 上传识别到鱼的时间段
  73. :param begin: 起始时间
  74. :param end: 结束时间
  75. :return: 结果
  76. """
  77. headers = {
  78. "Authorization": self._token,
  79. "Content-Type": "application/json"}
  80. data = {
  81. "cameraID": self._camera_id,
  82. "dateStart": begin,
  83. "dateEnd": end}
  84. _logger.info("headers=%s" % (headers))
  85. _logger.info("data=%s" % (json.dumps(data)))
  86. requests.urllib3.disable_warnings()
  87. url = "https://management.super-sight.com.cn:8000/system/api/v1/videoReceive/receiveVideo"
  88. ret = requests.post(url=url, headers=headers, data=json.dumps(data), verify=False)
  89. if ret.status_code == 200:
  90. print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ret.text, ret.status_code, " dateStart=", begin, "dateEnd=", end)
  91. _logger.info("ret.text=%s" % (ret.text))
  92. _logger.info("ret.status_code=%s" % (ret.status_code))
  93. else:
  94. print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ret.text, ret.status_code)
  95. _logger.error("ret.text=%s" % (ret.text))
  96. _logger.error("ret.status_code=%s" % (ret.status_code))
  97. if __name__ == '__main__':
  98. time.sleep(1)
  99. _logger = LogOut.Log('identify_fish')
  100. # 创建读取配置文件对象
  101. config = configparser.ConfigParser()
  102. config.read("config.ini", encoding="utf-8")
  103. # 获取通用配置项
  104. mysql_host = config.get("General", 'mysqlHost')
  105. mysql_username = config.get("General", 'mysqlUsername')
  106. mysql_password = config.get("General", 'mysqlPassword')
  107. mysql_port = config.get("General", 'mysqlPort')
  108. token = config.get("General", 'token')
  109. # 获取特有配置项
  110. mysql_database = config.get("CPrecognizefish", 'mysqlDatabase')
  111. camera_sql = MysqldbOperational(host=mysql_host,
  112. username=mysql_username,
  113. password=mysql_password,
  114. port=int(mysql_port),
  115. database=mysql_database,
  116. logger=_logger)
  117. fields = ["camera_name", "camera_ip", "camera_id", "identify_fish", "recognize_rate"]
  118. camera_info = camera_sql.select("camera_configuration_table", fields=fields)
  119. for each in camera_info:
  120. # 只识别 水下视频
  121. if each[3] == 0:
  122. t = MyThread(each, token)
  123. t.start()
  124. time.sleep(5)