face_reg_docker/test_detect_face.py

127 lines
4.5 KiB
Python

import requests
import cv2
import numpy as np
import os
import json
import argparse
import sys
# 配置服务地址
PYTHON_ALGO_URL = "http://192.168.0.37:18000"
def get_default_image_path():
"""获取一个默认存在的测试图片路径"""
# 尝试找一个存在的真实图片
potential_paths = [
r"C:\Users\24830\Desktop\人脸.jpg",
]
for path in potential_paths:
if os.path.exists(path):
return path
return None
def detect_and_draw(image_path, expand_scale=0.0):
url = f"{PYTHON_ALGO_URL}/api/detect_face"
print(f"\n[Processing] Image: {image_path}")
print(f"[API URL] {url}")
print(f"[Expand Scale] {expand_scale}")
if not os.path.exists(image_path):
print(f"❌ Error: Image file not found: {image_path}")
return
try:
# 1. 准备发送请求
# 读取图片用于显示/画框
img_array = np.fromfile(image_path, dtype=np.uint8)
original_img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
if original_img is None:
print(f"❌ Error: Failed to read image using opencv: {image_path}")
return
# 2. 调用API
data = {'expand_scale': expand_scale}
with open(image_path, 'rb') as f:
files = {'image': f}
# 注意: 使用 data=data 发送表单数据,而不是 params=params (查询参数)
response = requests.post(url, files=files, data=data, timeout=10)
if response.status_code != 200:
print(f"❌ Failed: Status {response.status_code}, Response: {response.text}")
return
result = response.json()
print("\n=== API Response ===")
print(json.dumps(result, indent=2))
# 3. 处理结果并画图
if result.get('success'):
faces = result.get('faces', [])
count = len(faces)
print(f"\n✅ Success: Detected {count} faces.")
# 创建副本用于画图
draw_img = original_img.copy()
for i, face in enumerate(faces):
x1 = int(face['x1'])
y1 = int(face['y1'])
x2 = int(face['x2'])
y2 = int(face['y2'])
score = face['score']
# 画矩形框
# 颜色 (B, G, R) - 绿色
color = (0, 255, 0)
thickness = 2
cv2.rectangle(draw_img, (x1, y1), (x2, y2), color, thickness)
# 写文字
label = f"Face {i+1}: {score:.2f}"
cv2.putText(draw_img, label, (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
print(f" - Face {i+1}: Box({x1}, {y1}, {x2}, {y2}), Score: {score:.4f}")
# 保存裁剪的人脸图观察效果
face_crop = original_img[y1:y2, x1:x2]
if face_crop.size > 0:
crop_filename = f"face_crop_{i+1}_scale_{expand_scale}.jpg"
cv2.imencode('.jpg', face_crop)[1].tofile(crop_filename)
print(f" Saved crop: {crop_filename}")
# 4. 保存结果图
output_filename = f"result_detected_scale_{expand_scale}.jpg"
cv2.imencode('.jpg', draw_img)[1].tofile(output_filename)
print(f"\n✅ Result image saved to: {os.path.abspath(output_filename)}")
else:
print(f"⚠️ API logic returned failure: {result.get('message')}")
except Exception as e:
print(f"❌ Error: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Face Detection API Test Script')
parser.add_argument('image_path', nargs='?', help='Path to the image file')
parser.add_argument('--scale', type=float, default=0.6, help='Expand scale (default: 0.0)')
args = parser.parse_args()
target_path = args.image_path
if not target_path:
default_path = get_default_image_path()
if default_path:
print(f"No image path provided, using default found: {default_path}")
target_path = default_path
else:
print("Usage: python test_detect_face.py <path_to_image> [--scale 0.3]")
print("Error: No image path provided and no default test image found.")
sys.exit(1)
detect_and_draw(target_path, args.scale)