From 27a24d0073cef3cde7b74de56f7811311279a8e3 Mon Sep 17 00:00:00 2001 From: yizhi <946185759@qq.com> Date: Mon, 17 Mar 2025 11:51:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Mat=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .npmignore | 13 +++++++++++++ cxx/mat.cc | 15 +++++++++++++-- package.json | 3 ++- src/cv/download.ts | 4 ++-- src/cv/mat.ts | 5 +++++ src/test.ts | 1 + 6 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 .npmignore diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..9e62f16 --- /dev/null +++ b/.npmignore @@ -0,0 +1,13 @@ +/.git +/.vscode +/build +/cxx +/node_modules +/src +/test_data +/thirdpart +/.clang-format +/.gitignore +/CMakeLists.txt +/package-lock.json +/tsconfig.json diff --git a/cxx/mat.cc b/cxx/mat.cc index fd89313..d1f51f5 100644 --- a/cxx/mat.cc +++ b/cxx/mat.cc @@ -50,6 +50,7 @@ class CVMat : public ObjectWrap { MAT_INSTANCE_METHOD(GetTotal), MAT_INSTANCE_METHOD(GetTotalWithDim), MAT_INSTANCE_METHOD(GetSize), + MAT_INSTANCE_METHOD(GetData), MAT_INSTANCE_METHOD(Col), MAT_INSTANCE_METHOD(ColRange), @@ -58,6 +59,7 @@ class CVMat : public ObjectWrap { MAT_INSTANCE_METHOD(Diag), MAT_INSTANCE_METHOD(Clone), + MAT_INSTANCE_METHOD(CopyTo), }); constructor = new FunctionReference(); @@ -159,7 +161,12 @@ class CVMat : public ObjectWrap { for (int i = 0; i < mat_.dims; ++i) ret.Set(i, size[i]); return ret; } - + Napi::Value GetData(const Napi::CallbackInfo &info) + { + auto ptr = mat_.ptr(); + auto bytes = mat_.elemSize() * mat_.total(); + return ArrayBuffer::New(info.Env(), ptr, bytes); + } Napi::Value Col(const Napi::CallbackInfo &info) { @@ -194,7 +201,11 @@ class CVMat : public ObjectWrap { { return CreateMat(info.Env(), [&](CVMat &mat) { mat.mat_ = mat_.clone(); }); } - + Napi::Value CopyTo(const Napi::CallbackInfo &info) { + auto &target = GetMat(info[0].As()); + mat_.copyTo(target.mat_); + return info.Env().Undefined(); + } static Napi::Value Crop(const Napi::CallbackInfo &info) { diff --git a/package.json b/package.json index e18a00f..95f66ab 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { "name": "@yizhi/cv", "version": "1.0.1", + "releaseVersion": "1.0.2", "main": "dist/index.js", "types": "typing/index.d.ts", "scripts": { - "build": "tsc", + "build": "rm -rf dist typing && tsc", "watch": "tsc -w --inlineSourceMap" }, "keywords": [], diff --git a/src/cv/download.ts b/src/cv/download.ts index a022914..b7755fe 100644 --- a/src/cv/download.ts +++ b/src/cv/download.ts @@ -9,7 +9,7 @@ const URLS = { } function getURL(template: string) { - const version = require("../../package.json").version; + const version = require("../../package.json").releaseVersion; let platform = ""; let arch = ""; switch (os.platform()) { @@ -49,7 +49,7 @@ export async function downloadAddon(savename?: string) { const defaultAddon = path.resolve(process.cwd(), C("ADDON_PATH")); const saveName = savename ? path.resolve(path.dirname(defaultAddon), savename) : defaultAddon; if (fs.existsSync(saveName)) return saveName; - + await fs.promises.mkdir(path.dirname(saveName), { recursive: true }); const stream = await getStream(); diff --git a/src/cv/mat.ts b/src/cv/mat.ts index 00277b2..304f266 100644 --- a/src/cv/mat.ts +++ b/src/cv/mat.ts @@ -35,8 +35,13 @@ export class Mat { else return this.#mat.GetTotalWithDim(startDim, endDim ?? 2147483647); } public get size(): number[] { return this.#mat.GetSize(); } + public get data(): Uint8Array { + if (this.isContinuous) return new Uint8Array(this.#mat.GetData()); + else return this.copyTo(this.clone()).data; + } public clone() { return FromCV(this.#mat.Clone()); } + public copyTo(mat: Mat) { return this.#mat.CopyTo(M(mat)), mat; } public row(y: number) { return FromCV(this.#mat.Row(y)); } public col(x: number) { return FromCV(this.#mat.Col(x)); } diff --git a/src/test.ts b/src/test.ts index 91595b7..161365e 100644 --- a/src/test.ts +++ b/src/test.ts @@ -8,6 +8,7 @@ async function test() { const res = await cv.imread("test_data/im1.jpeg"); // const res = await cv.imdecode(buffer); const cropIm = cv.crop(res, { x: 10, y: 10, width: 300, height: 200 }); + console.log(cropIm.data) console.log(cv.imwrite("test_data/cropIm.jpg", cropIm)); fs.writeFileSync("test_data/base.jpg", cv.imencode(".jpg", res)!);