如何基于边界框空间邻近性匹配合并两个字典列表的对应元素
解决方法
核心修改点
- 配对逻辑替换为双层循环,遍历
poo和foo所有可能的元素组合,不再受索引位置限制 - 重写边界框邻近判断逻辑,满足x、y方向间隔不超过10的要求
- 修正键名匹配错误,补充边界框并集计算逻辑
完整实现代码
def is_box_near(poo_box, foo_box, threshold=10): """ 判断两个边界框是否足够邻近 poo_box: poo中元素的边界框字典,包含xmin/ymin/xmax/ymax字段 foo_box: foo中元素的box_points列表,格式为[xmin, ymin, xmax, ymax] threshold: 单方向最大允许间隔,默认10 """ # 计算x方向间隔:重叠时为负,不重叠时为正 x_gap = max(poo_box['xmin'], foo_box[0]) - min(poo_box['xmax'], foo_box[2]) # 计算y方向间隔 y_gap = max(poo_box['ymin'], foo_box[1]) - min(poo_box['ymax'], foo_box[3]) return x_gap <= threshold and y_gap <= threshold # 示例数据 poo = [{ "xmin":10, "ymin":100, "xmax":70, "ymax":120, "text":"fish", }] foo = [{ "class":"Animal", "percent":88.25, "box_points":[30, 90, 80, 110] }] poofoo = [] # 双层循环遍历所有配对 for p_item in poo: for f_item in foo: if is_box_near(p_item, f_item['box_points']): # 合并生成新元素 merged_item = { "class": f_item['class'], "text": p_item['text'], "percent": f_item['percent'], "box_points": { "xmin": min(p_item['xmin'], f_item['box_points'][0]), "ymin": min(p_item['ymin'], f_item['box_points'][1]), "xmax": max(p_item['xmax'], f_item['box_points'][2]), "ymax": max(p_item['ymax'], f_item['box_points'][3]) } } poofoo.append(merged_item)
运行输出
和预期结果完全一致:
[{ "class":"Animal", "text":"fish", "percent": 88.25, "box_points":{ "xmin":10, "ymin":90, "xmax":80, "ymax":120} }]
内容的提问来源于stack exchange,提问作者Gustavo Scholze
相关产品推荐
相关产品推荐

