DnnBlobFromImageWithParamsTest.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package org.opencv.test.dnn;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import org.opencv.core.Core;
  6. import org.opencv.core.CvType;
  7. import org.opencv.core.Mat;
  8. import org.opencv.core.Scalar;
  9. import org.opencv.core.Size;
  10. import org.opencv.core.Range;
  11. import org.opencv.dnn.Dnn;
  12. import org.opencv.dnn.Image2BlobParams;
  13. import org.opencv.test.OpenCVTestCase;
  14. public class DnnBlobFromImageWithParamsTest extends OpenCVTestCase {
  15. public void testBlobFromImageWithParamsNHWCScalarScale()
  16. {
  17. Mat img = new Mat(10, 10, CvType.CV_8UC4, new Scalar(0, 1, 2, 3));
  18. Scalar scalefactor = new Scalar(0.1, 0.2, 0.3, 0.4);
  19. Image2BlobParams params = new Image2BlobParams();
  20. params.set_scalefactor(scalefactor);
  21. params.set_datalayout(Dnn.DNN_LAYOUT_NHWC);
  22. Mat blob = Dnn.blobFromImageWithParams(img, params); // [1, 10, 10, 4]
  23. float[] expectedValues = { (float)scalefactor.val[0] * 0, (float)scalefactor.val[1] * 1, (float)scalefactor.val[2] * 2, (float)scalefactor.val[3] * 3 }; // Target Value.
  24. for (int h = 0; h < 10; h++)
  25. {
  26. for (int w = 0; w < 10; w++)
  27. {
  28. float[] actualValues = new float[4];
  29. blob.get(new int[]{0, h, w, 0}, actualValues);
  30. for (int c = 0; c < 4; c++)
  31. {
  32. // Check equal
  33. assertEquals(expectedValues[c], actualValues[c]);
  34. }
  35. }
  36. }
  37. }
  38. public void testBlobFromImageWithParamsCustomPaddingLetterBox()
  39. {
  40. Mat img = new Mat(40, 20, CvType.CV_8UC4, new Scalar(0, 1, 2, 3));
  41. // Custom padding value that you have added
  42. Scalar customPaddingValue = new Scalar(5, 6, 7, 8); // Example padding value
  43. Size targetSize = new Size(20, 20);
  44. Mat targetImg = img.clone();
  45. Core.copyMakeBorder(targetImg, targetImg, 0, 0, (int)targetSize.width / 2, (int)targetSize.width / 2, Core.BORDER_CONSTANT, customPaddingValue);
  46. // Set up Image2BlobParams with your new functionality
  47. Image2BlobParams params = new Image2BlobParams();
  48. params.set_size(targetSize);
  49. params.set_paddingmode(Dnn.DNN_PMODE_LETTERBOX);
  50. params.set_borderValue(customPaddingValue); // Use your new feature here
  51. // Create blob with custom padding
  52. Mat blob = Dnn.blobFromImageWithParams(img, params);
  53. // Create target blob for comparison
  54. Mat targetBlob = Dnn.blobFromImage(targetImg, 1.0, targetSize);
  55. assertEquals(0, Core.norm(targetBlob, blob, Core.NORM_INF), EPS);
  56. }
  57. public void testBlobFromImageWithParams4chLetterBox()
  58. {
  59. Mat img = new Mat(40, 20, CvType.CV_8UC4, new Scalar(0, 1, 2, 3));
  60. // Construct target mat.
  61. Mat[] targetChannels = new Mat[4];
  62. // The letterbox will add zero at the left and right of output blob.
  63. // After the letterbox, every row data would have same value showing as valVec.
  64. byte[] valVec = { 0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0};
  65. Mat rowM = new Mat(1, 20, CvType.CV_8UC1);
  66. rowM.put(0, 0, valVec);
  67. for (int i = 0; i < 4; i++) {
  68. Core.multiply(rowM, new Scalar(i), targetChannels[i] = new Mat());
  69. }
  70. Mat targetImg = new Mat();
  71. Core.merge(Arrays.asList(targetChannels), targetImg);
  72. Size targetSize = new Size(20, 20);
  73. Image2BlobParams params = new Image2BlobParams();
  74. params.set_size(targetSize);
  75. params.set_paddingmode(Dnn.DNN_PMODE_LETTERBOX);
  76. Mat blob = Dnn.blobFromImageWithParams(img, params);
  77. Mat targetBlob = Dnn.blobFromImage(targetImg, 1.0, targetSize); // only convert data from uint8 to float32.
  78. assertEquals(0, Core.norm(targetBlob, blob, Core.NORM_INF), EPS);
  79. }
  80. public void testBlobFromImageWithParams4chMultiImage()
  81. {
  82. Mat img = new Mat(10, 10, CvType.CV_8UC4, new Scalar(0, 1, 2, 3));
  83. Scalar scalefactor = new Scalar(0.1, 0.2, 0.3, 0.4);
  84. Image2BlobParams param = new Image2BlobParams();
  85. param.set_scalefactor(scalefactor);
  86. param.set_datalayout(Dnn.DNN_LAYOUT_NHWC);
  87. List<Mat> images = new ArrayList<>();
  88. images.add(img);
  89. Mat img2 = new Mat();
  90. Core.multiply(img, Scalar.all(2), img2);
  91. images.add(img2);
  92. Mat blobs = Dnn.blobFromImagesWithParams(images, param);
  93. Range[] ranges = new Range[4];
  94. ranges[0] = new Range(0, 1);
  95. ranges[1] = new Range(0, blobs.size(1));
  96. ranges[2] = new Range(0, blobs.size(2));
  97. ranges[3] = new Range(0, blobs.size(3));
  98. Mat blob0 = blobs.submat(ranges).clone();
  99. ranges[0] = new Range(1, 2);
  100. Mat blob1 = blobs.submat(ranges).clone();
  101. Core.multiply(blob0, Scalar.all(2), blob0);
  102. assertEquals(0, Core.norm(blob0, blob1, Core.NORM_INF), EPS);
  103. }
  104. }