ArucoTest.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package org.opencv.test.aruco;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.opencv.test.OpenCVTestCase;
  5. import org.junit.Assert;
  6. import org.opencv.core.Scalar;
  7. import org.opencv.core.Mat;
  8. import org.opencv.core.MatOfInt;
  9. import org.opencv.core.Size;
  10. import org.opencv.core.CvType;
  11. import org.opencv.objdetect.*;
  12. public class ArucoTest extends OpenCVTestCase {
  13. public void testGenerateBoards() {
  14. Dictionary dictionary = Objdetect.getPredefinedDictionary(Objdetect.DICT_4X4_50);
  15. Mat point1 = new Mat(4, 3, CvType.CV_32FC1);
  16. int row = 0, col = 0;
  17. double squareLength = 40.;
  18. point1.put(row, col, 0, 0, 0,
  19. 0, squareLength, 0,
  20. squareLength, squareLength, 0,
  21. 0, squareLength, 0);
  22. List<Mat>objPoints = new ArrayList<Mat>();
  23. objPoints.add(point1);
  24. Mat ids = new Mat(1, 1, CvType.CV_32SC1);
  25. ids.put(row, col, 0);
  26. Board board = new Board(objPoints, dictionary, ids);
  27. Mat image = new Mat();
  28. board.generateImage(new Size(80, 80), image, 2);
  29. assertTrue(image.total() > 0);
  30. }
  31. public void testArucoIssue3133() {
  32. byte[][] marker = {{0,1,1},{1,1,1},{0,1,1}};
  33. Dictionary dictionary = Objdetect.extendDictionary(1, 3);
  34. dictionary.set_maxCorrectionBits(0);
  35. Mat markerBits = new Mat(3, 3, CvType.CV_8UC1);
  36. for (int i = 0; i < 3; i++) {
  37. for (int j = 0; j < 3; j++) {
  38. markerBits.put(i, j, marker[i][j]);
  39. }
  40. }
  41. Mat markerCompressed = Dictionary.getByteListFromBits(markerBits);
  42. assertMatNotEqual(markerCompressed, dictionary.get_bytesList());
  43. dictionary.set_bytesList(markerCompressed);
  44. assertMatEqual(markerCompressed, dictionary.get_bytesList());
  45. }
  46. public void testArucoDetector() {
  47. Dictionary dictionary = Objdetect.getPredefinedDictionary(0);
  48. DetectorParameters detectorParameters = new DetectorParameters();
  49. ArucoDetector detector = new ArucoDetector(dictionary, detectorParameters);
  50. Mat markerImage = new Mat();
  51. int id = 1, offset = 5, size = 40;
  52. Objdetect.generateImageMarker(dictionary, id, size, markerImage, detectorParameters.get_markerBorderBits());
  53. Mat image = new Mat(markerImage.rows() + 2*offset, markerImage.cols() + 2*offset,
  54. CvType.CV_8UC1, new Scalar(255));
  55. Mat m = image.submat(offset, size+offset, offset, size+offset);
  56. markerImage.copyTo(m);
  57. List<Mat> corners = new ArrayList();
  58. Mat ids = new Mat();
  59. detector.detectMarkers(image, corners, ids);
  60. assertEquals(1, corners.size());
  61. Mat res = corners.get(0);
  62. assertArrayEquals(new double[]{offset, offset}, res.get(0, 0), 0.0);
  63. assertArrayEquals(new double[]{size + offset - 1, offset}, res.get(0, 1), 0.0);
  64. assertArrayEquals(new double[]{size + offset - 1, size + offset - 1}, res.get(0, 2), 0.0);
  65. assertArrayEquals(new double[]{offset, size + offset - 1}, res.get(0, 3), 0.0);
  66. }
  67. public void testCharucoDetector() {
  68. Dictionary dictionary = Objdetect.getPredefinedDictionary(0);
  69. int boardSizeX = 3, boardSizeY = 3;
  70. CharucoBoard board = new CharucoBoard(new Size(boardSizeX, boardSizeY), 1.f, 0.8f, dictionary);
  71. CharucoDetector charucoDetector = new CharucoDetector(board);
  72. int cellSize = 80;
  73. Mat boardImage = new Mat();
  74. board.generateImage(new Size(cellSize*boardSizeX, cellSize*boardSizeY), boardImage);
  75. assertTrue(boardImage.total() > 0);
  76. Mat charucoCorners = new Mat();
  77. Mat charucoIds = new Mat();
  78. charucoDetector.detectBoard(boardImage, charucoCorners, charucoIds);
  79. assertEquals(4, charucoIds.total());
  80. int[] intCharucoIds = (new MatOfInt(charucoIds)).toArray();
  81. Assert.assertArrayEquals(new int[]{0, 1, 2, 3}, intCharucoIds);
  82. double eps = 0.2;
  83. assertArrayEquals(new double[]{cellSize, cellSize}, charucoCorners.get(0, 0), eps);
  84. assertArrayEquals(new double[]{2*cellSize, cellSize}, charucoCorners.get(1, 0), eps);
  85. assertArrayEquals(new double[]{cellSize, 2*cellSize}, charucoCorners.get(2, 0), eps);
  86. assertArrayEquals(new double[]{2*cellSize, 2*cellSize}, charucoCorners.get(3, 0), eps);
  87. }
  88. }