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