初始化检测器
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:姿态估计的误差
使用示例:画出检测到的标签
#!coding: utf-8
from scipy.spatial.transform import Rotation as R
from dt_apriltags import Detector
import cv2
import numpy as np
Key_Esc = 27
detector = Detector(
families='tag36h11',
nthreads=2,
quad_decimate=2.0,
quad_sigma=0.0,
refine_edges=1,
decode_sharpening=0.25,
debug=0)
# 相机内参
cameraMatrix = np.array(
[320.71937537753894, 0.0, 330.4044140922508, 0.0, 327.43302776981824, 237.11135077228542,
0.0, 0.0, 1.0]).reshape((3, 3))
camera_params = (
cameraMatrix[0, 0], cameraMatrix[1, 1], cameraMatrix[0, 2], cameraMatrix[1, 2])
# 兼容Python2/3的写法
if hasattr(R, 'from_dcm'):
from_dcm_or_matrix = R.from_dcm
else:
from_dcm_or_matrix = R.from_matrix
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
tags = detector.detect(
gray, True, camera_params, 0.065)
for tag in tags:
# 姿态计算
r = from_dcm_or_matrix(np.array(tag.pose_R))
euler = r.as_euler('xyz', degrees=True)
offset = np.array(tag.pose_t)*100
# 画出检测到的标签
for idx in range(len(tag.corners)):
cv2.line(frame, tuple(
tag.corners[idx-1, :].astype(int)), tuple(tag.corners[idx, :].astype(int)), (0, 255, 0), 4)
cv2.putText(frame, str(tag.tag_id),
org=(tag.corners[0, 0].astype(int)+10,
tag.corners[0, 1].astype(int)+10),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=3, color=(0, 0, 255), thickness=4)
cv2.imshow('detected', np.rot90(cv2.resize(frame, (320, 240))))
if cv2.waitKey(1) == Key_Esc:
break
cap.release()
cv2.destroyAllWindows()