扫描二维码识别同类盒子时,如何实现同类型盒子的计数累加?
问题根因
- 你把
Apple_count定义为callback回调函数的局部变量,ROS的订阅回调每收到一帧摄像头画面就会完整执行一次callback函数,每次执行都会触发Apple_count = 0的初始化操作,所以即便多次识别到Apple类盒子,计数最多只能加到1,无法累加历史结果。 - 现有逻辑未做重复识别过滤:如果摄像头持续对着同一个Apple盒子拍摄,每帧画面都会触发一次计数,会导致单个盒子被重复统计多次。
修复方案
将计数变量改为类的实例属性,在类初始化时只赋值一次,回调函数中直接修改实例属性的值即可实现累加;如果需要避免同一个盒子被重复统计,可以新增实例属性存储上一次识别到的二维码内容,仅当两次识别的二维码内容不同时才触发计数逻辑。
修改后代码示例
class camera_1: def __init__(self): self.image_sub = rospy.Subscriber("/iris/usb_cam/image_raw", Image, self.callback) # 计数变量改为类实例属性,初始化仅执行一次 self.Apple_count = 0 # 新增属性存储上一次识别的二维码内容,用于去重 self.last_qr_data = "" def callback(self,data): bridge = CvBridge() try: cv_image = bridge.imgmsg_to_cv2(data, "bgr8") except CvBridgeError as e: rospy.logerr(e) (rows,cols,channels) = cv_image.shape image = cv_image resized_image = cv2.resize(image, (640, 640)) qr_result = decode(resized_image) # 先判断是否识别到二维码,避免索引报错 if not qr_result: return qr_data = qr_result[0].data print(qr_data) (x, y, w, h) = qr_result[0].rect cv2.rectangle(resized_image, (x, y), (x + w, y + h), (0, 0, 255), 4) text = "{}".format(qr_data) type_of_box = text.endswith("Apple") # 仅当识别到Apple类盒子、且和上一次识别的二维码内容不同时才计数 if type_of_box and qr_data != self.last_qr_data: self.Apple_count += 1 self.last_qr_data = qr_data print(self.Apple_count)
内容的提问来源于stack exchange,提问作者white_panther
相关产品推荐
相关产品推荐

