как я могу увеличить количество однотипных ящиков, если после сканирования qr-кода он получает один и тот же тип ящиков?

#python #opencv #ros #drone #px4

Вопрос:

Я использую сканер qr-кода для обнаружения и декодирования, и он правильно декодирует вывод. Здесь я использую «текст» в качестве декодированного вывода qr-кода. Если он получает коробку того же типа,что и APPLE, он должен увеличить apple_count до 1. Используя этот код, я получаю только «1» для apple_count . Я думаю, что проблема может быть из-за цикла, но я не могу ее решить.Пожалуйста, помогите мне.Спасибо

 class camera_1:   def __init__(self):  self.image_sub = rospy.Subscriber("/iris/usb_cam/image_raw", Image, self.callback)   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)   #print (qr_result)    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)   Apple_count = 0  text = "{}".format(qr_data)  type_of_box = (text.endswith("Apple"))   if type_of_box == True:  Apple_count=Apple_count 1  print(Apple_count)    

Ответ №1:

Ваша проблема в том, что вы меняете локальную переменную на функцию обратного вызова, а не атрибут класса. Вместо этого вы должны использовать self ключевое слово, чтобы счетчик увеличивался при нескольких обратных вызовах.

 class camera_1:   def __init__(self):  self.Apple_count = 0  self.image_sub = rospy.Subscriber("/iris/usb_cam/image_raw", Image, self.callback)   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)   #print (qr_result)    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"))   if type_of_box == True:  self.Apple_count  = 1  print(self.Apple_count)    

Комментарии:

1. Спасибо, сэр, сейчас все работает . Это увеличивает значение, но дело в том, что оно непрерывно увеличивает значение .это потому, что я использую rospy.spin() в основной функции?

2. @white_panther Это не обязательно из-за rospy.spin . Значение будет увеличиваться каждый раз, когда при обратном вызове будет получено изображение, соответствующее условиям вашего QR-кода. Будучи видеопотоком, это будет происходить несколько раз в секунду. Я бы рекомендовал метод кэширования с низкой частотой дискретизации за пределами обратного вызова. Либо это, либо вы можете отслеживать QR-коды, которые вы уже отсканировали, и игнорировать их.

3. Хорошо ,и еще раз спасибо.