├── LICENSE ├── README.md ├── Test.html └── opencv.js /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Haoking 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # opencvjs 2 |  3 | 4 | Complete opencvjs.(With the lastest OpenCV 4.0.0+) 5 | 6 | The official opencv.js stoped update. Moreover, it still has many errors from the last offical version. 7 | 8 | This project is inherited from official opencv.js. 9 | 10 | Which means all of the methods in opencv.js works here, also, fix most of the errors. 11 | 12 | But much more performance improved. 13 | 14 | ## Features 15 | 16 | - [x] OpenCVJS writen by native JS which means this project can be used directly in the browser or JS project, or node.js 17 | - [x] OpenCVJS is the easiest to install as one .js file 18 | - [x] OpenCVJS has achieved most of the OpenCV C++ functions 19 | - [x] Some of the bad efficient methods implemented on js encapsulate the c++ method directly by using WebAssembly 20 | - [x] Almost every method's performance is faster than total JS implemented 21 | - [x] Performance is acceptted on web real-time face tracking 22 | - [x] The fasttest matix operate functions 23 | - [x] Every funcation is tested 24 | 25 | ## Requirements 26 | 27 | - Native JS 28 | - OpenCV 4.0.0+ 29 | 30 | ## Communication 31 | 32 | - If you **found a bug**, open an issue. 33 | - If you **have a feature request**, open an issue. 34 | - If you **want to contribute**, submit a pull request. 35 | 36 | ## Installation 37 | 38 | ### Javascript 39 | 40 | Async invoke opencv.js: 41 | 42 | ```javascript 43 | 44 | ``` 45 | 46 | Do coding after `onOpenCVReady`: 47 | 48 | ```ruby 49 | 56 | ``` 57 | 58 | ------ 59 | 60 | ## Usage 61 | 62 | ### Commonly 63 | 64 | **add()** 65 | 66 | void cv.add(src1, src2, dst) 67 | 68 | ( dst = src1 + src2 ) 69 | 70 | src1 First input mat 71 | 72 | src2 Second input mat 73 | 74 | dst Output mat that has the same size and number of channels as the input mat 75 | 76 | ```javascript 77 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 78 | let mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 79 | let dst = new cv.Mat(); 80 | cv.add(mat1, mat2, dst); 81 | mat1.delete(), mat2.delete(); 82 | //Don't forget to delete cv.Mat when you don't want to use it any more. 83 | console.log("dst::" + dst.data32F);//dst::2,4,6,8,10,12,14,16,18 84 | ``` 85 | 86 | **addConstant()** 87 | 88 | cv.Mat dst = src1.addConstant(constant) 89 | 90 | ( dst = src1 + constant ) 91 | 92 | src1 First input mat 93 | 94 | constant Constant added to each element. 95 | 96 | dst Output mat that has the same size and number of channels as the input mat 97 | 98 | ```javascript 99 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 100 | let dst = mat1.addConstant(10); 101 | mat1.delete(); 102 | console.log("dst::" + dst.data32F);//dst::11,12,13,14,15,16,17,18,19 103 | ``` 104 | **subtract()** 105 | 106 | void cv.subtract(src1, src2, dst) 107 | 108 | ( dst = src1 - src2 ) 109 | 110 | src1 First input mat 111 | 112 | src2 Second input mat 113 | 114 | dst Output mat that has the same size and number of channels as the input mat 115 | 116 | ```javascript 117 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 118 | let mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 119 | let dst = new cv.Mat(); 120 | cv.subtract(mat1, mat2, dst); 121 | mat1.delete(), mat2.delete(); 122 | //Don't forget to delete cv.Mat when you don't want to use it any more. 123 | console.log("dst::" + dst.data32F);//dst::0,0,0,0,0,0,0,0,0 124 | ``` 125 | 126 | **constantSubtract()** 127 | 128 | cv.Mat dst = src1.constantSubtract(constant) 129 | 130 | ( dst = constant - src1 ) 131 | 132 | constant Constant subtract each element. 133 | 134 | src1 First input mat 135 | 136 | dst Output mat that has the same size and number of channels as the input mat 137 | 138 | ```javascript 139 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 140 | let dst = mat1.constantSubtract(10); 141 | mat1.delete(); 142 | console.log("dst::" + dst.data32F);//dst::9,8,7,6,5,4,3,2,1 143 | ``` 144 | 145 | **mmul()** 146 | 147 | cv.Mat dst = src1.mul(src2) 148 | 149 | ( dst = src1 * src2 ) 150 | 151 | src1 First input mat 152 | 153 | src2 Second input mat 154 | 155 | dst Output mat that has the same size and number of channels as the input mat 156 | 157 | ```javascript 158 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 159 | let mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 160 | let dst = mat1.mmul(mat2); 161 | mat1.delete(), mat2.delete(); 162 | console.log("dst::" + dst.data32F);//dst::30,36,42,66,81,96,102,126,150 163 | ``` 164 | 165 | **mul()** 166 | 167 | cv.Mat dst = src1.mul(src2, scale) 168 | 169 | ( dst = src1 • src2*scale ) 170 | 171 | src1 First input mat 172 | 173 | src2 Second input mat 174 | 175 | scale Optional scale factor. 176 | 177 | dst Output mat that has the same size and number of channels as the input mat 178 | 179 | ```javascript 180 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 181 | let mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 182 | let dst = mat1.mul(mat2, 2); 183 | mat1.delete(), mat2.delete(); 184 | console.log("dst::" + dst.data32F);//dst::2,8,18,32,50,72,98,128,162 185 | ``` 186 | 187 | **mulConstant()** 188 | 189 | cv.Mat dst = src1.mulConstant(constant) 190 | 191 | ( dst = src1 * constant ) 192 | 193 | src1 First input mat 194 | 195 | constant Constant added to each element. 196 | 197 | dst Output mat that has the same size and number of channels as the input mat 198 | 199 | ```javascript 200 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 201 | let dst = mat1.mulConstant(10); 202 | mat1.delete(); 203 | console.log("dst::" + dst.data32F);//dst::10,20,30,40,50,60,70,80,90 204 | ``` 205 | 206 | **divide()** 207 | 208 | void cv.divide(src1, src2, dst) 209 | 210 | ( dst = src1 / src1 ) 211 | 212 | src1 First input mat 213 | 214 | src2 Second input mat 215 | 216 | dst Output mat that has the same size and number of channels as the input mat 217 | 218 | ```javascript 219 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 220 | let mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 221 | let dst = new cv.Mat(); 222 | cv.divide(mat1, mat2, dst); 223 | mat1.delete(), mat2.delete(); 224 | console.log("dst::" + dst.data32F);//dst::1,1,1,1,1,1,1,1,1 225 | ``` 226 | 227 | **constantDivide()** 228 | 229 | cv.Mat dst = src1.constantDivide(constant) 230 | 231 | ( dst = constant / src1 ) 232 | 233 | constant Constant subtract each element. 234 | 235 | src1 First input mat 236 | 237 | dst Output mat that has the same size and number of channels as the input mat 238 | 239 | ```javascript 240 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 241 | let dst = mat1.constantDivide(10); 242 | mat1.delete(); 243 | console.log("dst::" + dst.data32F); 244 | //dst::10,5,3.3333332538604736,2.5,2,1.6666666269302368,1.4285714626312256,1.25,1.1111111640930176 245 | ``` 246 | 247 | **reshape()** 248 | 249 | Cv.Mat dst = src1.reshape(rows) 250 | 251 | src1 First input mat 252 | 253 | rows Reshape to rows 254 | 255 | dst Output mat that has the same data of src1, but the row is equal to input rows 256 | 257 | ```javascript 258 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 259 | let dst = mat1.reshape(1); 260 | mat1.delete(); 261 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols); 262 | //dst::1,2,3,4,5,6,7,8,9:::1:::9 263 | dst.delete();//Don't forget to delete cv.Mat when you don't want to use it any more. 264 | ``` 265 | 266 | **sum()** 267 | 268 | Float dst = src1.sum() 269 | 270 | src1 First input mat 271 | 272 | dst Sum of src1 data 273 | 274 | ```javascript 275 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 276 | let sum = mat1.sum(); 277 | mat1.delete(); 278 | console.log("dst::" + dst);//dst::45 279 | ``` 280 | 281 | **norm()** 282 | 283 | Float dst = cv.norm(src1) 284 | 285 | src1 First input mat 286 | 287 | dst Norm of src1 288 | 289 | ```javascript 290 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 291 | let dst = cv.norm(mat1); 292 | mat1.delete(); 293 | console.log("dst::" + dst);//dst::16.881943016134134 294 | ``` 295 | 296 | **norm2()** 297 | 298 | Float dst = cv.norm(src1, src2) 299 | 300 | src1 First input mat 301 | 302 | src2 Second input mat 303 | 304 | dst Norm of src1 and src2 305 | 306 | ```javascript 307 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 308 | let mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[9,10,11,12,13,14,15,16,17]); 309 | let dst2 = cv.norm2(mat1, mat2); 310 | mat1.delete(), mat2.delete(); 311 | console.log("dst2::" + dst2);//dst2::24 312 | ``` 313 | 314 | **Diag()** 315 | 316 | cv.Mat dst = src1.diag(d = 0) 317 | 318 | src1 First input mat 319 | 320 | d Index of the diagonal 321 | 322 | dst Output mat that has the same data of src1, but the row is equal to input rows 323 | 324 | ```javascript 325 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 326 | let dst = mat1.Diag(); 327 | mat1.delete(); 328 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols); 329 | //dst::1,5,9:::3:::1 330 | ``` 331 | 332 | **vconcat()** 333 | 334 | cv.Mat dst = src1.vconcat(src2) 335 | 336 | src1 First input mat 337 | 338 | src2 Second input mat has the same cols as the first input mat 339 | 340 | dst Output mat that has the same number of channels as the input mat 341 | 342 | ```javascript 343 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 344 | let dst = mat1.vconcat(mat1); 345 | mat1.delete(); 346 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols); 347 | //dst::1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9:::6:::3 348 | ``` 349 | 350 | **hconcat()** 351 | 352 | cv.Mat dst = src1.hconcat(src2) 353 | 354 | src1 First input mat 355 | 356 | src2 Second input mat has the same rows as the first input mat 357 | 358 | dst Output mat that has the same number of channels as the input mat 359 | 360 | ```javascript 361 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 362 | let dst = mat1.hconcat(mat1); 363 | mat1.delete(); 364 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols); 365 | //dst::1,2,3,1,2,3,4,5,6,4,5,6,7,8,9,7,8,9:::3:::6 366 | ``` 367 | 368 | **row()** 369 | 370 | cv.Mat dst = src1.row(row) 371 | 372 | src1 First input mat 373 | 374 | row Index of the rows 375 | 376 | dst Output mat that has one row 377 | 378 | ```javascript 379 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 380 | let dst = mat1.row(2); 381 | mat1.delete(); 382 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols); 383 | //dst::7,8,9:::1:::3 384 | ``` 385 | 386 | **col()** 387 | 388 | cv.Mat dst = src1.col(col) 389 | 390 | src1 First input mat 391 | 392 | col Index of the cols 393 | 394 | dst Output mat that has one col 395 | 396 | ```javascript 397 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 398 | let dst = mat1.col(2); 399 | mat1.delete(); 400 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols); 401 | //dst::3,6,9:::3:::1 402 | ``` 403 | 404 | **replaceMatOnRect()** 405 | 406 | void src1.replaceMatOnRect(src2, rect) 407 | 408 | src1 First input mat will be changed as output 409 | 410 | src2 Second input mat as rect mat 411 | 412 | rect rect input to replace 413 | 414 | ```javascript 415 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 416 | let rect1 = new cv.Rect(1, 1, 2, 2); 417 | let rectmat = cv.matFromArray(2,2,cv.CV_32FC1,[11,12,13,14]); 418 | mat1.replaceMatOnRect(rectmat, rect1); 419 | console.log("mat1::" + mat1.data32F + ":::" + mat1.rows + ":::" + mat1.cols); 420 | //mat1::1,2,3,4,11,12,7,13,14:::3:::3 421 | ``` 422 | 423 | **replaceMatOnRow()** 424 | 425 | void src1.replaceMatOnRow(arr, row) 426 | 427 | src1 First input mat will be changed as output 428 | 429 | arr Second input Array as row array 430 | 431 | row row input to replace 432 | 433 | ```javascript 434 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 435 | mat1.replaceMatOnRow([11,12,13], 1); 436 | console.log("mat1::" + mat1.data32F + ":::" + mat1.rows + ":::" + mat1.cols); 437 | //mat1::1,2,3,11,12,13,7,8,9:::3:::3 438 | ``` 439 | 440 | **replaceMatOnCol()** 441 | 442 | void src1.replaceMatOnCol(arr, col) 443 | 444 | src1 First input mat will be changed as output 445 | 446 | arr Second input Array as row array 447 | 448 | col col input to replace 449 | 450 | ```javascript 451 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 452 | mat1.replaceMatOnCol([11,12,13], 1); 453 | console.log("mat1::" + mat1.data32F + ":::" + mat1.rows + ":::" + mat1.cols); 454 | //mat1::1,11,3,4,12,6,7,13,9:::3:::3 455 | ``` 456 | 457 | **replaceMatOnPoint()** 458 | 459 | void src1.replaceMatOnPoint(constant, point) 460 | 461 | src1 First input mat will be changed as output 462 | 463 | constant Second input constant tp replace at the point 464 | 465 | point Point location 466 | 467 | ```javascript 468 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 469 | mat1.replaceMatOnPoint(30, {x:1,y:1}); 470 | console.log("mat1::" + mat1.data32F + ":::" + mat1.rows + ":::" + mat1.cols); 471 | //mat1::1,11,3,4,12,6,7,13,9:::3:::3 472 | ``` 473 | 474 | **addOnCol()** 475 | 476 | void src1.addOnCol(constant, col) 477 | 478 | src1 First input mat will be changed as output 479 | 480 | constant Second input constant tp replace at the point 481 | 482 | col Col location 483 | 484 | ```javascript 485 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 486 | mat1.addOnCol(30, 1); 487 | console.log("mat1::" + mat1.data32F + ":::" + mat1.rows + ":::" + mat1.cols); 488 | //mat1::1,11,3,4,12,6,7,13,9:::3:::3 489 | ``` 490 | 491 | **rectAdd()** 492 | 493 | void src1.rectAdd(src2, rect) 494 | 495 | src1 First input mat will be changed as output 496 | 497 | src2 Second input mat as rect mat 498 | 499 | rect rect input to add location 500 | 501 | ```javascript 502 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 503 | let rect1 = new cv.Rect(1, 1, 2, 2); 504 | let rectmat = cv.matFromArray(2,2,cv.CV_32FC1,[11,12,13,14]); 505 | mat1.rectAdd(rectmat, rect1); 506 | console.log("mat1::" + mat1.data32F + ":::" + mat1.rows + ":::" + mat1.cols); 507 | //mat1::1,2,3,4,11,12,7,13,14:::3:::3 508 | ``` 509 | 510 | **rectSubtract()** 511 | 512 | void src1.rectSubtract(src2, rect) 513 | 514 | src1 First input mat will be changed as output 515 | 516 | src2 Second input mat as rect mat 517 | 518 | rect rect input to subtract location 519 | 520 | ```javascript 521 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 522 | let rect1 = new cv.Rect(1, 1, 2, 2); 523 | let rectmat = cv.matFromArray(2,2,cv.CV_32FC1,[11,12,13,14]); 524 | mat1.rectSubtract(rectmat, rect1); 525 | console.log("mat1::" + mat1.data32F + ":::" + mat1.rows + ":::" + mat1.cols); 526 | //mat1::1,2,3,4,11,12,7,13,14:::3:::3 527 | ``` 528 | 529 | **mds()** 530 | 531 | {m:Float, d:Array, s:Float} dst = src1.mds() 532 | 533 | src1 First input mat 534 | 535 | dst Output with {mean, dev, stddev} 536 | 537 | ```javascript 538 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 539 | let dst = mat1.mds(); 540 | mat1.delete(); 541 | console.log("dst::" + dst.m + ":::" + dst.d + ":::" + dst.s); 542 | //dst::5:::16,9,4,1,0,1,4,9,16:::2.581988897471611 543 | ``` 544 | 545 | **roi()** 546 | 547 | Cv.Mat dst = src1.roi(rect) 548 | 549 | src1 First input mat 550 | 551 | rect a rect 552 | 553 | dst Output mat that has the same size and number of channels as the input rect 554 | 555 | ```javascript 556 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 557 | let rect1 = new cv.Rect(1, 1, 2, 2) 558 | let dst = mat1.roi(rect1); 559 | mat1.delete(); 560 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols); 561 | //dst::5,6,8,9:::2:::2 562 | ``` 563 | 564 | **svd()** 565 | 566 | {u:cv.Mat, w:cv.Mat, vt:cv.Mat} dst = src1.svd() 567 | 568 | src1 First input mat 569 | 570 | dst Output with {u, w, vt} 571 | 572 | ```javascript 573 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 574 | let s = mat1.svd(); 575 | mat1.delete(); 576 | console.log("sssss::" + s.u.data32F + ":::" + s.w.data32F + "::::" + s.vt.data32F); 577 | //sssss::-0.2690670727222803,-0.6798212121523656,-0.6822360514399335,0.9620092303255996,-0.15566952916310073,-0.22428829318197974,-0.04627257443681115,0.7166659732384585,-0.6958798255856847:::817.7596679296927,2.4749744909160456,0.002964523081211532::::0.6822778524193859,-0.6671413517114333,-0.29903068226292867,0.22871202334807922,-0.19371852220929917,0.9540251278289649,0.6943973952097016,0.7193021277527875,-0.020413391102276603 578 | ``` 579 | 580 | **RodriguesFromArray()** 581 | 582 | cv.Mat dst = cv.RodriguesFromArray(arr1) 583 | 584 | arr1 First input array 585 | 586 | dst the mat rodrigues from the input array 587 | 588 | ```javascript 589 | let arr1 = [1,2,3,4,5,6,7,8,9]; 590 | let dst = cv.RodriguesFromArray(arr1); 591 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols); 592 | //dst::-0.694920539855957,0.7135210037231445,0.08929285407066345,-0.19200697541236877,-0.3037850260734558,0.9331923723220825,0.6929781436920166,0.6313496828079224,0.34810739755630493:::3:::3 593 | ``` 594 | 595 | **RodriguesFromMat()** 596 | 597 | [x, y, z] dst = src1.RodriguesFromMat() 598 | 599 | src1 First input mat 600 | 601 | dst the mat rodrigues from the input array 602 | 603 | ```javascript 604 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 605 | let dst = mat1.RodriguesFromMat(); 606 | console.log("dst::" + dst); 607 | //dst::1.1046628653680794,1.738419705279746,2.372176486533247 608 | ``` 609 | 610 | **dftSplit()** 611 | 612 | {r:realMat, i:imagMat} dst = src1.dftSplit() 613 | 614 | src1 First input mat 615 | 616 | dst the mat rodrigues from the input array 617 | 618 | ```javascript 619 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 620 | let dst = mat1.dftSplit(); 621 | console.log("dst::" + dst.r.data32F + ":::" + dst.i.data32F); 622 | //dst::1,3,0,4,6,0,0,8,0:::0,3,0,7,9,0,0,9,0 623 | ``` 624 | 625 | **mulSpectrums()** 626 | 627 | cv.Mat dst = cv.mulSpectrums(src1, src2, conjB = false) 628 | 629 | src1 First input mat 630 | 631 | src2 Second input mat 632 | 633 | conjB Default is false 634 | 635 | dst Result of mat 636 | 637 | ```javascript 638 | let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]); 639 | let mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[9,10,11,12,13,14,15,16,17]); 640 | let dst = cv.mulSpectrums(mat1, mat2, true); 641 | mat1.delete(), mat2.delete(); 642 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols); 643 | //dst::9,8.96831017167883e-44,66,153,4.624284932271896e-44,237,NaN,1.2534558711446916e-39,NaN:::3:::3 644 | ``` 645 | 646 | **mulSpectrums2Channel()** 647 | 648 | cv.Mat dst = cv.mulSpectrums2Channel(src1, src2, conjB = false) 649 | 650 | src1 First input mat 651 | 652 | src2 Second input mat 653 | 654 | conjB Default is false 655 | 656 | dst Result of mat 657 | 658 | ```javascript 659 | let mat1_2channels = cv.matFromArray(3,3,cv.CV_32FC2,[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]); 660 | let mat2_2channels = cv.matFromArray(3,3,cv.CV_32FC2,[9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17]); 661 | let dst = cv.mulSpectrums2Channel(mat1_2channels, mat2_2channels, true); 662 | console.log("dst::" + dst.data32F + ":::" + dst.rows + ":::" + dst.cols + ":::" + dst.channels()); 663 | //dst::29,8.96831017167883e-44,81,233,4.624284932271896e-44,162,NaN,1.2534558711446916e-39,NaN:::3:::3:::1 664 | ``` 665 | 666 | ## 667 | 668 | ### Others 669 | 670 | **default constructor** 671 | 672 | ```javascript 673 | let mat = new cv.Mat(); 674 | let mat = new cv.Mat(size, type); 675 | let mat = new cv.Mat(rows, cols, type); 676 | let mat = new cv.Mat(rows, cols, type, new cv.Scalar()); 677 | let mat = cv.matFromArray(rows, cols, type, array); 678 | 679 | let ctx = canvas.getContext("2d"); 680 | let imgData = ctx.getImageData(0, 0, canvas.width, canvas.height); 681 | let mat = cv.matFromImageData(imgData); 682 | 683 | let mat = cv.Mat.zeros(rows, cols, type); 684 | let mat = cv.Mat.ones(rows, cols, type); 685 | let mat = cv.Mat.eye(rows, cols, type); 686 | ``` 687 | 688 | **copy Mat** 689 | 690 | ```javascript 691 | let dst = src.clone(); 692 | src.copyTo(dst, mask); 693 | ``` 694 | 695 | **convert type** 696 | 697 | ```javascript 698 | src.convertTo(m, rtype, alpha = 1, beta = 0); 699 | ``` 700 | 701 | **MatVector** 702 | 703 | ```javascript 704 | let mat = new cv.Mat(); 705 | let matVec = new cv.MatVector(); 706 | matVec.push_back(mat); 707 | let cnt = matVec.get(0); 708 | mat.delete(); matVec.delete(); cnt.delete(); 709 | ``` 710 | 711 | **data** 712 | 713 | ```javascript 714 | [Data Properties] [C++ Type] [JavaScript Typed Array] [Mat Type] 715 | data uchar Uint8Array CV_8U 716 | data8S char Int8Array CV_8S 717 | data16U ushort Uint16Array CV_16U 718 | data16S short Int16Array CV_16S 719 | data32S int Int32Array CV_32S 720 | data32F float Float32Array CV_32F 721 | data64F double Float64Array CV_64F 722 | 723 | // row = 3, col = 4, channels = 4 724 | let R = src.data[row * src.cols * src.channels() + col * src.channels()]; 725 | let G = src.data[row * src.cols * src.channels() + col * src.channels() + 1]; 726 | let B = src.data[row * src.cols * src.channels() + col * src.channels() + 2]; 727 | let A = src.data[row * src.cols * src.channels() + col * src.channels() + 3]; 728 | ``` 729 | 730 | **at** 731 | 732 | ```javascript 733 | [Mat Type] [At Manipulation] 734 | CV_8U ucharAt 735 | CV_8S charAt 736 | CV_16U ushortAt 737 | CV_16S shortAt 738 | CV_32S intAt 739 | CV_32F floatAt 740 | CV_64F doubleAt 741 | 742 | //row = 3, col = 4, channels = 4 743 | let R = src.ucharAt(row, col * src.channels()); 744 | let G = src.ucharAt(row, col * src.channels() + 1); 745 | let B = src.ucharAt(row, col * src.channels() + 2); 746 | let A = src.ucharAt(row, col * src.channels() + 3); 747 | ``` 748 | 749 | **ptr** 750 | 751 | ```javascript 752 | [Mat Type] [Ptr Manipulation] [JavaScript Typed Array] 753 | CV_8U ucharPtr Uint8Array 754 | CV_8S charPtr Int8Array 755 | CV_16U ushortPtr Uint16Array 756 | CV_16S shortPtr Int16Array 757 | CV_32S intPtr Int32Array 758 | CV_32F floatPtr Float32Array 759 | CV_64F doublePtr Float64Array 760 | 761 | //row = 3, col = 4, channels = 4 762 | let pixel = src.ucharPtr(row, col); 763 | let R = pixel[0]; 764 | let G = pixel[1]; 765 | let B = pixel[2]; 766 | let A = pixel[3]; 767 | ``` 768 | 769 | **Bitwise Operations** 770 | 771 | ```javascript 772 | cv.bitwise_not(); 773 | cv.bitwise_and(); 774 | cv.bitwise_or(); 775 | cv.bitwise_xor(); 776 | ``` 777 | 778 | **Point** 779 | 780 | ```javascript 781 | let point = new cv.Point(x, y); 782 | let point = {x: x, y: y}; 783 | ``` 784 | 785 | **Scalar** 786 | 787 | ```javascript 788 | let scalar = new cv.Scalar(R, G, B, Alpha); 789 | let scalar = [R, G, B, Alpha]; 790 | ``` 791 | 792 | **Size** 793 | 794 | ```javascript 795 | let size = new cv.Size(width, height); 796 | let size = {width : width, height : height}; 797 | ``` 798 | 799 | **Circle** 800 | 801 | ```javascript 802 | let circle = new cv.Circle(center, radius); 803 | let circle = {center : center, radius : radius}; 804 | ``` 805 | 806 | **Rect** 807 | 808 | ```javascript 809 | let rect = new cv.Rect(x, y, width, height); 810 | let rect = {x : x, y : y, width : width, height : height}; 811 | ``` 812 | 813 | **RotatedRect** 814 | 815 | ```javascript 816 | let rotatedRect = new cv.RotatedRect(center, size, angle); 817 | let rotatedRect = {center : center, size : size, angle : angle}; 818 | 819 | let vertices = cv.RotatedRect.points(rotatedRect); 820 | let point1 = vertices[0]; 821 | let point2 = vertices[1]; 822 | let point3 = vertices[2]; 823 | let point4 = vertices[3]; 824 | 825 | let boundingRect = cv.RotatedRect.boundingRect(rotatedRect); 826 | ``` 827 | 828 | **cvtColor** 829 | 830 | ```javascript 831 | cv.cvtColor(src, dst, cv.COLOR_RGBA2GRAY, 0); 832 | ``` 833 | 834 | **inRange** 835 | 836 | ```javascript 837 | cv.inRange(src, low, high, dst); 838 | ``` 839 | 840 | **Scaling** 841 | 842 | ```javascript 843 | cv.resize (src, dst, dsize, fx = 0, fy = 0, interpolation = cv.INTER_LINEAR) 844 | ``` 845 | 846 | **Translation** 847 | 848 | ```javascript 849 | cv.warpAffine (src, dst, M, dsize, flags = cv.INTER_LINEAR, borderMode = cv.BORDER_CONSTANT, borderValue = new cv.Scalar()) 850 | ``` 851 | 852 | **Rotation** 853 | 854 | ```javascript 855 | cv.getRotationMatrix2D (center, angle, scale) 856 | ``` 857 | 858 | **Affine Transformation** 859 | 860 | ```javascript 861 | cv.getAffineTransform (src, dst) 862 | ``` 863 | 864 | **Perspective Transformation** 865 | 866 | ```javascript 867 | let M = cv.getPerspectiveTransform(srcTri, dstTri); 868 | cv.warpPerspective(src, dst, M, dsize, cv.INTER_LINEAR, cv.BORDER_CONSTANT, new cv.Scalar()); 869 | ``` 870 | 871 | **Simple Thresholding** 872 | 873 | ```javascript 874 | cv.threshold(src, dst, 177, 200, cv.THRESH_BINARY); 875 | ``` 876 | 877 | **Adaptive Thresholding** 878 | 879 | ```javascript 880 | //cv.adaptiveThreshold (src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C) 881 | cv.adaptiveThreshold(src, dst, 200, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 3, 2); 882 | ``` 883 | 884 | **2D Convolution ( Image Filtering )** 885 | 886 | ```javascript 887 | //cv.filter2D (src, dst, ddepth, kernel, anchor = new cv.Point(-1, -1), delta = 0, borderType = cv.BORDER_DEFAULT) 888 | cv.filter2D(src, dst, cv.CV_8U, M, anchor, 0, cv.BORDER_DEFAULT); 889 | ``` 890 | 891 | **Image Blurring (Image Smoothing)** 892 | 893 | ```javascript 894 | //cv.blur (src, dst, ksize, anchor = new cv.Point(-1, -1), borderType = cv.BORDER_DEFAULT) 895 | cv.blur(src, dst, ksize, anchor, cv.BORDER_DEFAULT); 896 | 897 | //cv.boxFilter (src, dst, ddepth, ksize, anchor = new cv.Point(-1, -1), normalize = true, borderType = cv.BORDER_DEFAULT) 898 | cv.boxFilter(src, dst, -1, ksize, anchor, true, cv.BORDER_DEFAULT) 899 | 900 | //cv.GaussianBlur (src, dst, ksize, sigmaX, sigmaY = 0, borderType = cv.BORDER_DEFAULT) 901 | cv.GaussianBlur(src, dst, ksize, 0, 0, cv.BORDER_DEFAULT); 902 | 903 | //cv.medianBlur (src, dst, ksize) 904 | cv.medianBlur(src, dst, 5); 905 | 906 | //cv.bilateralFilter (src, dst, d, sigmaColor, sigmaSpace, borderType = cv.BORDER_DEFAULT) 907 | cv.bilateralFilter(src, dst, 9, 75, 75, cv.BORDER_DEFAULT); 908 | ``` 909 | 910 | **Erosion** 911 | 912 | ```javascript 913 | //cv.erode (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue()) 914 | cv.erode(src, dst, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue()); 915 | ``` 916 | 917 | **Dilation** 918 | 919 | ```javascript 920 | //cv.dilate (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue()) 921 | cv.dilate(src, dst, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue()); 922 | ``` 923 | 924 | **Opening** 925 | 926 | ```javascript 927 | //cv.morphologyEx (src, dst, op, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue()) 928 | cv.morphologyEx(src, dst, cv.MORPH_OPEN, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue()); 929 | ``` 930 | 931 | **Closing** 932 | 933 | ```javascript 934 | cv.morphologyEx(src, dst, cv.MORPH_CLOSE, M); 935 | ``` 936 | 937 | **Morphological Gradient** 938 | 939 | ```javascript 940 | cv.morphologyEx(src, dst, cv.MORPH_GRADIENT, M); 941 | ``` 942 | 943 | **Top Hat** 944 | 945 | ```javascript 946 | cv.morphologyEx(src, dst, cv.MORPH_TOPHAT, M); 947 | ``` 948 | 949 | **Black Hat** 950 | 951 | ```javascript 952 | cv.morphologyEx(src, dst, cv.MORPH_BLACKHAT, M); 953 | ``` 954 | 955 | **Structuring Element** 956 | 957 | ```javascript 958 | //cv.getStructuringElement (shape, ksize, anchor = new cv.Point(-1, -1)) 959 | M = cv.getStructuringElement(cv.MORPH_CROSS, ksize); 960 | cv.morphologyEx(src, dst, cv.MORPH_GRADIENT, M); 961 | ``` 962 | 963 | **Sobel and Scharr Derivatives** 964 | 965 | ```javascript 966 | //cv.Sobel (src, dst, ddepth, dx, dy, ksize = 3, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT) 967 | cv.Sobel(src, dstx, cv.CV_8U, 1, 0, 3, 1, 0, cv.BORDER_DEFAULT); 968 | 969 | //cv.Scharr (src, dst, ddepth, dx, dy, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT) 970 | cv.Scharr(src, dstx, cv.CV_8U, 1, 0, 1, 0, cv.BORDER_DEFAULT); 971 | ``` 972 | 973 | **Laplacian Derivatives** 974 | 975 | ```javascript 976 | //cv.Laplacian (src, dst, ddepth, ksize = 1, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT) 977 | cv.Laplacian(src, dst, cv.CV_8U, 1, 1, 0, cv.BORDER_DEFAULT); 978 | ``` 979 | 980 | **Image AbsSobel** 981 | 982 | ```javascript 983 | cv.Sobel(src, dstx, cv.CV_8U, 1, 0, 3, 1, 0, cv.BORDER_DEFAULT); 984 | cv.Sobel(src, absDstx, cv.CV_64F, 1, 0, 3, 1, 0, cv.BORDER_DEFAULT); 985 | cv.convertScaleAbs(absDstx, absDstx, 1, 0); 986 | ``` 987 | 988 | **draw the contours** 989 | 990 | ```javascript 991 | //cv.findContours (image, contours, hierarchy, mode, method, offset = new cv.Point(0, 0)) 992 | cv.findContours(src, contours, hierarchy, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE); 993 | 994 | //cv.drawContours (image, contours, contourIdx, color, thickness = 1, lineType = cv.LINE_8, hierarchy = new cv.Mat(), maxLevel = INT_MAX, offset = new cv.Point(0, 0)) 995 | cv.drawContours(dst, contours, i, color, 1, cv.LINE_8, hierarchy, 100); 996 | ``` 997 | 998 | **Moments** 999 | 1000 | ```javascript 1001 | //cv.moments (array, binaryImage = false) 1002 | let Moments = cv.moments(cnt, false); 1003 | ``` 1004 | 1005 | **Contour Area** 1006 | 1007 | ```javascript 1008 | //cv.contourArea (contour, oriented = false) 1009 | let area = cv.contourArea(cnt, false); 1010 | ``` 1011 | 1012 | **Contour Perimeter** 1013 | 1014 | ```javascript 1015 | //cv.arcLength (curve, closed) 1016 | let perimeter = cv.arcLength(cnt, true); 1017 | ``` 1018 | 1019 | **Contour Approximation** 1020 | 1021 | ```javascript 1022 | //cv.approxPolyDP (curve, approxCurve, epsilon, closed) 1023 | cv.approxPolyDP(cnt, tmp, 3, true); 1024 | ``` 1025 | 1026 | **Convex Hull** 1027 | 1028 | ```javascript 1029 | //cv.convexHull (points, hull, clockwise = false, returnPoints = true) 1030 | cv.convexHull(cnt, tmp, false, true); 1031 | ``` 1032 | 1033 | **Checking Convexity** 1034 | 1035 | ```javascript 1036 | cv.isContourConvex(cnt); 1037 | ``` 1038 | 1039 | **Straight Bounding Rectangle** 1040 | 1041 | ```javascript 1042 | //cv.boundingRect (points) 1043 | let rect = cv.boundingRect(cnt); 1044 | ``` 1045 | 1046 | **Rotated Rectangle** 1047 | 1048 | ```javascript 1049 | //cv.minAreaRect (points) 1050 | let rotatedRect = cv.minAreaRect(cnt); 1051 | ``` 1052 | 1053 | **Minimum Enclosing Circle** 1054 | 1055 | ```javascript 1056 | //cv.minEnclosingCircle (points) 1057 | let circle = cv.minEnclosingCircle(cnt); 1058 | 1059 | //cv.circle (img, center, radius, color, thickness = 1, lineType = cv.LINE_8, shift = 0) 1060 | cv.circle(dst, circle.center, circle.radius, circleColor); 1061 | ``` 1062 | 1063 | **Fitting an Ellipse** 1064 | 1065 | ```javascript 1066 | //cv.fitEllipse (points) 1067 | let rotatedRect = cv.fitEllipse(cnt); 1068 | 1069 | //cv.ellipse1 (img, box, color, thickness = 1, lineType = cv.LINE_8) 1070 | cv.ellipse1(dst, rotatedRect, ellipseColor, 1, cv.LINE_8); 1071 | ``` 1072 | 1073 | **Fitting a Line** 1074 | 1075 | ```javascript 1076 | //cv.fitLine (points, line, distType, param, reps, aeps) 1077 | cv.fitLine(cnt, line, cv.DIST_L2, 0, 0.01, 0.01); 1078 | 1079 | //cv.line (img, pt1, pt2, color, thickness = 1, lineType = cv.LINE_8, shift = 0) 1080 | cv.line(dst, point1, point2, lineColor, 2, cv.LINE_AA, 0); 1081 | ``` 1082 | 1083 | **Aspect Ratio** 1084 | 1085 | ```javascript 1086 | let rect = cv.boundingRect(cnt); 1087 | let aspectRatio = rect.width / rect.height; 1088 | ``` 1089 | 1090 | **Extent** 1091 | 1092 | ```javascript 1093 | let area = cv.contourArea(cnt, false); 1094 | let rect = cv.boundingRect(cnt)); 1095 | let rectArea = rect.width * rect.height; 1096 | let extent = area / rectArea; 1097 | ``` 1098 | 1099 | **Solidity** 1100 | 1101 | ```javascript 1102 | let area = cv.contourArea(cnt, false); 1103 | cv.convexHull(cnt, hull, false, true); 1104 | let hullArea = cv.contourArea(hull, false); 1105 | let solidity = area / hullArea; 1106 | ``` 1107 | 1108 | **Equivalent Diameter** 1109 | 1110 | ```javascript 1111 | let area = cv.contourArea(cnt, false); 1112 | let equiDiameter = Math.sqrt(4 * area / Math.PI); 1113 | ``` 1114 | 1115 | **Orientation** 1116 | 1117 | ```javascript 1118 | let rotatedRect = cv.fitEllipse(cnt); 1119 | let angle = rotatedRect.angle; 1120 | ``` 1121 | 1122 | **Mask and Pixel Points** 1123 | 1124 | ```javascript 1125 | //cv.transpose (src, dst) 1126 | cv.transpose(src, dst); 1127 | ``` 1128 | 1129 | **Maximum Value, Minimum Value and their locations** 1130 | 1131 | ```javascript 1132 | //cv.minMaxLoc(src, mask) 1133 | let result = cv.minMaxLoc(src, mask); 1134 | let minVal = result.minVal; 1135 | let maxVal = result.maxVal; 1136 | let minLoc = result.minLoc; 1137 | let maxLoc = result.maxLoc; 1138 | ``` 1139 | 1140 | **Mean Color or Mean Intensity** 1141 | 1142 | ```javascript 1143 | cv.mean (src, mask) 1144 | ``` 1145 | 1146 | **Convexity Defects** 1147 | 1148 | ```javascript 1149 | //cv.convexityDefects (contour, convexhull, convexityDefect) 1150 | cv.convexityDefects(cnt, hull, defect); 1151 | ``` 1152 | 1153 | **Point Polygon Test** 1154 | 1155 | ```javascript 1156 | //cv.pointPolygonTest (contour, pt, measureDist) 1157 | let dist = cv.pointPolygonTest(cnt, new cv.Point(50, 50), true); 1158 | ``` 1159 | 1160 | **Match Shapes** 1161 | 1162 | ```javascript 1163 | //cv.matchShapes (contour1, contour2, method, parameter) 1164 | let result = cv.matchShapes(contours.get(contourID0), contours.get(contourID1), 1, 0); 1165 | ``` 1166 | 1167 | **Find Histogram** 1168 | 1169 | ```javascript 1170 | //cv.calcHist (image, channels, mask, hist, histSize, ranges, accumulate = false) 1171 | cv.calcHist(srcVec, channels, mask, hist, histSize, ranges, accumulate); 1172 | ``` 1173 | 1174 | **Histograms Equalization** 1175 | 1176 | ```javascript 1177 | cv.equalizeHist (src, dst) 1178 | ``` 1179 | 1180 | **CLAHE (Contrast Limited Adaptive Histogram Equalization)** 1181 | 1182 | ```javascript 1183 | //cv.CLAHE (clipLimit = 40, tileGridSize = new cv.Size(8, 8)) 1184 | let clahe = new cv.CLAHE(40, tileGridSize); 1185 | ``` 1186 | 1187 | **Backprojection** 1188 | 1189 | ```javascript 1190 | //cv.calcBackProject (images, channels, hist, dst, ranges, scale) 1191 | cv.calcBackProject(dstVec, channels, hist, backproj, ranges, 1); 1192 | 1193 | //cv.normalize (src, dst, alpha = 1, beta = 0, norm_type = cv.NORM_L2, dtype = -1, mask = new cv.Mat()) 1194 | cv.normalize(hist, hist, 0, 255, cv.NORM_MINMAX, -1, none); 1195 | ``` 1196 | 1197 | **Fourier Transform** 1198 | 1199 | ```javascript 1200 | //cv.dft (src, dst, flags = 0, nonzeroRows = 0) 1201 | cv.dft(complexI, complexI); 1202 | 1203 | //cv.getOptimalDFTSize (vecsize) 1204 | let optimalRows = cv.getOptimalDFTSize(src.rows); 1205 | 1206 | //cv.copyMakeBorder (src, dst, top, bottom, left, right, borderType, value = new cv.Scalar()) 1207 | cv.copyMakeBorder(src, padded, 0, optimalRows - src.rows, 0, optimalCols - src.cols, cv.BORDER_CONSTANT, s0); 1208 | 1209 | //cv.magnitude (x, y, magnitude) 1210 | cv.magnitude(planes.get(0), planes.get(1), planes.get(0)); 1211 | 1212 | //cv.split (m, mv) 1213 | cv.split(complexI, planes); 1214 | 1215 | //cv.merge (mv, dst) 1216 | cv.merge(planes, complexI); 1217 | ``` 1218 | 1219 | **Template Matching** 1220 | 1221 | ```javascript 1222 | //cv.matchTemplate (image, templ, result, method, mask = new cv.Mat()) 1223 | cv.matchTemplate(src, templ, dst, cv.TM_CCOEFF, mask); 1224 | ``` 1225 | 1226 | **Hough Transform** 1227 | 1228 | ```javascript 1229 | //cv.HoughLines (image, lines, rho, theta, threshold, srn = 0, stn = 0, min_theta = 0, max_theta = Math.PI) 1230 | cv.HoughLines(src, lines, 1, Math.PI / 180, 30, 0, 0, 0, Math.PI); 1231 | ``` 1232 | 1233 | **Probabilistic Hough Transform** 1234 | 1235 | ```javascript 1236 | //cv.HoughLinesP (image, lines, rho, theta, threshold, minLineLength = 0, maxLineGap = 0) 1237 | cv.HoughLinesP(src, lines, 1, Math.PI / 180, 2, 0, 0); 1238 | ``` 1239 | 1240 | **Hough Circle Transform** 1241 | 1242 | ```javascript 1243 | //cv.HoughCircles (image, circles, method, dp, minDist, param1 = 100, param2 = 100, minRadius = 0, maxRadius = 0) 1244 | cv.HoughCircles(src, circles, cv.HOUGH_GRADIENT, 1, 45, 75, 40, 0, 0); 1245 | ``` 1246 | 1247 | **Threshold** 1248 | 1249 | ```javascript 1250 | cv.threshold(gray, gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU); 1251 | ``` 1252 | 1253 | **Distance Transform** 1254 | 1255 | ```javascript 1256 | //cv.distanceTransform (src, dst, distanceType, maskSize, labelType = cv.CV_32F) 1257 | cv.distanceTransform(opening, distTrans, cv.DIST_L2, 5); 1258 | ``` 1259 | 1260 | **mage Watershed** 1261 | 1262 | ```javascript 1263 | //cv.connectedComponents (image, labels, connectivity = 8, ltype = cv.CV_32S) 1264 | cv.connectedComponents(coinsFg, markers); 1265 | 1266 | //cv.watershed (image, markers) 1267 | cv.watershed(src, markers); 1268 | ``` 1269 | 1270 | **Foreground Extraction** 1271 | 1272 | ```javascript 1273 | //cv.grabCut (image, mask, rect, bgdModel, fgdModel, iterCount, mode = cv.GC_EVAL) 1274 | cv.grabCut(src, mask, rect, bgdModel, fgdModel, 1, cv.GC_INIT_WITH_RECT); 1275 | ``` 1276 | 1277 | **Meanshift** 1278 | 1279 | ```javascript 1280 | //cv.meanShift (probImage, window, criteria) 1281 | [, trackWindow] = cv.meanShift(dst, trackWindow, termCrit); 1282 | ``` 1283 | 1284 | **Camshift** 1285 | 1286 | ```javascript 1287 | //cv.CamShift (probImage, window, criteria) 1288 | [trackBox, trackWindow] = cv.CamShift(dst, trackWindow, termCrit); 1289 | ``` 1290 | 1291 | **Lucas-Kanade Optical Flow** 1292 | 1293 | ```javascript 1294 | //cv.calcOpticalFlowPyrLK (prevImg, nextImg, prevPts, nextPts, status, err, winSize = new cv.Size(21, 21), maxLevel = 3, criteria = new cv.TermCriteria(cv.TermCriteria_COUNT+ cv.TermCriteria_EPS, 30, 0.01), flags = 0, minEigThreshold = 1e-4) 1295 | let criteria = new cv.TermCriteria(cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03); 1296 | cv.calcOpticalFlowPyrLK(oldGray, frameGray, p0, p1, st, err, winSize, maxLevel, criteria); 1297 | 1298 | ``` 1299 | 1300 | **Dense Optical Flow** 1301 | 1302 | ```javascript 1303 | //cv.calcOpticalFlowFarneback (prev, next, flow, pyrScale, levels, winsize, iterations, polyN, polySigma, flags) 1304 | cv.calcOpticalFlowFarneback(prvs, next, flow, 0.5, 3, 15, 3, 5, 1.2, 0); 1305 | ``` 1306 | 1307 | **BackgroundSubtractorMOG2** 1308 | 1309 | ```javascript 1310 | //cv.BackgroundSubtractorMOG2 (history = 500, varThreshold = 16, detectShadows = true) 1311 | let fgbg = new cv.BackgroundSubtractorMOG2(500, 16, true); 1312 | 1313 | //cv.apply (image, fgmask, learningRate = -1) 1314 | fgbg.apply(frame, fgmask); 1315 | ``` 1316 | 1317 | **Haar-cascade Detection** 1318 | 1319 | ```javascript 1320 | //detectMultiScale (image, objects, scaleFactor = 1.1, minNeighbors = 3, flags = 0, minSize = new cv.Size(0, 0), maxSize = new cv.Size(0, 0)) 1321 | let faceCascade = new cv.CascadeClassifier(); 1322 | faceCascade.load('haarcascade_frontalface_default.xml'); 1323 | faceCascade.detectMultiScale(gray, faces, 1.1, 3, 0, msize, msize); 1324 | ``` 1325 | 1326 | **image && video** 1327 | 1328 | ```javascript 1329 | cv.imread(); 1330 | cv.imshow(); 1331 | cv.VideoCapture(); 1332 | ``` 1333 | 1334 | **other** 1335 | 1336 | ```javascript 1337 | cv.rectangle(); 1338 | cv.Canny(); 1339 | cv.goodFeaturesToTrack(); 1340 | cv.cartToPolar(); 1341 | cv.randu(); 1342 | new cv.ORB(); 1343 | ``` 1344 | 1345 | ## To Do List 1346 | 1347 | - **Performance**, up speed performance. 1348 | - **Methods** complete all the opencv functions. 1349 | 1350 | ## License 1351 | 1352 | OpenCVJS is released under the MIT license. See LICENSE for details. 1353 | 1354 | -------------------------------------------------------------------------------- /Test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |