帧下半部窄宽度区域内目标追踪与计数代码优化需求
解决指定下半部窄宽度区域的目标追踪计数问题
原代码的问题很明确:只通过纵坐标判断计数区域,没有对目标的横向位置做限制,导致只要目标进入上半区(y < h-350)就会被计数,不符合“下半部窄宽度区域”的要求。我们需要给计数区域同时加上横向宽度限制和正确的纵向下半区范围,调整后的逻辑如下:
修改后的代码
def count_obj(box, w, h, id): global count, data # 计算目标中心坐标 center_x = int(box[0] + (box[2] - box[0]) / 2) center_y = int(box[1] + (box[3] - box[1]) / 2) # 定义指定计数区域的边界:下半部 + 略小于帧宽的窄宽度 # 1. 纵向:下半区域,这里设为从 h-350 到帧底部(可根据实际需求调整阈值) lower_y_threshold = h - 350 # 2. 横向:窄宽度区域,比如取帧宽度的80%(左右各留10%的边距),可灵活调整比例或固定值 horizontal_margin_ratio = 0.1 # 左右边距占帧宽的比例 left_x_bound = int(w * horizontal_margin_ratio) right_x_bound = int(w * (1 - horizontal_margin_ratio)) # 判断目标中心是否在指定区域内 if (center_y > lower_y_threshold) and (left_x_bound <= center_x <= right_x_bound): if id not in data: count += 1 data.append(id)
关键逻辑说明
- 区域边界定义:
- 纵向:把原代码的
center_y < h-350改成center_y > h-350,确保只统计下半部分的目标(如果你的“下半部”定义不同,可以调整这个阈值,比如设为h//2表示中间以下)。 - 横向:通过比例计算左右边界,比如
horizontal_margin_ratio=0.1会让计数区域宽度是帧宽的80%,略小于实际帧宽;如果需要固定宽度,也可以直接设固定值,比如left_x_bound = 100,right_x_bound = w - 100。
- 纵向:把原代码的
- 双重条件判断:只有当目标中心同时落在纵向下半区和横向窄宽度区域内时,才会触发计数逻辑,避免了超出宽度范围的目标被误统计。
- 灵活性:你可以根据实际场景调整
lower_y_threshold(纵向区域位置)和horizontal_margin_ratio(横向区域宽度),适配不同的帧尺寸和需求。
内容的提问来源于stack exchange,提问作者Moemen
相关产品推荐
相关产品推荐

