初始化检测器

dt_apriltags.Detector(families,nthreads,quad_decimate,quad_sigma,refine_edges,

decode_sharpening,debug)

创建标签检测器

参数说明

families:要检测的标签类型,多种类型用逗号隔开
nthreads:同时执行检测的线程数目,一般小于等于CPU核数
quad_decimate:缩放倍率,提高速度降低精度
quad_sigma:高斯模糊的标准差,
refine_edges:是否改进边缘,打开此选项可以提升检测效果
decode_sharpening:解码锐化,检测小标签时比较有用
debug:是否启用调试

返回值

标签检测器对象

执行检测

tags = Detector.detect(img, estimate_tag_pose=False, camera_params=None, tag_size=None)

执行标签检测

参数说明

img:待检测的图像,灰度格式
estimate_tag_pose:是否进行姿态估计
camera_params:如果进行姿态估计,必须同时传入摄像头内参
tag_size:标签的实际尺寸,以米为单位

返回值

tags:检测到的标签数组
参考格式:
[Detection object]
Detection object:
tag_family = tag36h11
tag_id = 5
hamming = 0
decision_margin = 75.3475112915
homography = [[-4.04986020e+00 -8.25442426e+00 7.03246452e+02]
[ 1.60941194e+01 2.64459780e+00 2.71387964e+02]
[-3.94154088e-03 1.31415634e-02 1.00000000e+00]]
center = [703.24645207 271.38796427]
corners = [[687.30065918 253.60606384]
[684.64343262 287.48184204]
[719.746521 289.78796387]
[722.19494629 254.99520874]]
pose_R = [[-0.05079941 -0.99821651 0.03135634]
[ 0.99851052 -0.05139001 -0.01832521]
[ 0.01990393 0.03037872 0.99934027]]
pose_t = [[0.72577546]
[0.04402775]
[0.58391835]]
pose_err = 5.94095039944e-07
属性说明
tag_family:标签类型
tag_id:标签id
hamming:解码错误的位数,高于2不会解码成功
homography:单应矩阵
center:标签中心点坐标
corners:标签四个角坐标
pose_R:姿态估计旋转矩阵
pose_t:x、y、z轴姿态估计平移距离
pose_err:姿态估计的误差

使用示例:画出检测到的标签

  1. #!coding: utf-8
  2. from scipy.spatial.transform import Rotation as R
  3. from dt_apriltags import Detector
  4. import cv2
  5. import numpy as np
  6. Key_Esc = 27
  7. detector = Detector(
  8. families='tag36h11',
  9. nthreads=2,
  10. quad_decimate=2.0,
  11. quad_sigma=0.0,
  12. refine_edges=1,
  13. decode_sharpening=0.25,
  14. debug=0)
  15. # 相机内参
  16. cameraMatrix = np.array(
  17. [320.71937537753894, 0.0, 330.4044140922508, 0.0, 327.43302776981824, 237.11135077228542,
  18. 0.0, 0.0, 1.0]).reshape((3, 3))
  19. camera_params = (
  20. cameraMatrix[0, 0], cameraMatrix[1, 1], cameraMatrix[0, 2], cameraMatrix[1, 2])
  21. # 兼容Python2/3的写法
  22. if hasattr(R, 'from_dcm'):
  23. from_dcm_or_matrix = R.from_dcm
  24. else:
  25. from_dcm_or_matrix = R.from_matrix
  26. cap = cv2.VideoCapture(0)
  27. while True:
  28. ret, frame = cap.read()
  29. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  30. tags = detector.detect(
  31. gray, True, camera_params, 0.065)
  32. for tag in tags:
  33. # 姿态计算
  34. r = from_dcm_or_matrix(np.array(tag.pose_R))
  35. euler = r.as_euler('xyz', degrees=True)
  36. offset = np.array(tag.pose_t)*100
  37. # 画出检测到的标签
  38. for idx in range(len(tag.corners)):
  39. cv2.line(frame, tuple(
  40. tag.corners[idx-1, :].astype(int)), tuple(tag.corners[idx, :].astype(int)), (0, 255, 0), 4)
  41. cv2.putText(frame, str(tag.tag_id),
  42. org=(tag.corners[0, 0].astype(int)+10,
  43. tag.corners[0, 1].astype(int)+10),
  44. fontFace=cv2.FONT_HERSHEY_SIMPLEX,
  45. fontScale=3, color=(0, 0, 255), thickness=4)
  46. cv2.imshow('detected', np.rot90(cv2.resize(frame, (320, 240))))
  47. if cv2.waitKey(1) == Key_Esc:
  48. break
  49. cap.release()
  50. cv2.destroyAllWindows()