[英]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.