{"id":13701026,"url":"https://github.com/haoking/opencvjs","last_synced_at":"2025-05-04T20:31:41.171Z","repository":{"id":197735284,"uuid":"162608084","full_name":"haoking/opencvjs","owner":"haoking","description":"Complete opencvjs (With the lastest OpenCV 4.0.0+)","archived":false,"fork":false,"pushed_at":"2020-12-15T01:56:11.000Z","size":5978,"stargazers_count":54,"open_issues_count":4,"forks_count":20,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-11-13T07:35:16.847Z","etag":null,"topics":["javascript","matrix","opencv","opencvjs"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/haoking.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2018-12-20T17:00:34.000Z","updated_at":"2024-06-20T11:59:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"49375a22-e476-4062-a3e2-a6bf49b75059","html_url":"https://github.com/haoking/opencvjs","commit_stats":null,"previous_names":["haoking/opencvjs"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haoking%2Fopencvjs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haoking%2Fopencvjs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haoking%2Fopencvjs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haoking%2Fopencvjs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/haoking","download_url":"https://codeload.github.com/haoking/opencvjs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252395357,"owners_count":21741026,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","matrix","opencv","opencvjs"],"created_at":"2024-08-02T20:01:14.557Z","updated_at":"2025-05-04T20:31:38.267Z","avatar_url":"https://github.com/haoking.png","language":"HTML","funding_links":[],"categories":["HTML"],"sub_categories":[],"readme":"# opencvjs\n![OpenCV 4.0.0+](https://img.shields.io/badge/OpenCV-4.0.0%2B-green.svg)\n\nComplete opencvjs.(With the lastest OpenCV 4.0.0+)\n\nThe official opencv.js stoped update. Moreover, it still has many errors from the last offical version.\n\nThis project is inherited from official opencv.js.\n\nWhich means all of the methods in opencv.js works here, also, fix most of the errors.\n\nBut much more performance improved.\n\n## Features\n\n- [x] OpenCVJS writen by native JS which means this project can be used directly in the browser or JS project, or node.js\n- [x] OpenCVJS is the easiest to install as one .js file\n- [x] OpenCVJS has achieved most of the OpenCV C++ functions\n- [x] Some of the bad efficient methods implemented on js encapsulate the c++ method directly by using WebAssembly\n- [x] Almost every method's performance is faster than total JS implemented\n- [x] Performance is acceptted on web real-time face tracking\n- [x] The fasttest matix operate functions\n- [x] Every funcation is tested\n\n## Requirements\n\n- Native JS\n- OpenCV 4.0.0+\n\n## Communication\n\n- If you **found a bug**, open an issue.\n- If you **have a feature request**, open an issue.\n- If you **want to contribute**, submit a pull request.\n\n## Installation\n\n### Javascript\n\nAsync invoke opencv.js:\n\n```javascript\n\u003cscript async src=\"opencv.js\" onload=\"onOpenCVReady();\" type=\"text/javascript\"\u003e\u003c/script\u003e\n```\n\nDo coding after  `onOpenCVReady`:\n\n```ruby\n\u003cscript type=\"text/javascript\"\u003e\n    function onOpenCVReady() \n\t{  \n        //...\n      \t//do something...\n   \t}\n\u003c/script\u003e\n```\n\n------\n\n## Usage\n\n### Commonly\n\n**add()**\n\nvoid cv.add(src1, src2, dst) \n\n( dst = src1 + src2 )\n\nsrc1\t\tFirst input mat\n\nsrc2\t\tSecond input mat\n\ndst\t\tOutput mat that has the same size and number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = new cv.Mat();\ncv.add(mat1, mat2, dst);\nmat1.delete(), mat2.delete();\n//Don't forget to delete cv.Mat when you don't want to use it any more.\nconsole.log(\"dst::\" + dst.data32F);//dst::2,4,6,8,10,12,14,16,18\n```\n\n**addConstant()**\n\ncv.Mat dst = src1.addConstant(constant)\n\n( dst = src1 + constant )\n\nsrc1\t\t\tFirst input mat\n\nconstant\tConstant added to each element.\n\ndst\t\t\tOutput mat that has the same size and number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.addConstant(10);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F);//dst::11,12,13,14,15,16,17,18,19\n```\n**subtract()**\n\nvoid cv.subtract(src1, src2, dst)\n\n( dst = src1 - src2 )\n\nsrc1\t\tFirst input mat\n\nsrc2\t\tSecond input mat\n\ndst\t\tOutput mat that has the same size and number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = new cv.Mat();\ncv.subtract(mat1, mat2, dst);\nmat1.delete(), mat2.delete(); \n//Don't forget to delete cv.Mat when you don't want to use it any more.\nconsole.log(\"dst::\" + dst.data32F);//dst::0,0,0,0,0,0,0,0,0\n```\n\n**constantSubtract()**\n\ncv.Mat dst = src1.constantSubtract(constant)\n\n( dst = constant - src1 )\n\nconstant\tConstant subtract each element.\n\nsrc1\t\t\tFirst input mat\n\ndst\t\t\tOutput mat that has the same size and number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.constantSubtract(10);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F);//dst::9,8,7,6,5,4,3,2,1\n```\n\n**mmul()**\n\ncv.Mat dst = src1.mul(src2)\n\n( dst = src1 * src2 )\n\nsrc1\t\tFirst input mat\n\nsrc2\t\tSecond input mat\n\ndst\t\tOutput mat that has the same size and number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.mmul(mat2);\nmat1.delete(), mat2.delete();\nconsole.log(\"dst::\" + dst.data32F);//dst::30,36,42,66,81,96,102,126,150\n```\n\n**mul()**\n\ncv.Mat dst = src1.mul(src2, scale)\n\n( dst = src1 • src2*scale )\n\nsrc1\t\tFirst input mat\n\nsrc2\t\tSecond input mat\n\nscale \tOptional scale factor.\n\ndst\t\tOutput mat that has the same size and number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.mul(mat2, 2);\nmat1.delete(), mat2.delete();\nconsole.log(\"dst::\" + dst.data32F);//dst::2,8,18,32,50,72,98,128,162\n```\n\n**mulConstant()**\n\ncv.Mat dst = src1.mulConstant(constant)\n\n( dst = src1 * constant )\n\nsrc1\t\t\tFirst input mat\n\nconstant\tConstant added to each element.\n\ndst\t\t\tOutput mat that has the same size and number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.mulConstant(10);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F);//dst::10,20,30,40,50,60,70,80,90\n```\n\n**divide()**\n\nvoid cv.divide(src1, src2, dst)\n\n( dst = src1 / src1 )\n\nsrc1\t\tFirst input mat\n\nsrc2\t\tSecond input mat\n\ndst\t\tOutput mat that has the same size and number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = new cv.Mat();\ncv.divide(mat1, mat2, dst);\nmat1.delete(), mat2.delete();\nconsole.log(\"dst::\" + dst.data32F);//dst::1,1,1,1,1,1,1,1,1\n```\n\n**constantDivide()**\n\ncv.Mat dst = src1.constantDivide(constant)\n\n( dst = constant / src1 )\n\nconstant\tConstant subtract each element.\n\nsrc1\t\t\tFirst input mat\n\ndst\t\t\tOutput mat that has the same size and number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.constantDivide(10);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F);\n//dst::10,5,3.3333332538604736,2.5,2,1.6666666269302368,1.4285714626312256,1.25,1.1111111640930176\n```\n\n**reshape()**\n\nCv.Mat dst = src1.reshape(rows)\n\nsrc1\t\tFirst input mat\n\nrows\tReshape to rows\n\ndst\t\tOutput mat that has the same data of src1, but the row is equal to input rows\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.reshape(1);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols);\n//dst::1,2,3,4,5,6,7,8,9:::1:::9\ndst.delete();//Don't forget to delete cv.Mat when you don't want to use it any more.\n```\n\n**sum()**\n\nFloat dst = src1.sum()\n\nsrc1\t\tFirst input mat\n\ndst\t\tSum of src1 data\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet sum = mat1.sum();\nmat1.delete();\nconsole.log(\"dst::\" + dst);//dst::45\n```\n\n**norm()**\n\nFloat dst = cv.norm(src1)\n\nsrc1\t\tFirst input mat\n\ndst\t\tNorm of src1\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = cv.norm(mat1);\nmat1.delete();\nconsole.log(\"dst::\" + dst);//dst::16.881943016134134\n```\n\n**norm2()**\n\nFloat dst = cv.norm(src1, src2)\n\nsrc1\t\tFirst input mat\n\nsrc2 \tSecond input mat\n\ndst\t\tNorm of src1 and src2\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[9,10,11,12,13,14,15,16,17]);\nlet dst2 = cv.norm2(mat1, mat2);\nmat1.delete(), mat2.delete();\nconsole.log(\"dst2::\" + dst2);//dst2::24\n```\n\n**Diag()**\n\ncv.Mat dst = src1.diag(d = 0)\n\nsrc1\t\tFirst input mat\n\nd\t\tIndex of the diagonal\n\ndst\t\tOutput mat that has the same data of src1, but the row is equal to input rows\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.Diag();\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols);\n//dst::1,5,9:::3:::1\n```\n\n**vconcat()**\n\ncv.Mat dst = src1.vconcat(src2)\n\nsrc1\t\tFirst input mat\n\nsrc2\t\tSecond input mat has the same cols as the first input mat\n\ndst\t\tOutput mat that has the same number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.vconcat(mat1);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols);\n//dst::1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9:::6:::3\n```\n\n**hconcat()**\n\ncv.Mat dst = src1.hconcat(src2)\n\nsrc1\t\tFirst input mat\n\nsrc2\t\tSecond input mat has the same rows as the first input mat\n\ndst\t\tOutput mat that has the same number of channels as the input mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.hconcat(mat1);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols);\n//dst::1,2,3,1,2,3,4,5,6,4,5,6,7,8,9,7,8,9:::3:::6\n```\n\n**row()**\n\ncv.Mat dst = src1.row(row)\n\nsrc1\t\tFirst input mat\n\nrow\t\tIndex of the rows\n\ndst\t\tOutput mat that has one row\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.row(2);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols);\n//dst::7,8,9:::1:::3\n```\n\n**col()**\n\ncv.Mat dst = src1.col(col)\n\nsrc1\t\tFirst input mat\n\ncol\t\tIndex of the cols\n\ndst\t\tOutput mat that has one col\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.col(2);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols);\n//dst::3,6,9:::3:::1\n```\n\n**replaceMatOnRect()**\n\nvoid src1.replaceMatOnRect(src2, rect)\n\nsrc1\t\tFirst input mat will be changed as output\n\nsrc2\t\tSecond input mat as rect mat\n\nrect\t\trect input to replace\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet rect1 = new cv.Rect(1, 1, 2, 2);\nlet rectmat = cv.matFromArray(2,2,cv.CV_32FC1,[11,12,13,14]);\nmat1.replaceMatOnRect(rectmat, rect1);\nconsole.log(\"mat1::\" + mat1.data32F + \":::\" + mat1.rows + \":::\" + mat1.cols);\n//mat1::1,2,3,4,11,12,7,13,14:::3:::3\n```\n\n**replaceMatOnRow()**\n\nvoid src1.replaceMatOnRow(arr, row)\n\nsrc1\t\tFirst input mat will be changed as output\n\narr\t\tSecond input Array as row array\n\nrow\t\trow input to replace\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nmat1.replaceMatOnRow([11,12,13], 1);\nconsole.log(\"mat1::\" + mat1.data32F + \":::\" + mat1.rows + \":::\" + mat1.cols);\n//mat1::1,2,3,11,12,13,7,8,9:::3:::3\n```\n\n**replaceMatOnCol()**\n\nvoid src1.replaceMatOnCol(arr, col)\n\nsrc1\t\tFirst input mat will be changed as output\n\narr\t\tSecond input Array as row array\n\ncol\t\tcol input to replace\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nmat1.replaceMatOnCol([11,12,13], 1);\nconsole.log(\"mat1::\" + mat1.data32F + \":::\" + mat1.rows + \":::\" + mat1.cols);\n//mat1::1,11,3,4,12,6,7,13,9:::3:::3\n```\n\n**replaceMatOnPoint()**\n\nvoid src1.replaceMatOnPoint(constant, point)\n\nsrc1\t\t\tFirst input mat will be changed as output\n\nconstant\tSecond input constant tp replace at the point\n\npoint\t\tPoint location\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nmat1.replaceMatOnPoint(30, {x:1,y:1});\nconsole.log(\"mat1::\" + mat1.data32F + \":::\" + mat1.rows + \":::\" + mat1.cols);\n//mat1::1,11,3,4,12,6,7,13,9:::3:::3\n```\n\n**addOnCol()**\n\nvoid src1.addOnCol(constant, col)\n\nsrc1\t\t\tFirst input mat will be changed as output\n\nconstant\tSecond input constant tp replace at the point\n\ncol\t\t\tCol location\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nmat1.addOnCol(30, 1);\nconsole.log(\"mat1::\" + mat1.data32F + \":::\" + mat1.rows + \":::\" + mat1.cols);\n//mat1::1,11,3,4,12,6,7,13,9:::3:::3\n```\n\n**rectAdd()**\n\nvoid src1.rectAdd(src2, rect)\n\nsrc1\t\tFirst input mat will be changed as output\n\nsrc2\t\tSecond input mat as rect mat\n\nrect\t\trect input to add location\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet rect1 = new cv.Rect(1, 1, 2, 2);\nlet rectmat = cv.matFromArray(2,2,cv.CV_32FC1,[11,12,13,14]);\nmat1.rectAdd(rectmat, rect1);\nconsole.log(\"mat1::\" + mat1.data32F + \":::\" + mat1.rows + \":::\" + mat1.cols);\n//mat1::1,2,3,4,11,12,7,13,14:::3:::3\n```\n\n**rectSubtract()**\n\nvoid src1.rectSubtract(src2, rect)\n\nsrc1\t\tFirst input mat will be changed as output\n\nsrc2\t\tSecond input mat as rect mat\n\nrect\t\trect input to subtract location\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet rect1 = new cv.Rect(1, 1, 2, 2);\nlet rectmat = cv.matFromArray(2,2,cv.CV_32FC1,[11,12,13,14]);\nmat1.rectSubtract(rectmat, rect1);\nconsole.log(\"mat1::\" + mat1.data32F + \":::\" + mat1.rows + \":::\" + mat1.cols);\n//mat1::1,2,3,4,11,12,7,13,14:::3:::3\n```\n\n**mds()**\n\n{m:Float, d:Array, s:Float} dst = src1.mds()\n\nsrc1\t\tFirst input mat\n\ndst\t\tOutput with {mean, dev, stddev}\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.mds();\nmat1.delete();\nconsole.log(\"dst::\" + dst.m + \":::\" + dst.d + \":::\" + dst.s);\n//dst::5:::16,9,4,1,0,1,4,9,16:::2.581988897471611\n```\n\n**roi()**\n\nCv.Mat dst = src1.roi(rect)\n\nsrc1\t\tFirst input mat\n\nrect\t\ta rect\n\ndst\t\tOutput mat that has the same size and number of channels as the input rect\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet rect1 = new cv.Rect(1, 1, 2, 2)\nlet dst = mat1.roi(rect1);\nmat1.delete();\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols);\n//dst::5,6,8,9:::2:::2\n```\n\n**svd()**\n\n{u:cv.Mat, w:cv.Mat, vt:cv.Mat} dst = src1.svd()\n\nsrc1\t\tFirst input mat\n\ndst\t\tOutput with {u, w, vt}\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet s = mat1.svd();\nmat1.delete();\nconsole.log(\"sssss::\" + s.u.data32F + \":::\" + s.w.data32F + \"::::\" + s.vt.data32F);\n//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\n```\n\n**RodriguesFromArray()**\n\ncv.Mat dst = cv.RodriguesFromArray(arr1)\n\narr1\t\tFirst input array\n\ndst\t\tthe mat rodrigues from the input array\n\n```javascript\nlet arr1 = [1,2,3,4,5,6,7,8,9];\nlet dst = cv.RodriguesFromArray(arr1);\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols);\n//dst::-0.694920539855957,0.7135210037231445,0.08929285407066345,-0.19200697541236877,-0.3037850260734558,0.9331923723220825,0.6929781436920166,0.6313496828079224,0.34810739755630493:::3:::3\n```\n\n**RodriguesFromMat()**\n\n[x, y, z] dst = src1.RodriguesFromMat()\n\nsrc1\t\tFirst input mat\n\ndst\t\tthe mat rodrigues from the input array\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.RodriguesFromMat();\nconsole.log(\"dst::\" + dst);\n//dst::1.1046628653680794,1.738419705279746,2.372176486533247\n```\n\n**dftSplit()**\n\n{r:realMat, i:imagMat} dst = src1.dftSplit()\n\nsrc1\t\tFirst input mat\n\ndst\t\tthe mat rodrigues from the input array\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet dst = mat1.dftSplit();\nconsole.log(\"dst::\" + dst.r.data32F + \":::\" + dst.i.data32F);\n//dst::1,3,0,4,6,0,0,8,0:::0,3,0,7,9,0,0,9,0\n```\n\n**mulSpectrums()**\n\ncv.Mat dst = cv.mulSpectrums(src1, src2, conjB = false)\n\nsrc1\t\tFirst input mat\n\nsrc2\t\tSecond input mat\n\nconjB\tDefault is false\n\ndst\t\tResult of mat\n\n```javascript\nlet mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);\nlet mat2 = cv.matFromArray(3,3,cv.CV_32FC1,[9,10,11,12,13,14,15,16,17]);\nlet dst = cv.mulSpectrums(mat1, mat2, true);\nmat1.delete(), mat2.delete();\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols);\n//dst::9,8.96831017167883e-44,66,153,4.624284932271896e-44,237,NaN,1.2534558711446916e-39,NaN:::3:::3\n```\n\n**mulSpectrums2Channel()**\n\ncv.Mat dst = cv.mulSpectrums2Channel(src1, src2, conjB = false)\n\nsrc1\t\tFirst input mat\n\nsrc2\t\tSecond input mat\n\nconjB\tDefault is false\n\ndst\t\tResult of mat\n\n```javascript\nlet 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]);\nlet 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]);\nlet dst = cv.mulSpectrums2Channel(mat1_2channels, mat2_2channels, true);\nconsole.log(\"dst::\" + dst.data32F + \":::\" + dst.rows + \":::\" + dst.cols + \":::\" + dst.channels());\n//dst::29,8.96831017167883e-44,81,233,4.624284932271896e-44,162,NaN,1.2534558711446916e-39,NaN:::3:::3:::1\n```\n\n## \n\n### Others\n\n**default constructor**\n\n```javascript\nlet mat = new cv.Mat();\nlet mat = new cv.Mat(size, type);\nlet mat = new cv.Mat(rows, cols, type);\nlet mat = new cv.Mat(rows, cols, type, new cv.Scalar());\nlet mat = cv.matFromArray(rows, cols, type, array);\n\nlet ctx = canvas.getContext(\"2d\");\nlet imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);\nlet mat = cv.matFromImageData(imgData);\n\nlet mat = cv.Mat.zeros(rows, cols, type);\nlet mat = cv.Mat.ones(rows, cols, type);\nlet mat = cv.Mat.eye(rows, cols, type);\n```\n\n**copy Mat**\n\n```javascript\nlet dst = src.clone();\nsrc.copyTo(dst, mask);\n```\n\n**convert type**\n\n```javascript\nsrc.convertTo(m, rtype, alpha = 1, beta = 0);\n```\n\n**MatVector**\n\n```javascript\nlet mat = new cv.Mat();\nlet matVec = new cv.MatVector();\nmatVec.push_back(mat);\nlet cnt = matVec.get(0);\nmat.delete(); matVec.delete(); cnt.delete();\n```\n\n**data**\n\n```javascript\n[Data Properties]\t[C++ Type]\t[JavaScript Typed Array]\t[Mat Type]\ndata\t\t\t\tuchar\t\tUint8Array\t\t\t\t\tCV_8U\ndata8S\t\t\t\tchar\t\tInt8Array\t\t\t\t\tCV_8S\ndata16U\t\t\t\tushort\t\tUint16Array\t\t\t\t\tCV_16U\ndata16S\t\t\t\tshort\t\tInt16Array\t\t\t\t\tCV_16S\ndata32S\t\t\t\tint\t\t\tInt32Array\t\t\t\t\tCV_32S\ndata32F\t\t\t\tfloat\t\tFloat32Array\t\t\t\tCV_32F\ndata64F\t\t\t\tdouble\t\tFloat64Array\t\t\t\tCV_64F\n\n// row = 3, col = 4, channels = 4\nlet R = src.data[row * src.cols * src.channels() + col * src.channels()];\nlet G = src.data[row * src.cols * src.channels() + col * src.channels() + 1];\nlet B = src.data[row * src.cols * src.channels() + col * src.channels() + 2];\nlet A = src.data[row * src.cols * src.channels() + col * src.channels() + 3];\n```\n\n**at**\n\n```javascript\n[Mat Type]\t\t[At Manipulation]\nCV_8U\t\t\tucharAt\nCV_8S\t\t\tcharAt\nCV_16U\t\t\tushortAt\nCV_16S\t\t\tshortAt\nCV_32S\t\t\tintAt\nCV_32F\t\t\tfloatAt\nCV_64F\t\t\tdoubleAt\n\n//row = 3, col = 4, channels = 4\nlet R = src.ucharAt(row, col * src.channels());\nlet G = src.ucharAt(row, col * src.channels() + 1);\nlet B = src.ucharAt(row, col * src.channels() + 2);\nlet A = src.ucharAt(row, col * src.channels() + 3);\n```\n\n**ptr**\n\n```javascript\n[Mat Type]\t\t[Ptr Manipulation]\t\t[JavaScript Typed Array]\nCV_8U\t\t\tucharPtr\t\t\t\tUint8Array\nCV_8S\t\t\tcharPtr\t\t\t\t\tInt8Array\nCV_16U\t\t\tushortPtr\t\t\t\tUint16Array\nCV_16S\t\t\tshortPtr\t\t\t\tInt16Array\nCV_32S\t\t\tintPtr\t\t\t\t\tInt32Array\nCV_32F\t\t\tfloatPtr\t\t\t\tFloat32Array\nCV_64F\t\t\tdoublePtr\t\t\t\tFloat64Array\n\n//row = 3, col = 4, channels = 4\nlet pixel = src.ucharPtr(row, col);\nlet R = pixel[0];\nlet G = pixel[1];\nlet B = pixel[2];\nlet A = pixel[3];\n```\n\n**Bitwise Operations**\n\n```javascript\ncv.bitwise_not();\ncv.bitwise_and();\ncv.bitwise_or();\ncv.bitwise_xor();\n```\n\n**Point**\n\n```javascript\nlet point = new cv.Point(x, y);\nlet point = {x: x, y: y};\n```\n\n**Scalar**\n\n```javascript\nlet scalar = new cv.Scalar(R, G, B, Alpha);\nlet scalar = [R, G, B, Alpha];\n```\n\n**Size**\n\n```javascript\nlet size = new cv.Size(width, height);\nlet size = {width : width, height : height};\n```\n\n**Circle**\n\n```javascript\nlet circle = new cv.Circle(center, radius);\nlet circle = {center : center, radius : radius};\n```\n\n**Rect**\n\n```javascript\nlet rect = new cv.Rect(x, y, width, height);\nlet rect = {x : x, y : y, width : width, height : height};\n```\n\n**RotatedRect**\n\n```javascript\nlet rotatedRect = new cv.RotatedRect(center, size, angle);\nlet rotatedRect = {center : center, size : size, angle : angle};\n\nlet vertices = cv.RotatedRect.points(rotatedRect);\nlet point1 = vertices[0];\nlet point2 = vertices[1];\nlet point3 = vertices[2];\nlet point4 = vertices[3];\n\nlet boundingRect = cv.RotatedRect.boundingRect(rotatedRect);\n```\n\n**cvtColor**\n\n```javascript\ncv.cvtColor(src, dst, cv.COLOR_RGBA2GRAY, 0);\n```\n\n**inRange**\n\n```javascript\ncv.inRange(src, low, high, dst);\n```\n\n**Scaling**\n\n```javascript\ncv.resize (src, dst, dsize, fx = 0, fy = 0, interpolation = cv.INTER_LINEAR)\n```\n\n**Translation**\n\n```javascript\ncv.warpAffine (src, dst, M, dsize, flags = cv.INTER_LINEAR, borderMode = cv.BORDER_CONSTANT, borderValue = new cv.Scalar())\n```\n\n**Rotation**\n\n```javascript\ncv.getRotationMatrix2D (center, angle, scale)\n```\n\n**Affine Transformation**\n\n```javascript\ncv.getAffineTransform (src, dst)\n```\n\n**Perspective Transformation**\n\n```javascript\nlet M = cv.getPerspectiveTransform(srcTri, dstTri);\ncv.warpPerspective(src, dst, M, dsize, cv.INTER_LINEAR, cv.BORDER_CONSTANT, new cv.Scalar());\n```\n\n**Simple Thresholding**\n\n```javascript\ncv.threshold(src, dst, 177, 200, cv.THRESH_BINARY);\n```\n\n**Adaptive Thresholding**\n\n```javascript\n//cv.adaptiveThreshold (src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)\ncv.adaptiveThreshold(src, dst, 200, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 3, 2);\n```\n\n**2D Convolution ( Image Filtering )**\n\n```javascript\n//cv.filter2D (src, dst, ddepth, kernel, anchor = new cv.Point(-1, -1), delta = 0, borderType = cv.BORDER_DEFAULT)\ncv.filter2D(src, dst, cv.CV_8U, M, anchor, 0, cv.BORDER_DEFAULT);\n```\n\n**Image Blurring (Image Smoothing)**\n\n```javascript\n//cv.blur (src, dst, ksize, anchor = new cv.Point(-1, -1), borderType = cv.BORDER_DEFAULT)\ncv.blur(src, dst, ksize, anchor, cv.BORDER_DEFAULT);\n\n//cv.boxFilter (src, dst, ddepth, ksize, anchor = new cv.Point(-1, -1), normalize = true, borderType = cv.BORDER_DEFAULT)\ncv.boxFilter(src, dst, -1, ksize, anchor, true, cv.BORDER_DEFAULT)\n\n//cv.GaussianBlur (src, dst, ksize, sigmaX, sigmaY = 0, borderType = cv.BORDER_DEFAULT)\ncv.GaussianBlur(src, dst, ksize, 0, 0, cv.BORDER_DEFAULT);\n\n//cv.medianBlur (src, dst, ksize)\ncv.medianBlur(src, dst, 5);\n\n//cv.bilateralFilter (src, dst, d, sigmaColor, sigmaSpace, borderType = cv.BORDER_DEFAULT)\ncv.bilateralFilter(src, dst, 9, 75, 75, cv.BORDER_DEFAULT);\n```\n\n**Erosion**\n\n```javascript\n//cv.erode (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())\ncv.erode(src, dst, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());\n```\n\n**Dilation**\n\n```javascript\n//cv.dilate (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())\ncv.dilate(src, dst, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());\n```\n\n**Opening**\n\n```javascript\n//cv.morphologyEx (src, dst, op, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())\ncv.morphologyEx(src, dst, cv.MORPH_OPEN, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());\n```\n\n**Closing**\n\n```javascript\ncv.morphologyEx(src, dst, cv.MORPH_CLOSE, M);\n```\n\n**Morphological Gradient**\n\n```javascript\ncv.morphologyEx(src, dst, cv.MORPH_GRADIENT, M);\n```\n\n**Top Hat**\n\n```javascript\ncv.morphologyEx(src, dst, cv.MORPH_TOPHAT, M);\n```\n\n**Black Hat**\n\n```javascript\ncv.morphologyEx(src, dst, cv.MORPH_BLACKHAT, M);\n```\n\n**Structuring Element**\n\n```javascript\n//cv.getStructuringElement (shape, ksize, anchor = new cv.Point(-1, -1))\nM = cv.getStructuringElement(cv.MORPH_CROSS, ksize);\ncv.morphologyEx(src, dst, cv.MORPH_GRADIENT, M);\n```\n\n**Sobel and Scharr Derivatives**\n\n```javascript\n//cv.Sobel (src, dst, ddepth, dx, dy, ksize = 3, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT)\ncv.Sobel(src, dstx, cv.CV_8U, 1, 0, 3, 1, 0, cv.BORDER_DEFAULT);\n\n//cv.Scharr (src, dst, ddepth, dx, dy, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT)\ncv.Scharr(src, dstx, cv.CV_8U, 1, 0, 1, 0, cv.BORDER_DEFAULT);\n```\n\n**Laplacian Derivatives**\n\n```javascript\n//cv.Laplacian (src, dst, ddepth, ksize = 1, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT)\ncv.Laplacian(src, dst, cv.CV_8U, 1, 1, 0, cv.BORDER_DEFAULT);\n```\n\n**Image AbsSobel**\n\n```javascript\ncv.Sobel(src, dstx, cv.CV_8U, 1, 0, 3, 1, 0, cv.BORDER_DEFAULT);\ncv.Sobel(src, absDstx, cv.CV_64F, 1, 0, 3, 1, 0, cv.BORDER_DEFAULT);\ncv.convertScaleAbs(absDstx, absDstx, 1, 0);\n```\n\n**draw the contours**\n\n```javascript\n//cv.findContours (image, contours, hierarchy, mode, method, offset = new cv.Point(0, 0))\ncv.findContours(src, contours, hierarchy, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE);\n\n//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))\ncv.drawContours(dst, contours, i, color, 1, cv.LINE_8, hierarchy, 100);\n```\n\n**Moments**\n\n```javascript\n//cv.moments (array, binaryImage = false)\nlet Moments = cv.moments(cnt, false);\n```\n\n**Contour Area**\n\n```javascript\n//cv.contourArea (contour, oriented = false)\nlet area = cv.contourArea(cnt, false);\n```\n\n**Contour Perimeter**\n\n```javascript\n//cv.arcLength (curve, closed)\nlet perimeter = cv.arcLength(cnt, true);\n```\n\n**Contour Approximation**\n\n```javascript\n//cv.approxPolyDP (curve, approxCurve, epsilon, closed)\ncv.approxPolyDP(cnt, tmp, 3, true);\n```\n\n**Convex Hull**\n\n```javascript\n//cv.convexHull (points, hull, clockwise = false, returnPoints = true)\ncv.convexHull(cnt, tmp, false, true);\n```\n\n**Checking Convexity**\n\n```javascript\ncv.isContourConvex(cnt);\n```\n\n**Straight Bounding Rectangle**\n\n```javascript\n//cv.boundingRect (points)\nlet rect = cv.boundingRect(cnt);\n```\n\n**Rotated Rectangle**\n\n```javascript\n//cv.minAreaRect (points)\nlet rotatedRect = cv.minAreaRect(cnt);\n```\n\n**Minimum Enclosing Circle**\n\n```javascript\n//cv.minEnclosingCircle (points)\nlet circle = cv.minEnclosingCircle(cnt);\n\n//cv.circle (img, center, radius, color, thickness = 1, lineType = cv.LINE_8, shift = 0)\ncv.circle(dst, circle.center, circle.radius, circleColor);\n```\n\n**Fitting an Ellipse**\n\n```javascript\n//cv.fitEllipse (points)\nlet rotatedRect = cv.fitEllipse(cnt);\n\n//cv.ellipse1 (img, box, color, thickness = 1, lineType = cv.LINE_8)\ncv.ellipse1(dst, rotatedRect, ellipseColor, 1, cv.LINE_8);\n```\n\n**Fitting a Line**\n\n```javascript\n//cv.fitLine (points, line, distType, param, reps, aeps)\ncv.fitLine(cnt, line, cv.DIST_L2, 0, 0.01, 0.01);\n\n//cv.line (img, pt1, pt2, color, thickness = 1, lineType = cv.LINE_8, shift = 0)\ncv.line(dst, point1, point2, lineColor, 2, cv.LINE_AA, 0);\n```\n\n**Aspect Ratio**\n\n```javascript\nlet rect = cv.boundingRect(cnt);\nlet aspectRatio = rect.width / rect.height;\n```\n\n**Extent**\n\n```javascript\nlet area = cv.contourArea(cnt, false);\nlet rect = cv.boundingRect(cnt));\nlet rectArea = rect.width * rect.height;\nlet extent = area / rectArea;\n```\n\n**Solidity**\n\n```javascript\nlet area = cv.contourArea(cnt, false);\ncv.convexHull(cnt, hull, false, true);\nlet hullArea = cv.contourArea(hull, false);\nlet solidity = area / hullArea;\n```\n\n**Equivalent Diameter**\n\n```javascript\nlet area = cv.contourArea(cnt, false);\nlet equiDiameter = Math.sqrt(4 * area / Math.PI);\n```\n\n**Orientation**\n\n```javascript\nlet rotatedRect = cv.fitEllipse(cnt);\nlet angle = rotatedRect.angle;\n```\n\n**Mask and Pixel Points**\n\n```javascript\n//cv.transpose (src, dst)\ncv.transpose(src, dst);\n```\n\n**Maximum Value, Minimum Value and their locations**\n\n```javascript\n//cv.minMaxLoc(src, mask)\nlet result = cv.minMaxLoc(src, mask);\nlet minVal = result.minVal;\nlet maxVal = result.maxVal;\nlet minLoc = result.minLoc;\nlet maxLoc = result.maxLoc;\n```\n\n**Mean Color or Mean Intensity**\n\n```javascript\ncv.mean (src, mask)\n```\n\n**Convexity Defects**\n\n```javascript\n//cv.convexityDefects (contour, convexhull, convexityDefect)\ncv.convexityDefects(cnt, hull, defect);\n```\n\n**Point Polygon Test**\n\n```javascript\n//cv.pointPolygonTest (contour, pt, measureDist)\nlet dist = cv.pointPolygonTest(cnt, new cv.Point(50, 50), true);\n```\n\n**Match Shapes**\n\n```javascript\n//cv.matchShapes (contour1, contour2, method, parameter)\nlet result = cv.matchShapes(contours.get(contourID0), contours.get(contourID1), 1, 0);\n```\n\n**Find Histogram**\n\n```javascript\n//cv.calcHist (image, channels, mask, hist, histSize, ranges, accumulate = false)\ncv.calcHist(srcVec, channels, mask, hist, histSize, ranges, accumulate);\n```\n\n**Histograms Equalization**\n\n```javascript\ncv.equalizeHist (src, dst)\n```\n\n**CLAHE (Contrast Limited Adaptive Histogram Equalization)**\n\n```javascript\n//cv.CLAHE (clipLimit = 40, tileGridSize = new cv.Size(8, 8))\nlet clahe = new cv.CLAHE(40, tileGridSize);\n```\n\n**Backprojection**\n\n```javascript\n//cv.calcBackProject (images, channels, hist, dst, ranges, scale)\ncv.calcBackProject(dstVec, channels, hist, backproj, ranges, 1);\n\n//cv.normalize (src, dst, alpha = 1, beta = 0, norm_type = cv.NORM_L2, dtype = -1, mask = new cv.Mat())\ncv.normalize(hist, hist, 0, 255, cv.NORM_MINMAX, -1, none);\n```\n\n**Fourier Transform**\n\n```javascript\n//cv.dft (src, dst, flags = 0, nonzeroRows = 0)\ncv.dft(complexI, complexI);\n\n//cv.getOptimalDFTSize (vecsize)\nlet optimalRows = cv.getOptimalDFTSize(src.rows);\n\n//cv.copyMakeBorder (src, dst, top, bottom, left, right, borderType, value = new cv.Scalar())\ncv.copyMakeBorder(src, padded, 0, optimalRows - src.rows, 0, optimalCols - src.cols, cv.BORDER_CONSTANT, s0);\n\n//cv.magnitude (x, y, magnitude)\ncv.magnitude(planes.get(0), planes.get(1), planes.get(0));\n\n//cv.split (m, mv)\ncv.split(complexI, planes);\n\n//cv.merge (mv, dst)\ncv.merge(planes, complexI);\n```\n\n**Template Matching**\n\n```javascript\n//cv.matchTemplate (image, templ, result, method, mask = new cv.Mat())\ncv.matchTemplate(src, templ, dst, cv.TM_CCOEFF, mask);\n```\n\n**Hough Transform**\n\n```javascript\n//cv.HoughLines (image, lines, rho, theta, threshold, srn = 0, stn = 0, min_theta = 0, max_theta = Math.PI)\ncv.HoughLines(src, lines, 1, Math.PI / 180, 30, 0, 0, 0, Math.PI);\n```\n\n**Probabilistic Hough Transform**\n\n```javascript\n//cv.HoughLinesP (image, lines, rho, theta, threshold, minLineLength = 0, maxLineGap = 0)\ncv.HoughLinesP(src, lines, 1, Math.PI / 180, 2, 0, 0);\n```\n\n**Hough Circle Transform**\n\n```javascript\n//cv.HoughCircles (image, circles, method, dp, minDist, param1 = 100, param2 = 100, minRadius = 0, maxRadius = 0)\ncv.HoughCircles(src, circles, cv.HOUGH_GRADIENT, 1, 45, 75, 40, 0, 0);\n```\n\n**Threshold**\n\n```javascript\ncv.threshold(gray, gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU);\n```\n\n**Distance Transform**\n\n```javascript\n//cv.distanceTransform (src, dst, distanceType, maskSize, labelType = cv.CV_32F)\ncv.distanceTransform(opening, distTrans, cv.DIST_L2, 5);\n```\n\n**mage Watershed**\n\n```javascript\n//cv.connectedComponents (image, labels, connectivity = 8, ltype = cv.CV_32S)\ncv.connectedComponents(coinsFg, markers);\n\n//cv.watershed (image, markers)\ncv.watershed(src, markers);\n```\n\n**Foreground Extraction**\n\n```javascript\n//cv.grabCut (image, mask, rect, bgdModel, fgdModel, iterCount, mode = cv.GC_EVAL)\ncv.grabCut(src, mask, rect, bgdModel, fgdModel, 1, cv.GC_INIT_WITH_RECT);\n```\n\n**Meanshift**\n\n```javascript\n//cv.meanShift (probImage, window, criteria)\n[, trackWindow] = cv.meanShift(dst, trackWindow, termCrit);\n```\n\n**Camshift**\n\n```javascript\n//cv.CamShift (probImage, window, criteria)\n[trackBox, trackWindow] = cv.CamShift(dst, trackWindow, termCrit);\n```\n\n**Lucas-Kanade Optical Flow**\n\n```javascript\n//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)\nlet criteria = new cv.TermCriteria(cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03);\ncv.calcOpticalFlowPyrLK(oldGray, frameGray, p0, p1, st, err, winSize, maxLevel, criteria);\n\n```\n\n**Dense Optical Flow**\n\n```javascript\n//cv.calcOpticalFlowFarneback (prev, next, flow, pyrScale, levels, winsize, iterations, polyN, polySigma, flags)\ncv.calcOpticalFlowFarneback(prvs, next, flow, 0.5, 3, 15, 3, 5, 1.2, 0);\n```\n\n**BackgroundSubtractorMOG2**\n\n```javascript\n//cv.BackgroundSubtractorMOG2 (history = 500, varThreshold = 16, detectShadows = true)\nlet fgbg = new cv.BackgroundSubtractorMOG2(500, 16, true);\n\n//cv.apply (image, fgmask, learningRate = -1)\nfgbg.apply(frame, fgmask);\n```\n\n**Haar-cascade Detection**\n\n```javascript\n//detectMultiScale (image, objects, scaleFactor = 1.1, minNeighbors = 3, flags = 0, minSize = new cv.Size(0, 0), maxSize = new cv.Size(0, 0))\nlet faceCascade = new cv.CascadeClassifier();\nfaceCascade.load('haarcascade_frontalface_default.xml');\nfaceCascade.detectMultiScale(gray, faces, 1.1, 3, 0, msize, msize);\n```\n\n**image \u0026\u0026 video**\n\n```javascript\ncv.imread();\ncv.imshow();\ncv.VideoCapture();\n```\n\n**other**\n\n```javascript\ncv.rectangle();\ncv.Canny();\ncv.goodFeaturesToTrack();\ncv.cartToPolar();\ncv.randu();\nnew cv.ORB();\n```\n\n## To Do List\n\n- **Performance**, up speed performance.\n- **Methods** complete all the opencv functions.\n\n## License\n\nOpenCVJS is released under the MIT license. See LICENSE for details.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaoking%2Fopencvjs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhaoking%2Fopencvjs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaoking%2Fopencvjs/lists"}