-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ed3c058
commit b693690
Showing
5 changed files
with
151 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -127,3 +127,6 @@ dmypy.json | |
|
||
# Pyre type checker | ||
.pyre/ | ||
|
||
# bat | ||
*.bat |
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
#!/usr/bin/env python | ||
# -*- coding: utf-8 -*- | ||
import copy | ||
import time | ||
import argparse | ||
|
||
import cv2 as cv | ||
from pupil_apriltags import Detector | ||
|
||
|
||
def get_args(): | ||
parser = argparse.ArgumentParser() | ||
|
||
parser.add_argument("--device", type=int, default=0) | ||
parser.add_argument("--width", help='cap width', type=int, default=960) | ||
parser.add_argument("--height", help='cap height', type=int, default=540) | ||
|
||
parser.add_argument("--families", type=str, default='tag36h11') | ||
parser.add_argument("--nthreads", type=int, default=1) | ||
parser.add_argument("--quad_decimate", type=float, default=2.0) | ||
parser.add_argument("--quad_sigma", type=float, default=0.0) | ||
parser.add_argument("--refine_edges", type=int, default=1) | ||
parser.add_argument("--decode_sharpening", type=float, default=0.25) | ||
parser.add_argument("--debug", type=int, default=0) | ||
|
||
args = parser.parse_args() | ||
|
||
return args | ||
|
||
|
||
def main(): | ||
# 引数解析 ################################################################# | ||
args = get_args() | ||
|
||
cap_device = args.device | ||
cap_width = args.width | ||
cap_height = args.height | ||
|
||
families = args.families | ||
nthreads = args.nthreads | ||
quad_decimate = args.quad_decimate | ||
quad_sigma = args.quad_sigma | ||
refine_edges = args.refine_edges | ||
decode_sharpening = args.decode_sharpening | ||
debug = args.debug | ||
|
||
# カメラ準備 ############################################################### | ||
cap = cv.VideoCapture(cap_device) | ||
cap.set(cv.CAP_PROP_FRAME_WIDTH, cap_width) | ||
cap.set(cv.CAP_PROP_FRAME_HEIGHT, cap_height) | ||
|
||
# Detector準備 ############################################################# | ||
at_detector = Detector( | ||
families=families, | ||
nthreads=nthreads, | ||
quad_decimate=quad_decimate, | ||
quad_sigma=quad_sigma, | ||
refine_edges=refine_edges, | ||
decode_sharpening=decode_sharpening, | ||
debug=debug, | ||
) | ||
|
||
elapsed_time = 0 | ||
|
||
while True: | ||
start_time = time.time() | ||
|
||
# カメラキャプチャ ##################################################### | ||
ret, image = cap.read() | ||
if not ret: | ||
break | ||
debug_image = copy.deepcopy(image) | ||
|
||
# 検出実施 ############################################################# | ||
image = cv.cvtColor(image, cv.COLOR_BGR2GRAY) | ||
tags = at_detector.detect( | ||
image, | ||
estimate_tag_pose=False, | ||
camera_params=None, | ||
tag_size=None, | ||
) | ||
|
||
# 描画 ################################################################ | ||
debug_image = draw_tags(debug_image, tags, elapsed_time) | ||
|
||
elapsed_time = time.time() - start_time | ||
|
||
# キー処理(ESC:終了) ################################################# | ||
key = cv.waitKey(1) | ||
if key == 27: # ESC | ||
break | ||
|
||
# 画面反映 ############################################################# | ||
cv.imshow('AprilTag Detect Demo', debug_image) | ||
|
||
cap.release() | ||
cv.destroyAllWindows() | ||
|
||
|
||
def draw_tags( | ||
image, | ||
tags, | ||
elapsed_time, | ||
): | ||
for tag in tags: | ||
tag_family = tag.tag_family | ||
tag_id = tag.tag_id | ||
center = tag.center | ||
corners = tag.corners | ||
|
||
center = (int(center[0]), int(center[1])) | ||
corner_01 = (int(corners[0][0]), int(corners[0][1])) | ||
corner_02 = (int(corners[1][0]), int(corners[1][1])) | ||
corner_03 = (int(corners[2][0]), int(corners[2][1])) | ||
corner_04 = (int(corners[3][0]), int(corners[3][1])) | ||
|
||
# 中心 | ||
cv.circle(image, (center[0], center[1]), 5, (0, 0, 255), 2) | ||
|
||
# 各辺 | ||
cv.line(image, (corner_01[0], corner_01[1]), | ||
(corner_02[0], corner_02[1]), (255, 0, 0), 2) | ||
cv.line(image, (corner_02[0], corner_02[1]), | ||
(corner_03[0], corner_03[1]), (255, 0, 0), 2) | ||
cv.line(image, (corner_03[0], corner_03[1]), | ||
(corner_04[0], corner_04[1]), (0, 255, 0), 2) | ||
cv.line(image, (corner_04[0], corner_04[1]), | ||
(corner_01[0], corner_01[1]), (0, 255, 0), 2) | ||
|
||
# タグファミリー、タグID | ||
# cv.putText(image, | ||
# str(tag_family) + ':' + str(tag_id), | ||
# (corner_01[0], corner_01[1] - 10), cv.FONT_HERSHEY_SIMPLEX, | ||
# 0.6, (0, 255, 0), 1, cv.LINE_AA) | ||
cv.putText(image, str(tag_id), (center[0] - 10, center[1] - 10), | ||
cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2, cv.LINE_AA) | ||
|
||
# 処理時間 | ||
cv.putText(image, | ||
"Elapsed Time:" + '{:.1f}'.format(elapsed_time * 1000) + "ms", | ||
(10, 30), cv.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, | ||
cv.LINE_AA) | ||
|
||
return image | ||
|
||
|
||
if __name__ == '__main__': | ||
main() |