Python获取最近实体:代码计算问题排查与优化求助
问题分析与修正方案
一、核心错误点
中心点计算逻辑错误
你当前的中心点公式完全偏离正确值,正确的实体中心点应该是边界框的中点,而非中点再加左/上边界:# 错误公式 centerX = (xmax + xmin) / 2 + xmin centerY = (ymax + ymin) / 2 + ymin # 正确公式 centerX = (xmin + xmax) / 2 centerY = (ymin + ymax) / 2错误的中心点会导致距离计算完全失真,根本无法反映实体到屏幕中心的真实距离。
未遍历所有检测实体
代码仅处理了df.iloc[0](第一个检测到的实体),完全忽略了其他可能存在的敌人,自然找不到“最近”的那个。变量未定义+语法问题
- 直接使用
distances[i]但i从未定义,运行会抛出NameError; while True循环在with mss() as sct:块外部,导致sct被提前关闭,无法持续截图;try块缩进错误且无对应except块,存在语法问题。
- 直接使用
二、修正后的完整代码
from mss import mss import math import cv2 import numpy as np import torch # 修正笔误:torc → torch # 假设你已提前加载好YOLO模型 # model = torch.hub.load('ultralytics/yolov5', 'yolov5s') with mss() as sct: monitor = {"top": 220, "left": 640, "width": 640, "height": 640} while True: screenshot = np.array(sct.grab(monitor)) results = model(screenshot, size=600) df = results.pandas().xyxy[0] closest_dist_sq = float('inf') # 用无穷大初始化更合理 closest_enemy_idx = -1 # 遍历所有检测到的实体 for idx, row in df.iterrows(): try: xmin = int(row['xmin']) ymin = int(row['ymin']) xmax = int(row['xmax']) ymax = int(row['ymax']) # 修正中心点计算 centerX = (xmin + xmax) / 2 centerY = (ymin + ymax) / 2 # 计算距离平方(无需开根号,比较结果一致且更高效) dist_sq = (centerX - 320) ** 2 + (centerY - 320) ** 2 # 更新最近实体 if dist_sq < closest_dist_sq: closest_dist_sq = dist_sq closest_enemy_idx = idx except Exception as e: print(f"处理实体出错: {e}") continue # 输出结果 if closest_enemy_idx != -1: enemy = df.iloc[closest_enemy_idx] print(f"最近实体索引: {closest_enemy_idx}") print(f"实体边界框: xmin={enemy['xmin']}, ymin={enemy['ymin']}, xmax={enemy['xmax']}, ymax={enemy['ymax']}") else: print("未检测到任何实体")
三、优化建议
跳过平方根计算
平方根是单调递增函数,比较距离平方和比较实际距离的结果完全一致,能减少计算开销,提升实时性。如果需要实际距离,再对dist_sq开根号即可。过滤目标实体
如果模型会检测多种类型的对象,可通过df['name']筛选出特定敌人类型:# 仅处理名为'enemy'的实体 enemy_df = df[df['name'] == 'enemy'] for idx, row in enemy_df.iterrows(): # 后续逻辑不变常量复用
屏幕中心坐标是固定值,可提前定义为常量,提升代码可读性:SCREEN_CENTER = (320, 320) dist_sq = (centerX - SCREEN_CENTER[0]) ** 2 + (centerY - SCREEN_CENTER[1]) ** 2细化异常处理
针对具体异常(如类型转换错误、索引错误)捕获处理,而非捕获所有Exception,方便调试定位问题。
内容的提问来源于stack exchange,提问作者JorgTV
相关产品推荐
相关产品推荐

