YOLOv8+SAHI目标检测中BoundingBox传参报错:无法解包非可迭代对象
问题解决方案
错误原因
触发的TypeError: cannot unpack non-iterable BoundingBox object,是因为SAHI返回的prediction.bbox是BoundingBox类实例,并非可直接解包的元组/列表格式,所以无法用x, y, w, h = bbox直接拆分。
解决方法
SAHI的BoundingBox对象自带xmin、ymin、width、height属性(部分版本可能用left、top替代xmin、ymin),只需先从对象中提取这些数值,再传入is_circle函数即可。
方法1:修改调用代码,提前提取坐标
在调用is_circle前,将BoundingBox对象的属性转为元组:
if prediction.category.name == 'uap' or prediction.category.name == 'uai' : bbox_obj = prediction.bbox # 提取坐标并转为整数(OpenCV切片需要整数索引) x = int(bbox_obj.xmin) y = int(bbox_obj.ymin) w = int(bbox_obj.width) h = int(bbox_obj.height) # 传入数值元组 is_circle_flag = is_circle(image, (x, y, w, h)) # 可根据结果做后续处理,比如打印或标记 print(f"检测目标是否为圆形:{is_circle_flag}") else: inis_durumu=-1
方法2:修改is_circle函数适配BoundingBox对象
直接在函数内部处理BoundingBox对象,无需修改调用逻辑:
def is_circle(image, bbox): # 判断输入是否为BoundingBox对象,提取坐标 if hasattr(bbox, 'xmin'): x = int(bbox.xmin) y = int(bbox.ymin) w = int(bbox.width) h = int(bbox.height) else: # 兼容原有的元组格式输入 x, y, w, h = map(int, bbox) img = cv.cvtColor(image, cv.COLOR_BGR2GRAY) roi = img[y:y + h, x:x + w] edges = cv.Canny(roi, 50, 150, apertureSize=3) circles = cv.HoughCircles(edges, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0) return circles is not None
额外提示
如果不确定BoundingBox对象的属性名,可以打印dir(bbox_obj)查看所有属性,确认具体字段(不同SAHI版本可能存在属性名差异)。
内容的提问来源于stack exchange,提问作者Uğurhan Daşdemir
相关产品推荐
相关产品推荐

