|
|
|
|
|
""" |
|
|
演示可视化API功能的示例脚本 |
|
|
展示如何获取绘制了关键点和骨架的图像 |
|
|
""" |
|
|
|
|
|
import requests |
|
|
import base64 |
|
|
import json |
|
|
import cv2 |
|
|
import numpy as np |
|
|
import time |
|
|
|
|
|
def demo_api_usage(): |
|
|
"""演示API使用方法""" |
|
|
|
|
|
print("🎯 单鼠姿态检测可视化API演示") |
|
|
print("=" * 50) |
|
|
|
|
|
|
|
|
|
|
|
image_path = "test_mouse.jpg" |
|
|
|
|
|
if not cv2.imread(image_path) is not None: |
|
|
print("❌ 找不到测试图像,请确保test_mouse.jpg存在") |
|
|
return |
|
|
|
|
|
|
|
|
with open(image_path, "rb") as image_file: |
|
|
image_base64 = base64.b64encode(image_file.read()).decode('utf-8') |
|
|
|
|
|
|
|
|
request_data = { |
|
|
"image": image_base64, |
|
|
"conf_threshold": 0.3, |
|
|
"frame_id": 1, |
|
|
"timestamp": 1641234567.123, |
|
|
"return_image": True, |
|
|
"draw_bbox": False |
|
|
} |
|
|
|
|
|
print("📤 发送API请求...") |
|
|
print(f"请求参数: conf_threshold={request_data['conf_threshold']}") |
|
|
print(f" return_image={request_data['return_image']}") |
|
|
print(f" draw_bbox={request_data['draw_bbox']}") |
|
|
|
|
|
|
|
|
api_url = "http://localhost:8765/api/process_frame" |
|
|
|
|
|
try: |
|
|
start_time = time.time() |
|
|
response = requests.post(api_url, json=request_data) |
|
|
request_time = time.time() - start_time |
|
|
|
|
|
if response.status_code == 200: |
|
|
result = response.json() |
|
|
|
|
|
print(f"✅ 请求成功!(耗时: {request_time:.3f}s)") |
|
|
print("\n📊 检测结果:") |
|
|
print(f" - 检测到小鼠: {result['mouse_detected']}") |
|
|
|
|
|
if result['mouse_detected']: |
|
|
print(f" - 检测置信度: {result['confidence']:.3f}") |
|
|
print(f" - 关键点数量: {len(result['keypoints'])}") |
|
|
print(f" - 处理FPS: {result['fps']:.1f}") |
|
|
|
|
|
|
|
|
print("\n🔍 检测到的关键点:") |
|
|
for kpt in result['keypoints']: |
|
|
print(f" {kpt['id']}: {kpt['name']} " |
|
|
f"({kpt['x']:.1f}, {kpt['y']:.1f}) " |
|
|
f"conf={kpt['confidence']:.3f}") |
|
|
|
|
|
|
|
|
if "visualization_image" in result and result["visualization_image"]: |
|
|
print("\n🎨 可视化图像处理:") |
|
|
print(" ✅ 接收到绘制了关键点和骨架的图像") |
|
|
|
|
|
|
|
|
img_bytes = base64.b64decode(result["visualization_image"]) |
|
|
nparr = np.frombuffer(img_bytes, np.uint8) |
|
|
vis_image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) |
|
|
|
|
|
|
|
|
output_path = "demo_visualization_result.jpg" |
|
|
cv2.imwrite(output_path, vis_image) |
|
|
|
|
|
print(f" 💾 可视化图像已保存: {output_path}") |
|
|
print(f" 📐 图像尺寸: {vis_image.shape}") |
|
|
|
|
|
|
|
|
print(f" 📊 Base64数据大小: {len(result['visualization_image'])} 字符") |
|
|
print(f" 📁 文件大小: {len(img_bytes)} 字节") |
|
|
|
|
|
else: |
|
|
print("❌ 没有接收到可视化图像") |
|
|
|
|
|
print("\n" + "=" * 50) |
|
|
print("🎉 演示完成!") |
|
|
print("\n💡 使用说明:") |
|
|
print(" 1. 设置 return_image=true 来获取可视化图像") |
|
|
print(" 2. 设置 draw_bbox=false 只绘制关键点和骨架(如您所需)") |
|
|
print(" 3. 设置 draw_bbox=true 同时绘制边界框") |
|
|
print(" 4. 返回的 visualization_image 是Base64编码的JPEG图像") |
|
|
|
|
|
else: |
|
|
print(f"❌ API请求失败: {response.status_code}") |
|
|
print(f"错误信息: {response.text}") |
|
|
|
|
|
except Exception as e: |
|
|
print(f"❌ 请求出错: {str(e)}") |
|
|
|
|
|
def compare_with_without_visualization(): |
|
|
"""对比有无可视化的API响应""" |
|
|
|
|
|
print("\n" + "=" * 50) |
|
|
print("🔄 对比测试:有无可视化图像的API响应") |
|
|
print("=" * 50) |
|
|
|
|
|
|
|
|
with open("test_mouse.jpg", "rb") as image_file: |
|
|
image_base64 = base64.b64encode(image_file.read()).decode('utf-8') |
|
|
|
|
|
|
|
|
configs = [ |
|
|
{ |
|
|
"name": "不返回可视化图像", |
|
|
"data": { |
|
|
"image": image_base64, |
|
|
"conf_threshold": 0.3, |
|
|
"return_image": False |
|
|
} |
|
|
}, |
|
|
{ |
|
|
"name": "返回可视化图像", |
|
|
"data": { |
|
|
"image": image_base64, |
|
|
"conf_threshold": 0.3, |
|
|
"return_image": True, |
|
|
"draw_bbox": False |
|
|
} |
|
|
} |
|
|
] |
|
|
|
|
|
for config in configs: |
|
|
print(f"\n📋 测试: {config['name']}") |
|
|
|
|
|
try: |
|
|
response = requests.post("http://localhost:8765/api/process_frame", |
|
|
json=config["data"]) |
|
|
|
|
|
if response.status_code == 200: |
|
|
result = response.json() |
|
|
|
|
|
|
|
|
response_size = len(response.content) |
|
|
has_vis_image = "visualization_image" in result and result["visualization_image"] |
|
|
|
|
|
print(f" 📊 响应大小: {response_size:,} 字节") |
|
|
print(f" 🖼️ 包含可视化图像: {'是' if has_vis_image else '否'}") |
|
|
|
|
|
if has_vis_image: |
|
|
vis_size = len(result["visualization_image"]) |
|
|
print(f" 📸 图像数据大小: {vis_size:,} 字符") |
|
|
|
|
|
print(f" ⚡ 处理时间: {result['processing_time']:.3f}s") |
|
|
print(f" 🎯 检测结果: {'检测到小鼠' if result['mouse_detected'] else '未检测到小鼠'}") |
|
|
|
|
|
except Exception as e: |
|
|
print(f" ❌ 测试失败: {str(e)}") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
try: |
|
|
response = requests.get("http://localhost:8765/api/status", timeout=5) |
|
|
if response.status_code != 200: |
|
|
print("❌ WebRTC服务不可用,请先启动服务:") |
|
|
print(" python gradio_webrtc_api.py") |
|
|
exit(1) |
|
|
except Exception: |
|
|
print("❌ 无法连接到WebRTC服务,请先启动服务:") |
|
|
print(" python gradio_webrtc_api.py") |
|
|
exit(1) |
|
|
|
|
|
|
|
|
demo_api_usage() |
|
|
compare_with_without_visualization() |