#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. Хорошо ,и еще раз спасибо.