123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #!/usr/bin/env python
- # encoding: utf-8
- """
- # @CreateTime: 2021/7/21 11:08
- # @Author: lxc
- # @LastEditTime:
- # @Desctiption: 上行数据:上传识别图像到云平台
- """
- import time
- import threading
- import json
- import configparser
- import cv2
- import requests
- import LogOut
- from mysqlDataBase import MysqldbOperational
- class MyThread(threading.Thread):
- """
- 连接摄像头的线程
- """
- def __init__(self, camera, bearer_token):
- threading.Thread.__init__(self)
- self._camera_ip = camera[1]
- self._camera_id = camera[2]
- self._token = bearer_token
- self._recognize_rate = camera[4]
- def run(self):
- while True:
- self.recognize_fish()
- def recognize_fish(self):
- """
- 识别是否有鱼
- :return:
- """
- time.sleep(0.2)
- time_standard = "%Y-%m-%d %H:%M:%S"
- try:
- cap = cv2.VideoCapture(self._camera_ip)
- ret, frame = cap.read()
- timing = 0 # 计时 --- 识别是否有鱼
- run_time = 0 # 识别频率
- while True:
- new_time = time.time()
- if new_time - run_time > self._recognize_rate:
- run_time = new_time
- gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 灰度化
- gaus_img = cv2.GaussianBlur(gray_img, (1, 1), 0) # 高斯滤波
- retval, dst = cv2.threshold(gaus_img, 100, 255, cv2.THRESH_BINARY) # 二值化
- # image, contours, hierarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找轮廓 opencv3
- contours, hierarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找轮廓 opencv2
- fish_sign = 1 # 没有鱼
- for contour in contours:
- if cv2.contourArea(contour) > 1800:
- fish_sign = 0 # 发现有鱼
- break
- # 未开始计时且有鱼 ---> 开始计时
- # 已开始计时且无鱼 ---> 计时归0,上传时间戳
- # 已开始计时且时长大于15min ---> 计时归0,上传时间戳
- if timing == 0 and fish_sign == 0:
- timing = time.time()
- elif timing != 0 and (fish_sign == 1 or time.time() - timing > 15*60):
- start_time = time.strftime(time_standard, time.localtime(timing))
- end_time = time.strftime(time_standard, time.localtime(time.time()))
- self.post(start_time, end_time)
- timing = 0
- cap.release()
- except Exception as e:
- _logger.error('%s --- failed --- %s' % (self._camera_ip, e))
- self.run()
- def post(self, begin, end):
- """
- 上传识别到鱼的时间段
- :param begin: 起始时间
- :param end: 结束时间
- :return: 结果
- """
- headers = {
- "Authorization": self._token,
- "Content-Type": "application/json"}
- data = {
- "cameraID": self._camera_id,
- "dateStart": begin,
- "dateEnd": end}
- _logger.info("headers=%s" % (headers))
- _logger.info("data=%s" % (json.dumps(data)))
- requests.urllib3.disable_warnings()
- url = "https://management.super-sight.com.cn:8000/system/api/v1/videoReceive/receiveVideo"
- ret = requests.post(url=url, headers=headers, data=json.dumps(data), verify=False)
- if ret.status_code == 200:
- print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ret.text, ret.status_code, " dateStart=", begin, "dateEnd=", end)
- _logger.info("ret.text=%s" % (ret.text))
- _logger.info("ret.status_code=%s" % (ret.status_code))
- else:
- print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ret.text, ret.status_code)
- _logger.error("ret.text=%s" % (ret.text))
- _logger.error("ret.status_code=%s" % (ret.status_code))
- if __name__ == '__main__':
- time.sleep(1)
- _logger = LogOut.Log('identify_fish')
- # 创建读取配置文件对象
- config = configparser.ConfigParser()
- config.read("config.ini", encoding="utf-8")
- # 获取通用配置项
- mysql_host = config.get("General", 'mysqlHost')
- mysql_username = config.get("General", 'mysqlUsername')
- mysql_password = config.get("General", 'mysqlPassword')
- mysql_port = config.get("General", 'mysqlPort')
- token = config.get("General", 'token')
- # 获取特有配置项
- mysql_database = config.get("CPrecognizefish", 'mysqlDatabase')
- camera_sql = MysqldbOperational(host=mysql_host,
- username=mysql_username,
- password=mysql_password,
- port=int(mysql_port),
- database=mysql_database,
- logger=_logger)
- fields = ["camera_name", "camera_ip", "camera_id", "identify_fish", "recognize_rate"]
- camera_info = camera_sql.select("camera_configuration_table", fields=fields)
- for each in camera_info:
- # 只识别 水下视频
- if each[3] == 0:
- t = MyThread(each, token)
- t.start()
- time.sleep(5)
|