test_charuco_board.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from __future__ import print_function
  2. import os, tempfile, numpy as np
  3. import sys
  4. import cv2 as cv
  5. from tests_common import NewOpenCVTests
  6. import generate_pattern
  7. class aruco_objdetect_test(NewOpenCVTests):
  8. def test_aruco_dicts(self):
  9. try:
  10. import cairosvg
  11. except:
  12. raise self.skipTest("cairosvg library was not found")
  13. else:
  14. cols = 3
  15. rows = 5
  16. square_size = 100
  17. aruco_type = [cv.aruco.DICT_4X4_1000, cv.aruco.DICT_5X5_1000, cv.aruco.DICT_6X6_1000,
  18. cv.aruco.DICT_7X7_1000, cv.aruco.DICT_ARUCO_ORIGINAL, cv.aruco.DICT_APRILTAG_16h5,
  19. cv.aruco.DICT_APRILTAG_25h9, cv.aruco.DICT_APRILTAG_36h10, cv.aruco.DICT_APRILTAG_36h11]
  20. aruco_type_str = ['DICT_4X4_1000','DICT_5X5_1000', 'DICT_6X6_1000',
  21. 'DICT_7X7_1000', 'DICT_ARUCO_ORIGINAL', 'DICT_APRILTAG_16h5',
  22. 'DICT_APRILTAG_25h9', 'DICT_APRILTAG_36h10', 'DICT_APRILTAG_36h11']
  23. marker_size = 0.8*square_size
  24. board_width = cols*square_size
  25. board_height = rows*square_size
  26. for aruco_type_i in range(len(aruco_type)):
  27. #draw desk using opencv
  28. aruco_dict = cv.aruco.getPredefinedDictionary(aruco_type[aruco_type_i])
  29. board = cv.aruco.CharucoBoard((cols, rows), square_size, marker_size, aruco_dict)
  30. charuco_detector = cv.aruco.CharucoDetector(board)
  31. from_cv_img = board.generateImage((cols*square_size, rows*square_size))
  32. #draw desk using svg
  33. fd1, filesvg = tempfile.mkstemp(prefix="out", suffix=".svg")
  34. os.close(fd1)
  35. fd2, filepng = tempfile.mkstemp(prefix="svg_marker", suffix=".png")
  36. os.close(fd2)
  37. try:
  38. basedir = os.path.abspath(os.path.dirname(__file__))
  39. pm = generate_pattern.PatternMaker(cols, rows, filesvg, "px", square_size, 0, board_width,
  40. board_height, "charuco_checkboard", marker_size,
  41. os.path.join(basedir, aruco_type_str[aruco_type_i]+'.json.gz'), 0)
  42. pm.make_charuco_board()
  43. pm.save()
  44. cairosvg.svg2png(url=filesvg, write_to=filepng, background_color="white")
  45. from_svg_img = cv.imread(filepng)
  46. _charucoCorners, _charuco_ids_svg, marker_corners_svg, marker_ids_svg = charuco_detector.detectBoard(from_svg_img)
  47. _charucoCorners, _charuco_ids_cv, marker_corners_cv, marker_ids_cv = charuco_detector.detectBoard(from_cv_img)
  48. marker_corners_svg_map, marker_corners_cv_map = {}, {}
  49. for i in range(len(marker_ids_svg)):
  50. marker_corners_svg_map[int(marker_ids_svg[i][0])] = marker_corners_svg[i]
  51. for i in range(len(marker_ids_cv)):
  52. marker_corners_cv_map[int(marker_ids_cv[i][0])] = marker_corners_cv[i]
  53. for key_svg in marker_corners_svg_map.keys():
  54. marker_svg = marker_corners_svg_map[key_svg]
  55. marker_cv = marker_corners_cv_map[key_svg]
  56. np.testing.assert_allclose(marker_svg, marker_cv, 0.1, 0.1)
  57. finally:
  58. if os.path.exists(filesvg):
  59. os.remove(filesvg)
  60. if os.path.exists(filepng):
  61. os.remove(filepng)
  62. def test_aruco_marker_sizes(self):
  63. try:
  64. import cairosvg
  65. except:
  66. raise self.skipTest("cairosvg library was not found")
  67. else:
  68. cols = 3
  69. rows = 5
  70. square_size = 100
  71. aruco_type = cv.aruco.DICT_5X5_1000
  72. aruco_type_str = 'DICT_5X5_1000'
  73. marker_sizes_rate = [0.25, 0.5, 0.75, 0.9]
  74. board_width = cols*square_size
  75. board_height = rows*square_size
  76. for marker_s_rate in marker_sizes_rate:
  77. marker_size = marker_s_rate*square_size
  78. #draw desk using opencv
  79. aruco_dict = cv.aruco.getPredefinedDictionary(aruco_type)
  80. board = cv.aruco.CharucoBoard((cols, rows), square_size, marker_size, aruco_dict)
  81. charuco_detector = cv.aruco.CharucoDetector(board)
  82. from_cv_img = board.generateImage((cols*square_size, rows*square_size))
  83. #draw desk using svg
  84. fd1, filesvg = tempfile.mkstemp(prefix="out", suffix=".svg")
  85. os.close(fd1)
  86. fd2, filepng = tempfile.mkstemp(prefix="svg_marker", suffix=".png")
  87. os.close(fd2)
  88. try:
  89. basedir = os.path.abspath(os.path.dirname(__file__))
  90. pm = generate_pattern.PatternMaker(cols, rows, filesvg, "px", square_size, 0, board_width,
  91. board_height, "charuco_checkboard", marker_size, os.path.join(basedir, aruco_type_str+'.json.gz'), 0)
  92. pm.make_charuco_board()
  93. pm.save()
  94. cairosvg.svg2png(url=filesvg, write_to=filepng, background_color="white")
  95. from_svg_img = cv.imread(filepng)
  96. #test
  97. _charucoCorners, _charuco_ids_svg, marker_corners_svg, marker_ids_svg = charuco_detector.detectBoard(from_svg_img)
  98. _charucoCorners, _charuco_ids_cv, marker_corners_cv, marker_ids_cv = charuco_detector.detectBoard(from_cv_img)
  99. marker_corners_svg_map, marker_corners_cv_map = {}, {}
  100. for i in range(len(marker_ids_svg)):
  101. marker_corners_svg_map[int(marker_ids_svg[i][0])] = marker_corners_svg[i]
  102. for i in range(len(marker_ids_cv)):
  103. marker_corners_cv_map[int(marker_ids_cv[i][0])] = marker_corners_cv[i]
  104. for key_svg in marker_corners_svg_map.keys():
  105. marker_svg = marker_corners_svg_map[key_svg]
  106. marker_cv = marker_corners_cv_map[key_svg]
  107. np.testing.assert_allclose(marker_svg, marker_cv, 0.1, 0.1)
  108. finally:
  109. if os.path.exists(filesvg):
  110. os.remove(filesvg)
  111. if os.path.exists(filepng):
  112. os.remove(filepng)