edit : ward_id 적용 (정의된 상수값 사용)

This commit is contained in:
2026-03-04 16:54:28 +09:00
parent 0b446eed54
commit d2a84c1da0
4 changed files with 60 additions and 16 deletions

43
cctv.py
View File

@@ -116,12 +116,14 @@ class CameraStream:
print(f"[{self.name}] 재접속 실패")
def get_frame(self):
"""현재 저장된 가장 최신 프레임을 반환 (타임아웃 체크 포함)"""
"""
현재 저장된 가장 최신 프레임을 반환 (타임아웃 체크 포함)
"""
with self.lock:
# 마지막 수신 후 3초 이상 지났으면 신호 없음(False) 처리
if time.time() - self.last_read_time > 3.0:
return False, None
return self.ret, self.latest_frame
return False, None, self.name
return self.ret, self.latest_frame, self.name
def stop(self):
self.running = False
@@ -153,6 +155,8 @@ def main():
DISPLAY_TURN_ON = CFG.get('display').get('turn_on') # display 출력 여부
SNAPSHOT_SEND = CFG.get('img_snap_shot')
current_cam_index = 0 # 현재 보고 있는 카메라 인덱스
last_switch_time = time.time() # 마지막 전환 시간
switch_interval = SWITCH_INTERVAL # 5초마다 자동 전환
@@ -167,6 +171,10 @@ def main():
fps_sum = 0
fps_count = 0
warmup_frames = 30 # 초반 불안정한 프레임 제외
# pubilsh time check
last_publish_time = None
delay_after_publish = 4.0 # publish 후 n초 동안은 추가 publish 금지, 0일경우 무제한
print("\n=== CCTV 시스템 시작 ===")
print(f"{switch_interval}초마다 자동으로 카메라가 전환됩니다.")
@@ -212,7 +220,7 @@ def main():
# 2. 현재 선택된 카메라의 최신 프레임 가져오기
target_cam = cameras[current_cam_index]
ret, frame = target_cam.get_frame()
ret, frame, name = target_cam.get_frame()
if ret and frame is not None:
# FPS 계산
@@ -248,13 +256,31 @@ def main():
od_message = []
parser.set(msg=hpe_message,img=frame)
parser.set(
msg=hpe_message,
img=frame if SNAPSHOT_SEND else None,
ward_id=name)
parsing_msg = parser.parse()
#mqtt publish
if parsing_msg is not None:
mqtt_publisher.client.publish(MQTT_TOPIC, parsing_msg, qos=1)
#time check
if last_publish_time is None:
last_publish_time = datetime.now()
mqtt_publisher.client.publish(MQTT_TOPIC, parsing_msg, qos=1)
else:
current_time = datetime.now()
time_diff = current_time - last_publish_time
time_diff_seconds = time_diff.total_seconds()
# n초에 한 번만 publish
if time_diff_seconds < delay_after_publish:
pass
else:
last_publish_time = datetime.now()
mqtt_publisher.client.publish(MQTT_TOPIC, parsing_msg, qos=1)
# 탐지 결과 라벨링 (원본 좌표 기준)
if DISPLAY_TURN_ON:
detector.hpe_labeling(frame, hpe_message)
@@ -298,8 +324,7 @@ def main():
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 255), 2, cv2.LINE_AA) # 노란색
cv2.imshow(window_name, frame)
elif DISPLAY_TURN_ON:
# 신호가 없을 때 보여줄 대기 화면
# MONITOR_RESOLUTION은 (width, height)이므로 numpy shape는 (height, width, 3)이어야 함