繁体   English   中英

Python 创建在回调 function 中存储新 ID 的列表

[英]Python create list that stores new ids inside a callback function

我对 python 很陌生。我有一个检测 aruco 标记的脚本。 我正在尝试创建一个列表来存储从detect_aruco function 返回的 ID,并添加检测到的任何新 ID。 基本上调用了 function detect_aruco ,它返回一个 ID 数组和一个带有坐标的数组。 当检测到 aruco 时,我想检查列表以确定我之前是否遇到过它的 id,如果没有将其存储到列表中并打印它的坐标。 关于如何完成的任何想法?

#!/usr/bin/env python

import rospy
import numpy as np
import cv2
from std_msgs.msg import String
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import cv2.aruco as aruco

class image_convert_pub:

  def __init__(self):
    self.image_pub = rospy.Publisher("/detected_markers",Image, queue_size=1)
    self.id_pub = rospy.Publisher("/arudo_ID", String, queue_size=1)
    self.bridge = CvBridge()
    #self.image_sub = rospy.Subscriber("/usb_cam/image_raw/", Image, self.callback)
    self.image_sub = rospy.Subscriber('/camera/image_raw', Image, self.callback)
  def callback(self,data):
    try:
      cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
    except CvBridgeError as e:
      print(e)

    markers_img,corners_list,ids_list = self.detect_aruco(cv_image)

    if ids_list is None:
      self.id_pub.publish(ids_list)
    else:
      ids_str = ''.join(str(e) for e in ids_list)
      self.id_pub.publish(ids_str)

    try:
      self.image_pub.publish(self.bridge.cv2_to_imgmsg(markers_img, "bgr8"))
    except CvBridgeError as e:
      print(e)

  def detect_aruco(self,img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    aruco_dict = aruco.Dictionary_get(aruco.DICT_5X5_1000)
    parameters = aruco.DetectorParameters_create()
    corners, ids, _ = aruco.detectMarkers(gray, aruco_dict, parameters = parameters)
    output = aruco.drawDetectedMarkers(img, corners, ids)  # detect the sruco markers and display its aruco id.
    return output,corners,ids

def main():
  print("Initializing ROS-node")
  rospy.init_node('detect_markers', anonymous=True)
  print("Bring the aruco-ID in front of camera")
  ic = image_convert_pub()
  rospy.spin()

if __name__ == '__main__':
    main()

使用字典可能更简单{id: corners, other_id: other_corners, ...}

您可以在__init__中创建空字典self.encountered = {}

稍后您可以使用zip(ids_list, corners_list)创建对(id, corners)并检查self.encountered中的id并添加新的self.encountered[id] = corners

    def __init__(self):

        # ... code ... 
    
        self.encountered = {}
        
    def callback(self, data):

        # ... code ...

        markers_img, corners_list, ids_list = self.detect_aruco(cv_image)

        for id_, corners in zip(ids_list, corners_list):
            if id_ not in self.encountered:
                self.encountered[id_] = corners
                print('new:', id_, corners)

        # ... code ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM