test_core.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. // This file is part of OpenCV project.
  2. // It is subject to the license terms in the LICENSE file found in the top-level directory
  3. // of this distribution and at http://opencv.org/license.html.
  4. QUnit.module('Core', {});
  5. QUnit.test('test_operations_on_arrays', function(assert) {
  6. // Transpose
  7. {
  8. let mat1 = cv.Mat.eye(9, 7, cv.CV_8UC3);
  9. let mat2 = new cv.Mat();
  10. cv.transpose(mat1, mat2);
  11. // Verify result.
  12. let size = mat2.size();
  13. assert.equal(mat2.channels(), 3);
  14. assert.equal(size.height, 7);
  15. assert.equal(size.width, 9);
  16. }
  17. // Concat
  18. {
  19. let mat = cv.Mat.ones({height: 10, width: 5}, cv.CV_8UC3);
  20. let mat2 = cv.Mat.eye({height: 10, width: 5}, cv.CV_8UC3);
  21. let mat3 = cv.Mat.eye({height: 10, width: 5}, cv.CV_8UC3);
  22. let out = new cv.Mat();
  23. let input = new cv.MatVector();
  24. input.push_back(mat);
  25. input.push_back(mat2);
  26. input.push_back(mat3);
  27. cv.vconcat(input, out);
  28. // Verify result.
  29. let size = out.size();
  30. assert.equal(out.channels(), 3);
  31. assert.equal(size.height, 30);
  32. assert.equal(size.width, 5);
  33. assert.equal(out.elemSize1(), 1);
  34. cv.hconcat(input, out);
  35. // Verify result.
  36. size = out.size();
  37. assert.equal(out.channels(), 3);
  38. assert.equal(size.height, 10);
  39. assert.equal(size.width, 15);
  40. assert.equal(out.elemSize1(), 1);
  41. input.delete();
  42. out.delete();
  43. }
  44. // Min, Max
  45. {
  46. let data1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9]);
  47. let data2 = new Uint8Array([0, 4, 0, 8, 0, 12, 0, 16, 0]);
  48. let expectedMin = new Uint8Array([0, 2, 0, 4, 0, 6, 0, 8, 0]);
  49. let expectedMax = new Uint8Array([1, 4, 3, 8, 5, 12, 7, 16, 9]);
  50. let dataPtr = cv._malloc(3*3*1);
  51. let dataPtr2 = cv._malloc(3*3*1);
  52. let dataHeap = new Uint8Array(cv.HEAPU8.buffer, dataPtr, 3*3*1);
  53. dataHeap.set(new Uint8Array(data1.buffer));
  54. let dataHeap2 = new Uint8Array(cv.HEAPU8.buffer, dataPtr2, 3*3*1);
  55. dataHeap2.set(new Uint8Array(data2.buffer));
  56. let mat1 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr, 0);
  57. let mat2 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr2, 0);
  58. let mat3 = new cv.Mat();
  59. cv.min(mat1, mat2, mat3);
  60. // Verify result.
  61. let size = mat2.size();
  62. assert.equal(mat2.channels(), 1);
  63. assert.equal(size.height, 3);
  64. assert.equal(size.width, 3);
  65. assert.deepEqual(mat3.data, expectedMin);
  66. cv.max(mat1, mat2, mat3);
  67. // Verify result.
  68. size = mat2.size();
  69. assert.equal(mat2.channels(), 1);
  70. assert.equal(size.height, 3);
  71. assert.equal(size.width, 3);
  72. assert.deepEqual(mat3.data, expectedMax);
  73. cv._free(dataPtr);
  74. cv._free(dataPtr2);
  75. }
  76. // Bitwise operations
  77. {
  78. let data1 = new Uint8Array([0, 1, 2, 4, 8, 16, 32, 64, 128]);
  79. let data2 = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255, 255]);
  80. let expectedAnd = new Uint8Array([0, 1, 2, 4, 8, 16, 32, 64, 128]);
  81. let expectedOr = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255, 255]);
  82. let expectedXor = new Uint8Array([255, 254, 253, 251, 247, 239, 223, 191, 127]);
  83. let expectedNot = new Uint8Array([255, 254, 253, 251, 247, 239, 223, 191, 127]);
  84. let dataPtr = cv._malloc(3*3*1);
  85. let dataPtr2 = cv._malloc(3*3*1);
  86. let dataHeap = new Uint8Array(cv.HEAPU8.buffer, dataPtr, 3*3*1);
  87. dataHeap.set(new Uint8Array(data1.buffer));
  88. let dataHeap2 = new Uint8Array(cv.HEAPU8.buffer, dataPtr2, 3*3*1);
  89. dataHeap2.set(new Uint8Array(data2.buffer));
  90. let mat1 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr, 0);
  91. let mat2 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr2, 0);
  92. let mat3 = new cv.Mat();
  93. let none = new cv.Mat();
  94. cv.bitwise_not(mat1, mat3, none);
  95. // Verify result.
  96. let size = mat3.size();
  97. assert.equal(mat3.channels(), 1);
  98. assert.equal(size.height, 3);
  99. assert.equal(size.width, 3);
  100. assert.deepEqual(mat3.data, expectedNot);
  101. cv.bitwise_and(mat1, mat2, mat3, none);
  102. // Verify result.
  103. size = mat3.size();
  104. assert.equal(mat3.channels(), 1);
  105. assert.equal(size.height, 3);
  106. assert.equal(size.width, 3);
  107. assert.deepEqual(mat3.data, expectedAnd);
  108. cv.bitwise_or(mat1, mat2, mat3, none);
  109. // Verify result.
  110. size = mat3.size();
  111. assert.equal(mat3.channels(), 1);
  112. assert.equal(size.height, 3);
  113. assert.equal(size.width, 3);
  114. assert.deepEqual(mat3.data, expectedOr);
  115. cv.bitwise_xor(mat1, mat2, mat3, none);
  116. // Verify result.
  117. size = mat3.size();
  118. assert.equal(mat3.channels(), 1);
  119. assert.equal(size.height, 3);
  120. assert.equal(size.width, 3);
  121. assert.deepEqual(mat3.data, expectedXor);
  122. cv._free(dataPtr);
  123. cv._free(dataPtr2);
  124. }
  125. // Arithmetic operations
  126. {
  127. let data1 = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8]);
  128. let data2 = new Uint8Array([0, 2, 4, 6, 8, 10, 12, 14, 16]);
  129. let data3 = new Uint8Array([0, 1, 0, 1, 0, 1, 0, 1, 0]);
  130. // |data1 - data2|
  131. let expectedAbsDiff = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8]);
  132. let expectedAdd = new Uint8Array([0, 3, 6, 9, 12, 15, 18, 21, 24]);
  133. const alpha = 4;
  134. const beta = -1;
  135. const gamma = 3;
  136. // 4*data1 - data2 + 3
  137. let expectedWeightedAdd = new Uint8Array([3, 5, 7, 9, 11, 13, 15, 17, 19]);
  138. let dataPtr = cv._malloc(3*3*1);
  139. let dataPtr2 = cv._malloc(3*3*1);
  140. let dataPtr3 = cv._malloc(3*3*1);
  141. let dataHeap = new Uint8Array(cv.HEAPU8.buffer, dataPtr, 3*3*1);
  142. dataHeap.set(new Uint8Array(data1.buffer));
  143. let dataHeap2 = new Uint8Array(cv.HEAPU8.buffer, dataPtr2, 3*3*1);
  144. dataHeap2.set(new Uint8Array(data2.buffer));
  145. let dataHeap3 = new Uint8Array(cv.HEAPU8.buffer, dataPtr3, 3*3*1);
  146. dataHeap3.set(new Uint8Array(data3.buffer));
  147. let mat1 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr, 0);
  148. let mat2 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr2, 0);
  149. let mat3 = new cv.Mat(3, 3, cv.CV_8UC1, dataPtr3, 0);
  150. let dst = new cv.Mat();
  151. let none = new cv.Mat();
  152. cv.absdiff(mat1, mat2, dst);
  153. // Verify result.
  154. let size = dst.size();
  155. assert.equal(dst.channels(), 1);
  156. assert.equal(size.height, 3);
  157. assert.equal(size.width, 3);
  158. assert.deepEqual(dst.data, expectedAbsDiff);
  159. cv.add(mat1, mat2, dst, none, -1);
  160. // Verify result.
  161. size = dst.size();
  162. assert.equal(dst.channels(), 1);
  163. assert.equal(size.height, 3);
  164. assert.equal(size.width, 3);
  165. assert.deepEqual(dst.data, expectedAdd);
  166. cv.addWeighted(mat1, alpha, mat2, beta, gamma, dst, -1);
  167. // Verify result.
  168. size = dst.size();
  169. assert.equal(dst.channels(), 1);
  170. assert.equal(size.height, 3);
  171. assert.equal(size.width, 3);
  172. assert.deepEqual(dst.data, expectedWeightedAdd);
  173. // default parameter
  174. cv.addWeighted(mat1, alpha, mat2, beta, gamma, dst);
  175. // Verify result.
  176. size = dst.size();
  177. assert.equal(dst.channels(), 1);
  178. assert.equal(size.height, 3);
  179. assert.equal(size.width, 3);
  180. assert.deepEqual(dst.data, expectedWeightedAdd);
  181. mat1.delete();
  182. mat2.delete();
  183. mat3.delete();
  184. dst.delete();
  185. none.delete();
  186. }
  187. // Invert
  188. {
  189. let inv1 = new cv.Mat();
  190. let inv2 = new cv.Mat();
  191. let inv3 = new cv.Mat();
  192. let inv4 = new cv.Mat();
  193. let data1 = new Float32Array([1, 0, 0,
  194. 0, 1, 0,
  195. 0, 0, 1]);
  196. let data2 = new Float32Array([0, 0, 0,
  197. 0, 5, 0,
  198. 0, 0, 0]);
  199. let data3 = new Float32Array([1, 1, 1, 0,
  200. 0, 3, 1, 2,
  201. 2, 3, 1, 0,
  202. 1, 0, 2, 1]);
  203. let data4 = new Float32Array([1, 4, 5,
  204. 4, 2, 2,
  205. 5, 2, 2]);
  206. let expected1 = new Float32Array([1, 0, 0,
  207. 0, 1, 0,
  208. 0, 0, 1]);
  209. // Inverse does not exist!
  210. let expected3 = new Float32Array([-3, -1/2, 3/2, 1,
  211. 1, 1/4, -1/4, -1/2,
  212. 3, 1/4, -5/4, -1/2,
  213. -3, 0, 1, 1]);
  214. let expected4 = new Float32Array([0, -1, 1,
  215. -1, 23/2, -9,
  216. 1, -9, 7]);
  217. let dataPtr1 = cv._malloc(3*3*4);
  218. let dataPtr2 = cv._malloc(3*3*4);
  219. let dataPtr3 = cv._malloc(4*4*4);
  220. let dataPtr4 = cv._malloc(3*3*4);
  221. let dataHeap = new Float32Array(cv.HEAP32.buffer, dataPtr1, 3*3);
  222. dataHeap.set(new Float32Array(data1.buffer));
  223. let dataHeap2 = new Float32Array(cv.HEAP32.buffer, dataPtr2, 3*3);
  224. dataHeap2.set(new Float32Array(data2.buffer));
  225. let dataHeap3 = new Float32Array(cv.HEAP32.buffer, dataPtr3, 4*4);
  226. dataHeap3.set(new Float32Array(data3.buffer));
  227. let dataHeap4 = new Float32Array(cv.HEAP32.buffer, dataPtr4, 3*3);
  228. dataHeap4.set(new Float32Array(data4.buffer));
  229. let mat1 = new cv.Mat(3, 3, cv.CV_32FC1, dataPtr1, 0);
  230. let mat2 = new cv.Mat(3, 3, cv.CV_32FC1, dataPtr2, 0);
  231. let mat3 = new cv.Mat(4, 4, cv.CV_32FC1, dataPtr3, 0);
  232. let mat4 = new cv.Mat(3, 3, cv.CV_32FC1, dataPtr4, 0);
  233. QUnit.assert.deepEqualWithTolerance = function( value, expected, tolerance ) {
  234. for (let i = 0; i < value.length; i= i+1) {
  235. this.pushResult( {
  236. result: Math.abs(value[i]-expected[i]) < tolerance,
  237. actual: value[i],
  238. expected: expected[i],
  239. } );
  240. }
  241. };
  242. cv.invert(mat1, inv1, 0);
  243. // Verify result.
  244. let size = inv1.size();
  245. assert.equal(inv1.channels(), 1);
  246. assert.equal(size.height, 3);
  247. assert.equal(size.width, 3);
  248. assert.deepEqualWithTolerance(inv1.data32F, expected1, 0.0001);
  249. cv.invert(mat2, inv2, 0);
  250. // Verify result.
  251. assert.deepEqualWithTolerance(inv3.data32F, expected3, 0.0001);
  252. cv.invert(mat3, inv3, 0);
  253. // Verify result.
  254. size = inv3.size();
  255. assert.equal(inv3.channels(), 1);
  256. assert.equal(size.height, 4);
  257. assert.equal(size.width, 4);
  258. assert.deepEqualWithTolerance(inv3.data32F, expected3, 0.0001);
  259. cv.invert(mat3, inv3, 1);
  260. // Verify result.
  261. assert.deepEqualWithTolerance(inv3.data32F, expected3, 0.0001);
  262. cv.invert(mat4, inv4, 2);
  263. // Verify result.
  264. assert.deepEqualWithTolerance(inv4.data32F, expected4, 0.0001);
  265. cv.invert(mat4, inv4, 3);
  266. // Verify result.
  267. assert.deepEqualWithTolerance(inv4.data32F, expected4, 0.0001);
  268. mat1.delete();
  269. mat2.delete();
  270. mat3.delete();
  271. mat4.delete();
  272. inv1.delete();
  273. inv2.delete();
  274. inv3.delete();
  275. inv4.delete();
  276. }
  277. //Rotate
  278. {
  279. let dst = new cv.Mat();
  280. let src = cv.matFromArray(3, 2, cv.CV_8U, [1,2,3,4,5,6]);
  281. cv.rotate(src, dst, cv.ROTATE_90_CLOCKWISE);
  282. let size = dst.size();
  283. assert.equal(size.height, 2, "ROTATE_HEIGHT");
  284. assert.equal(size.width, 3, "ROTATE_WIGTH");
  285. let expected = new Uint8Array([5,3,1,6,4,2]);
  286. assert.deepEqual(dst.data, expected);
  287. dst.delete();
  288. src.delete();
  289. }
  290. });
  291. QUnit.test('test_LUT', function(assert) {
  292. {
  293. let src = cv.matFromArray(3, 3, cv.CV_8UC1, [255, 128, 0, 0, 128, 255, 1, 2, 254]);
  294. let lutTable = [];
  295. for (let i = 0; i < 256; i++)
  296. {
  297. lutTable[i] = 255 - i;
  298. }
  299. let lut = cv.matFromArray(1, 256, cv.CV_8UC1, lutTable);
  300. let dst = new cv.Mat();
  301. cv.LUT(src, lut, dst);
  302. // Verify result.
  303. assert.equal(dst.ucharAt(0), 0);
  304. assert.equal(dst.ucharAt(1), 127);
  305. assert.equal(dst.ucharAt(2), 255);
  306. assert.equal(dst.ucharAt(3), 255);
  307. assert.equal(dst.ucharAt(4), 127);
  308. assert.equal(dst.ucharAt(5), 0);
  309. assert.equal(dst.ucharAt(6), 254);
  310. assert.equal(dst.ucharAt(7), 253);
  311. assert.equal(dst.ucharAt(8), 1);
  312. src.delete();
  313. lut.delete();
  314. dst.delete();
  315. }
  316. });