Files
cv_state_ana/reproject/test.py

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()