You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扫描二维码识别同类盒子时,如何实现同类型盒子的计数累加?

问题根因
  • 你把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:39:03