97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
import cv2
|
|
import threading
|
|
import time
|
|
import queue
|
|
import socket
|
|
import json
|
|
import urllib.request
|
|
import struct
|
|
import mediapipe as mp
|
|
import numpy as np
|
|
from analyzer import MonitorSystem
|
|
|
|
mp_face_mesh = mp.solutions.face_mesh
|
|
face_mesh = mp_face_mesh.FaceMesh(
|
|
max_num_faces=1,
|
|
refine_landmarks=True,
|
|
min_detection_confidence=0.5,
|
|
min_tracking_confidence=0.5
|
|
)
|
|
|
|
def apply_soft_roi(frame):
|
|
h, w = frame.shape[:2]
|
|
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
|
|
black_bg = np.zeros((h, w, 3), dtype=np.uint8)
|
|
results = face_mesh.process(rgb_frame)
|
|
if not results.multi_face_landmarks:
|
|
return frame
|
|
landmarks = results.multi_face_landmarks[0].landmark
|
|
xs = [l.x for l in landmarks]
|
|
ys = [l.y for l in landmarks]
|
|
# 计算人脸框
|
|
face_loc = (
|
|
int(min(ys) * h - 0.1 * h), int(max(xs) * w + 0.1 * w),
|
|
int(max(ys) * h + 0.1 * h), int(min(xs) * w - 0.1 * w)
|
|
)
|
|
pad = 30
|
|
face_loc = (max(0, face_loc[0]-pad), min(w, face_loc[1]+pad),
|
|
min(h, face_loc[2]+pad), max(0, face_loc[3]-pad))
|
|
top = face_loc[0]
|
|
right = face_loc[1]
|
|
bottom = face_loc[2]
|
|
left = face_loc[3]
|
|
scale_factor = 10
|
|
small_bg = cv2.resize(frame, (w // scale_factor, h // scale_factor), interpolation=cv2.INTER_LINEAR)
|
|
# 使用 INTER_NEAREST 马赛克效果
|
|
# 使用 INTER_LINEAR 毛玻璃模糊效果
|
|
blurred_frame = cv2.resize(small_bg, (w, h), interpolation=cv2.INTER_LINEAR)
|
|
|
|
face_roi = frame[top:bottom, left:right]
|
|
|
|
blurred_frame[top:bottom, left:right] = face_roi
|
|
black_bg[top:bottom, left:right] = face_roi
|
|
|
|
return blurred_frame
|
|
|
|
def test_compression_efficiency():
|
|
# 1. 读取一张测试图 (或者用摄像头抓一帧)
|
|
cap = cv2.VideoCapture(0)
|
|
time.sleep(5) # 等待摄像头稳定
|
|
while True:
|
|
ret, frame = cap.read()
|
|
cap.release()
|
|
|
|
if not ret:
|
|
print("无法读取摄像头")
|
|
return
|
|
|
|
# 2. 生成模糊处理后的图
|
|
processed_frame = apply_soft_roi(frame) # 使用你的函数
|
|
|
|
# 3. 【关键】模拟网络传输/存储:进行 JPG 编码
|
|
# 这里的 80 代表 JPEG 质量,模拟视频编码过程
|
|
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 80]
|
|
|
|
# 编码原图
|
|
_, encoded_original = cv2.imencode('.jpg', frame, encode_param)
|
|
original_size = len(encoded_original)
|
|
|
|
# 编码处理后的图
|
|
_, encoded_processed = cv2.imencode('.jpg', processed_frame, encode_param)
|
|
processed_size = len(encoded_processed)
|
|
|
|
# 4. 对比结果
|
|
print(f"原始画面编码后大小: {original_size / 1024:.2f} KB")
|
|
print(f"ROI处理编码后大小: {processed_size / 1024:.2f} KB")
|
|
|
|
savings = (original_size - processed_size) / original_size * 100
|
|
print(f"📉 带宽/存储节省了: {savings:.2f}%")
|
|
|
|
# 可视化对比
|
|
cv2.imshow("Original", frame)
|
|
cv2.imshow("Processed (Bandwidth Saver)", processed_frame)
|
|
|
|
|
|
# 运行测试
|
|
# 注意:你需要先定义 face_mesh 和 apply_soft_roi 才能运行
|
|
test_compression_efficiency() |