Files
aiData/WeiXin/T2_Vision_StaticTest.py
HuangHai e3e5d76299 'commit'
2026-01-31 07:30:15 +08:00

140 lines
5.0 KiB
Python

# coding=utf-8
"""
T2_Identify.py - 视觉识别系统测试 (Vision System Test)
【核心功能】
- 静态分析:仅截图并分析,不进行任何点击操作。
- 视觉验证:测试 OCR 识别准确率、发送者判定 (颜色/几何)、消息类型分类。
- 调试工具:生成详细的检测日志和标记框图片 (T2_Identify_Debug.jpg)。
【使用场景】
- 当发现机器人“看不见”某条消息时。
- 当机器人把“对方”的消息误认为是“我”的消息时。
- 调整 OCR 阈值或几何判定规则后的快速验证。
"""
import os
import sys
import logging
import cv2
import json
# Add project root
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if project_root not in sys.path:
sys.path.append(project_root)
from WeiXin import WxUtil
# Setup Logger
logger = logging.getLogger("T2_Identify")
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
# Console Handler
ch = logging.StreamHandler()
ch.setFormatter(formatter)
logger.addHandler(ch)
# File Handler
log_file = os.path.join(WxUtil.LOG_DIR, "T2_Identify.log")
fh = logging.FileHandler(log_file, mode='w', encoding='utf-8')
fh.setFormatter(formatter)
logger.addHandler(fh)
def main():
logger.info("--- T2: Identify Elements ---")
# 1. Connect
d = WxUtil.connect_device()
if not d:
logger.error("Device connection failed.")
return
# 2. Screenshot/Image Source
if len(sys.argv) > 1:
screenshot_path = sys.argv[1]
logger.info(f"Using provided image: {screenshot_path}")
else:
screenshot_path = os.path.join(WxUtil.OUTPUT_DIR, "T2_Screenshot.jpg")
logger.info("Taking screenshot...")
try:
d.screenshot(screenshot_path)
logger.info(f"Screenshot saved to: {screenshot_path}")
except Exception as e:
logger.error(f"Failed to take screenshot: {e}")
# If screenshot fails, try to use existing one for debugging if it exists
if os.path.exists(screenshot_path):
logger.warning(f"Using existing screenshot at {screenshot_path}")
else:
return
# 3. Analyze (Using the internal _scan function to see raw detection)
logger.info("Scanning image for elements...")
messages, debug_img, chat_title = WxUtil._scan_chat_messages(screenshot_path)
# 4. Output Raw Detection
logger.info(f"Chat Title: {chat_title}")
logger.info(f"--- Raw Detection ({len(messages)} items) ---")
for i, msg in enumerate(messages):
# Format for readability
content = msg.get('content', '')
if content is None: content = "[None]"
type_str = msg.get('type', 'unknown')
sender_str = msg.get('sender', 'unknown')
center = msg.get('center', (0,0))
y = msg.get('y', 0)
time_disp = msg.get('time_display', 'N/A')
logger.info(f"[{i}] {type_str:<8} | {sender_str:<4} | y={y:<4} | time={time_disp} | {content}")
# 5. Merging Logic (Simulate what the bot SHOULD do)
logger.info("--- Merged Dialogues (Simulated) ---")
merged_msgs = []
if messages:
current_msg = messages[0].copy()
last_y = current_msg['y'] # Track Y of the last element in the current merge block
for i in range(1, len(messages)):
next_msg = messages[i]
# Merge Criteria:
# 1. Same Sender
# 2. Same Type (text)
# 3. Vertically close (y_diff < 100) relative to the LAST line, not the first
# 4. Not a timestamp
is_same_sender = (current_msg['sender'] == next_msg['sender'])
is_text = (current_msg['type'] == 'text' and next_msg['type'] == 'text')
# Use last_y to compare with next_msg['y']
y_diff = next_msg['y'] - last_y
is_close = (y_diff < 120) # Tolerance for line spacing (slightly increased)
if is_same_sender and is_text and is_close:
# Merge content
current_msg['content'] += " " + next_msg['content']
# Update last_y to this message's y
last_y = next_msg['y']
else:
merged_msgs.append(current_msg)
current_msg = next_msg.copy()
last_y = current_msg['y']
merged_msgs.append(current_msg)
for i, msg in enumerate(merged_msgs):
content = msg.get('content', '')
sender = msg.get('sender', 'unknown')
logger.info(f"[{i}] {sender}: {content}")
# 6. Save Debug Image
debug_path = os.path.join(WxUtil.OUTPUT_DIR, "T2_Identify_Debug.jpg")
if debug_img is not None:
cv2.imwrite(debug_path, debug_img)
logger.info(f"Debug image saved to: {debug_path}")
if __name__ == "__main__":
main()