@koala123/aoi-db 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -0
- package/dist/app.controller.d.ts +24 -0
- package/dist/app.controller.js +282 -0
- package/dist/app.controller.js.map +1 -0
- package/dist/app.dto.d.ts +83 -0
- package/dist/app.dto.js +315 -0
- package/dist/app.dto.js.map +1 -0
- package/dist/app.library.d.ts +20 -0
- package/dist/app.library.js +196 -0
- package/dist/app.library.js.map +1 -0
- package/dist/app.module.d.ts +6 -0
- package/dist/app.module.js +26 -0
- package/dist/app.module.js.map +1 -0
- package/dist/app.service.d.ts +162 -0
- package/dist/app.service.js +377 -0
- package/dist/app.service.js.map +1 -0
- package/dist/app.utils.d.ts +38 -0
- package/dist/app.utils.js +202 -0
- package/dist/app.utils.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +31 -0
- package/dist/main.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import { FeatureDto, FeatureRes, QueryRes, IdTypeDto, CoreLearnDto, CropSamplesDto, FeatureExtractDto, FeatureExtractRes, SampleDto, SampleFeatureDto } from "./app.dto";
|
|
3
|
+
export interface KLConfig {
|
|
4
|
+
/** dllPath;默认值:D:/kl-storage/dll/ */
|
|
5
|
+
dllPath: string;
|
|
6
|
+
/** db路径;默认值:D:/kl-storage/gallery/db/ */
|
|
7
|
+
dbPath: string;
|
|
8
|
+
/** sample路径;默认值:D:/kl-storage/gallery/sample/ */
|
|
9
|
+
samplePath: string;
|
|
10
|
+
/** 引擎宽;默认值:5120 */
|
|
11
|
+
width: number;
|
|
12
|
+
/** 引擎高;默认值:5120 */
|
|
13
|
+
height: number;
|
|
14
|
+
/** 引擎通道;默认值:3 */
|
|
15
|
+
channel: number;
|
|
16
|
+
/** 是否加载引擎;默认值:false;true时会分别在onModuleInit和onModuleDestroy时期初始化与销毁引擎 */
|
|
17
|
+
loadEngine: boolean;
|
|
18
|
+
/** 特征维度;默认值:384 */
|
|
19
|
+
featureDIM: number;
|
|
20
|
+
/** 特征小图高;默认值:256 */
|
|
21
|
+
featureWidth: number;
|
|
22
|
+
/** 特征小图宽;默认值:256 */
|
|
23
|
+
featureHeight: number;
|
|
24
|
+
/** 外环切区域不能用于注册,注册无效区域(防呆区域);默认值64 */
|
|
25
|
+
deadproofArea: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class AppService implements OnModuleInit, OnModuleDestroy {
|
|
28
|
+
/** 配置项 */
|
|
29
|
+
private KLConfig;
|
|
30
|
+
/** KL工具库 */
|
|
31
|
+
private UtilsLib;
|
|
32
|
+
/** KLDB库 */
|
|
33
|
+
private KLDBLib;
|
|
34
|
+
constructor(config: Partial<KLConfig>);
|
|
35
|
+
onModuleInit(): void;
|
|
36
|
+
onModuleDestroy(): void;
|
|
37
|
+
/**
|
|
38
|
+
* defect被删除,需要同时删除其对应db文件中对应的type
|
|
39
|
+
*/
|
|
40
|
+
eraseDefect(id: number): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* 初始化引擎
|
|
43
|
+
*/
|
|
44
|
+
initEngine(): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* 销毁引擎
|
|
47
|
+
*/
|
|
48
|
+
destroyEngine(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* 导出数据
|
|
51
|
+
*/
|
|
52
|
+
exportDB(db: string, exportFeature?: boolean): Promise<FeatureDto[]>;
|
|
53
|
+
/**
|
|
54
|
+
* 查找所有db
|
|
55
|
+
*/
|
|
56
|
+
findAll(): Promise<string[]>;
|
|
57
|
+
/**
|
|
58
|
+
* 加载DB到内存中,不存在则创建一个新的DB
|
|
59
|
+
* @param db db路径;若父目录不存在,则创建失败;db目录是相对KLConfig.dbPath
|
|
60
|
+
* @param releaseFirst load之前是否先releaseDB
|
|
61
|
+
* @returns db的条目总数
|
|
62
|
+
*/
|
|
63
|
+
load(db: string, releaseFirst?: boolean): Promise<number>;
|
|
64
|
+
/**
|
|
65
|
+
* 释放DB
|
|
66
|
+
* @param db db路径
|
|
67
|
+
* @returns 此操作是否成功
|
|
68
|
+
*/
|
|
69
|
+
release(db: string): Promise<boolean>;
|
|
70
|
+
/**
|
|
71
|
+
* 删除db文件
|
|
72
|
+
* @param db db路径
|
|
73
|
+
* @returns 操作是否成功
|
|
74
|
+
*/
|
|
75
|
+
delete(db: string): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* 插入数据
|
|
78
|
+
* @param db db路径
|
|
79
|
+
* @param data 数据列表
|
|
80
|
+
* @returns db的条目总数
|
|
81
|
+
*/
|
|
82
|
+
insert(db: string, data: FeatureDto[]): Promise<number>;
|
|
83
|
+
/**
|
|
84
|
+
* 通过id列表删除数据
|
|
85
|
+
* @param db db路径
|
|
86
|
+
* @param ids
|
|
87
|
+
* @returns db的条目总数
|
|
88
|
+
*/
|
|
89
|
+
eraseByIds(db: string, ids: number[]): Promise<number>;
|
|
90
|
+
/**
|
|
91
|
+
* 通过类型type删除数据
|
|
92
|
+
* @param db db路径
|
|
93
|
+
* @param type
|
|
94
|
+
* @returns db的条目总数
|
|
95
|
+
*/
|
|
96
|
+
eraseByType(db: string, type: number): Promise<number>;
|
|
97
|
+
/**
|
|
98
|
+
* 更新db
|
|
99
|
+
* @param db db路径
|
|
100
|
+
* @param data 更新数据列表 [{id,type}]
|
|
101
|
+
* @returns 更新操作是否成功
|
|
102
|
+
*/
|
|
103
|
+
update(db: string, data: IdTypeDto[]): Promise<number>;
|
|
104
|
+
/**
|
|
105
|
+
* 根据feature查询最近邻的type与score
|
|
106
|
+
* @param db db路径
|
|
107
|
+
* @param features
|
|
108
|
+
*/
|
|
109
|
+
query(db: string, features: string[]): Promise<QueryRes>;
|
|
110
|
+
/**
|
|
111
|
+
* @TODO 接口太过复杂,算法应提供一版软件端值需提供全图buffer和提取特征的中心坐标与小图宽高即可
|
|
112
|
+
* 提取特征
|
|
113
|
+
*/
|
|
114
|
+
featureExtract(data: FeatureExtractDto): Promise<FeatureExtractRes>;
|
|
115
|
+
/**
|
|
116
|
+
* 采集正常图像上的特征向量
|
|
117
|
+
* 此操作会向db写入特征数据与生成对应的sample小图
|
|
118
|
+
*/
|
|
119
|
+
coreLearn(data: CoreLearnDto): Promise<FeatureRes[]>;
|
|
120
|
+
/**
|
|
121
|
+
* 裁剪sample小图
|
|
122
|
+
*/
|
|
123
|
+
cropSamplesBySrc(param: CropSamplesDto): Promise<boolean>;
|
|
124
|
+
/**
|
|
125
|
+
* 裁剪sample小图
|
|
126
|
+
*/
|
|
127
|
+
private cropSamples;
|
|
128
|
+
/**
|
|
129
|
+
* 删除sample小图
|
|
130
|
+
* @param param0
|
|
131
|
+
* @param db sample小图对应的db
|
|
132
|
+
* @param srcs sample小图地址
|
|
133
|
+
* @returns db的条目总数
|
|
134
|
+
*/
|
|
135
|
+
eraseSamples(db: string, srcs: string[]): Promise<number>;
|
|
136
|
+
/**
|
|
137
|
+
* 移动sample小图,只能移动到同pattern
|
|
138
|
+
* @param db sample小图对应的db
|
|
139
|
+
* @param data sample小图的地址 [{src,dist}]
|
|
140
|
+
* @returns 是否成功
|
|
141
|
+
*/
|
|
142
|
+
updateSamples(db: string, data: SampleDto[]): Promise<number>;
|
|
143
|
+
/**
|
|
144
|
+
* insertsample小图,同时添加到db
|
|
145
|
+
* @param db sample小图对应的db
|
|
146
|
+
* @param data sample小图的地址与特征 [{src,dist,feature}]
|
|
147
|
+
* @returns db的条目总数
|
|
148
|
+
*/
|
|
149
|
+
insertSamples(db: string, data: SampleFeatureDto[]): Promise<number>;
|
|
150
|
+
/**
|
|
151
|
+
* 根据.db中的数据格式化sample小图;删除.db文件中没有的小图
|
|
152
|
+
*/
|
|
153
|
+
formatSamples(db: string): Promise<void>;
|
|
154
|
+
/**
|
|
155
|
+
* 读图
|
|
156
|
+
*/
|
|
157
|
+
private readImage;
|
|
158
|
+
/**
|
|
159
|
+
* 写图
|
|
160
|
+
*/
|
|
161
|
+
private writeImage;
|
|
162
|
+
}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
|
+
if (mod && mod.__esModule) return mod;
|
|
26
|
+
var result = {};
|
|
27
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
28
|
+
__setModuleDefault(result, mod);
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
31
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
32
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
33
|
+
};
|
|
34
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
35
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
36
|
+
};
|
|
37
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
38
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
39
|
+
};
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.AppService = void 0;
|
|
42
|
+
const node_util_1 = require("node:util");
|
|
43
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const kl_buffer_1 = __importDefault(require("kl-buffer"));
|
|
46
|
+
const common_1 = require("@nestjs/common");
|
|
47
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
48
|
+
const app_utils_1 = require("./app.utils");
|
|
49
|
+
const app_library_1 = require("./app.library");
|
|
50
|
+
let AppService = class AppService {
|
|
51
|
+
constructor(config) {
|
|
52
|
+
this.KLConfig = Object.assign({
|
|
53
|
+
dllPath: 'D:/kl-storage/dll/',
|
|
54
|
+
dbPath: 'D:/kl-storage/gallery/db/',
|
|
55
|
+
samplePath: 'D:/kl-storage/gallery/sample/',
|
|
56
|
+
width: 5120,
|
|
57
|
+
height: 5120,
|
|
58
|
+
channel: 3,
|
|
59
|
+
loadEngine: false,
|
|
60
|
+
featureDIM: 384,
|
|
61
|
+
featureWidth: 256,
|
|
62
|
+
featureHeight: 256,
|
|
63
|
+
deadproofArea: 64,
|
|
64
|
+
}, config);
|
|
65
|
+
this.UtilsLib = (0, app_library_1.shmem)(this.KLConfig.dllPath);
|
|
66
|
+
this.KLDBLib = (0, app_library_1.anomaly)(this.KLConfig.dllPath);
|
|
67
|
+
}
|
|
68
|
+
onModuleInit() {
|
|
69
|
+
this.KLConfig.loadEngine && this.initEngine();
|
|
70
|
+
}
|
|
71
|
+
onModuleDestroy() {
|
|
72
|
+
this.KLConfig.loadEngine && this.destroyEngine();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* defect被删除,需要同时删除其对应db文件中对应的type
|
|
76
|
+
*/
|
|
77
|
+
async eraseDefect(id) {
|
|
78
|
+
const files = await this.findAll();
|
|
79
|
+
for (let i = 0; i < files.length; i++) {
|
|
80
|
+
await this.eraseByType(files[i], id);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 初始化引擎
|
|
85
|
+
*/
|
|
86
|
+
async initEngine() {
|
|
87
|
+
const { dbPath, width, height, channel, featureDIM } = this.KLConfig;
|
|
88
|
+
const time = Date.now();
|
|
89
|
+
const bool = await (0, node_util_1.promisify)(this.KLDBLib.initEngine.async)(dbPath, 1, channel, height, width, featureDIM);
|
|
90
|
+
console.log(bool ? "初始化引擎成功" : "初始化引擎失败", `耗时:${Date.now() - time}ms`);
|
|
91
|
+
return bool;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 销毁引擎
|
|
95
|
+
*/
|
|
96
|
+
destroyEngine() {
|
|
97
|
+
const bool = this.KLDBLib.destroyEngine();
|
|
98
|
+
console.log(bool ? "关闭引擎成功" : "关闭引擎失败");
|
|
99
|
+
return bool;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 导出数据
|
|
103
|
+
*/
|
|
104
|
+
async exportDB(db, exportFeature) {
|
|
105
|
+
if (db.slice(0, 4) === 'temp')
|
|
106
|
+
return Promise.reject();
|
|
107
|
+
return (0, app_utils_1.exportDB)(path.join(this.KLConfig.dbPath, db), exportFeature);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 查找所有db
|
|
111
|
+
*/
|
|
112
|
+
async findAll() {
|
|
113
|
+
try {
|
|
114
|
+
const files = await fs.readdir(this.KLConfig.dbPath);
|
|
115
|
+
return files.filter((e) => {
|
|
116
|
+
return e.slice(-3) === '.db' && e.slice(0, 5) != 'temp-';
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return Promise.reject(error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 加载DB到内存中,不存在则创建一个新的DB
|
|
125
|
+
* @param db db路径;若父目录不存在,则创建失败;db目录是相对KLConfig.dbPath
|
|
126
|
+
* @param releaseFirst load之前是否先releaseDB
|
|
127
|
+
* @returns db的条目总数
|
|
128
|
+
*/
|
|
129
|
+
async load(db, releaseFirst) {
|
|
130
|
+
if (releaseFirst)
|
|
131
|
+
await this.release(db);
|
|
132
|
+
return (0, node_util_1.promisify)(this.KLDBLib.load_DB.async)(db);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 释放DB
|
|
136
|
+
* @param db db路径
|
|
137
|
+
* @returns 此操作是否成功
|
|
138
|
+
*/
|
|
139
|
+
async release(db) {
|
|
140
|
+
return (0, node_util_1.promisify)(this.KLDBLib.release_DB.async)(db);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 删除db文件
|
|
144
|
+
* @param db db路径
|
|
145
|
+
* @returns 操作是否成功
|
|
146
|
+
*/
|
|
147
|
+
async delete(db) {
|
|
148
|
+
const bool = await this.release(db);
|
|
149
|
+
try {
|
|
150
|
+
const dbPath = path.join(this.KLConfig.dbPath, db);
|
|
151
|
+
await fs.access(dbPath);
|
|
152
|
+
return fs.unlink(dbPath).then(() => true);
|
|
153
|
+
}
|
|
154
|
+
catch (error) { }
|
|
155
|
+
return bool;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 插入数据
|
|
159
|
+
* @param db db路径
|
|
160
|
+
* @param data 数据列表
|
|
161
|
+
* @returns db的条目总数
|
|
162
|
+
*/
|
|
163
|
+
async insert(db, data) {
|
|
164
|
+
if (!data.length)
|
|
165
|
+
return Promise.reject(-1);
|
|
166
|
+
const idKLBuffer = (0, app_utils_1.getKLBufferByIntArray)(data.map((e) => e.id));
|
|
167
|
+
const typeKLBuffer = (0, app_utils_1.getKLBufferByIntArray)(data.map((e) => e.type));
|
|
168
|
+
const featureKLBuffer = (0, app_utils_1.getBufferByBase64)(data.map((e) => e.feature), this.KLConfig.featureDIM);
|
|
169
|
+
return (0, node_util_1.promisify)(this.KLDBLib.insert.async)(db, data.length, idKLBuffer.ptr, typeKLBuffer.ptr, featureKLBuffer);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 通过id列表删除数据
|
|
173
|
+
* @param db db路径
|
|
174
|
+
* @param ids
|
|
175
|
+
* @returns db的条目总数
|
|
176
|
+
*/
|
|
177
|
+
async eraseByIds(db, ids) {
|
|
178
|
+
if (!ids.length)
|
|
179
|
+
return Promise.reject(-1);
|
|
180
|
+
const idKLBuffer = (0, app_utils_1.getKLBufferByIntArray)(ids);
|
|
181
|
+
return (0, node_util_1.promisify)(this.KLDBLib.erase.async)(db, ids.length, idKLBuffer.ptr);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 通过类型type删除数据
|
|
185
|
+
* @param db db路径
|
|
186
|
+
* @param type
|
|
187
|
+
* @returns db的条目总数
|
|
188
|
+
*/
|
|
189
|
+
async eraseByType(db, type) {
|
|
190
|
+
return (0, node_util_1.promisify)(this.KLDBLib.erase_type.async)(db, type);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* 更新db
|
|
194
|
+
* @param db db路径
|
|
195
|
+
* @param data 更新数据列表 [{id,type}]
|
|
196
|
+
* @returns 更新操作是否成功
|
|
197
|
+
*/
|
|
198
|
+
async update(db, data) {
|
|
199
|
+
if (!data.length)
|
|
200
|
+
return Promise.reject(-1);
|
|
201
|
+
const idKLBuffer = (0, app_utils_1.getKLBufferByIntArray)(data.map((e) => e.id));
|
|
202
|
+
const typeKLBuffer = (0, app_utils_1.getKLBufferByIntArray)(data.map((e) => e.type));
|
|
203
|
+
return (0, node_util_1.promisify)(this.KLDBLib.update.async)(db, data.length, idKLBuffer.ptr, typeKLBuffer.ptr, null);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 根据feature查询最近邻的type与score
|
|
207
|
+
* @param db db路径
|
|
208
|
+
* @param features
|
|
209
|
+
*/
|
|
210
|
+
async query(db, features) {
|
|
211
|
+
if (features.length == 0)
|
|
212
|
+
return { scores: [], ids: [], types: [] };
|
|
213
|
+
const length = features.length;
|
|
214
|
+
const bufferFeatures = (0, app_utils_1.getBufferByBase64)(features, this.KLConfig.featureDIM);
|
|
215
|
+
const bufferScores = kl_buffer_1.default.alloc(length * 4);
|
|
216
|
+
const bufferTypes = kl_buffer_1.default.alloc(length * 4);
|
|
217
|
+
const bufferIds = kl_buffer_1.default.alloc(length * 4);
|
|
218
|
+
await (0, node_util_1.promisify)(this.KLDBLib.query.async)(db, length, bufferFeatures, bufferScores.ptr, bufferTypes.ptr, bufferIds.ptr);
|
|
219
|
+
return { scores: bufferScores.floatArray, ids: bufferIds.intArray, types: bufferTypes.intArray };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* @TODO 接口太过复杂,算法应提供一版软件端值需提供全图buffer和提取特征的中心坐标与小图宽高即可
|
|
223
|
+
* 提取特征
|
|
224
|
+
*/
|
|
225
|
+
async featureExtract(data) {
|
|
226
|
+
const { src, channel, width, height, dist, x, y } = data;
|
|
227
|
+
// 外环切区域不能用于注册,注册无效区域(防呆区域) deadproofArea = 64
|
|
228
|
+
const { featureHeight: h, featureWidth: w, deadproofArea } = this.KLConfig;
|
|
229
|
+
if (!src || !dist)
|
|
230
|
+
return Promise.reject();
|
|
231
|
+
if (x < deadproofArea || x > width - deadproofArea || y < deadproofArea || y > height - deadproofArea) {
|
|
232
|
+
return Promise.reject('注册区域无效!');
|
|
233
|
+
}
|
|
234
|
+
const buffer = await this.readImage(src, width, height, channel);
|
|
235
|
+
const cropBuffer = Buffer.alloc(w * h * channel);
|
|
236
|
+
// [srcROI.x, srcROI.y, srcROI.w, srcROI.h, distROI.x, distROI.y, distROI.w, distROI.h, cx/特征在小图中的位置, cy]
|
|
237
|
+
const roi = (0, app_utils_1.correctExtractROI)(x, y, w, h, width, height);
|
|
238
|
+
await (0, node_util_1.promisify)(this.UtilsLib.copy.async)(buffer, height, width, roi.ptr, cropBuffer, h, w, roi.intPtr[4], channel);
|
|
239
|
+
const bufferFeature = Buffer.alloc(this.KLConfig.featureDIM * 4);
|
|
240
|
+
await (0, node_util_1.promisify)(this.KLDBLib.featureExtract.async)(cropBuffer, h, w, channel, roi.intPtr[8], bufferFeature);
|
|
241
|
+
await this.writeImage(dist, w, h, channel, cropBuffer, true);
|
|
242
|
+
return {
|
|
243
|
+
feature: bufferFeature.toString('base64'),
|
|
244
|
+
position: [x - 8, y - 8, 24, 24, roi.int[0], roi.int[1]],
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* 采集正常图像上的特征向量
|
|
249
|
+
* 此操作会向db写入特征数据与生成对应的sample小图
|
|
250
|
+
*/
|
|
251
|
+
async coreLearn(data) {
|
|
252
|
+
const KLConfig = this.KLConfig;
|
|
253
|
+
const { src, srcMask, width = KLConfig.width, height = KLConfig.height, channel = KLConfig.channel, db, threshold, sampleDir, normalId = 0, learnUntilNone = false, featureCount = 1024, } = data;
|
|
254
|
+
if (!db || !sampleDir)
|
|
255
|
+
return;
|
|
256
|
+
await this.load(db);
|
|
257
|
+
const buffer = await this.readImage(src, width, height, channel);
|
|
258
|
+
let bufferMask = null;
|
|
259
|
+
if (srcMask)
|
|
260
|
+
bufferMask = await this.readImage(srcMask, width, height, 1);
|
|
261
|
+
// 提取的特征
|
|
262
|
+
const features = [];
|
|
263
|
+
const bufferFeatures = kl_buffer_1.default.alloc(featureCount * 3 * 4);
|
|
264
|
+
let num;
|
|
265
|
+
do {
|
|
266
|
+
num = await (0, node_util_1.promisify)(this.KLDBLib.coreLearn.async)(db, buffer, bufferMask, height, width, channel, normalId, featureCount, threshold, bufferFeatures.buffer);
|
|
267
|
+
const arr = bufferFeatures.intArray;
|
|
268
|
+
for (let i = 0; i < num; i++) {
|
|
269
|
+
features.push({ id: arr[3 * i], x: arr[3 * i + 1], y: arr[3 * i + 2] });
|
|
270
|
+
}
|
|
271
|
+
} while (learnUntilNone && num === featureCount);
|
|
272
|
+
this.cropSamples(buffer, width, height, channel, sampleDir, features);
|
|
273
|
+
return features;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* 裁剪sample小图
|
|
277
|
+
*/
|
|
278
|
+
async cropSamplesBySrc(param) {
|
|
279
|
+
const { src, channel, width, height, sampleDir, data } = param;
|
|
280
|
+
if (!src || !sampleDir || !data.length)
|
|
281
|
+
return false;
|
|
282
|
+
const buffer = await this.readImage(src, width, height, channel);
|
|
283
|
+
await this.cropSamples(buffer, width, height, channel, sampleDir, data);
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* 裁剪sample小图
|
|
288
|
+
*/
|
|
289
|
+
async cropSamples(buffer, width, height, channel, sampleDir, data) {
|
|
290
|
+
const { featureHeight: w, featureWidth: h } = this.KLConfig;
|
|
291
|
+
sampleDir = path.normalize(sampleDir + '/');
|
|
292
|
+
await fs.mkdir(sampleDir, { recursive: true });
|
|
293
|
+
for (let i = 0, item; item = data[i]; i++) {
|
|
294
|
+
const cropBuffer = Buffer.alloc(w * h * channel);
|
|
295
|
+
const cropROI = (0, app_utils_1.calcuCopyROI)(item.x, item.y, w, h, width, height);
|
|
296
|
+
(0, node_util_1.promisify)(this.UtilsLib.copy.async)(buffer, height, width, cropROI.ptr, cropBuffer, h, w, cropROI.intPtr[4], channel);
|
|
297
|
+
this.writeImage(sampleDir + item.id + ".png", w, h, channel, cropBuffer);
|
|
298
|
+
}
|
|
299
|
+
return data;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* 删除sample小图
|
|
303
|
+
* @param param0
|
|
304
|
+
* @param db sample小图对应的db
|
|
305
|
+
* @param srcs sample小图地址
|
|
306
|
+
* @returns db的条目总数
|
|
307
|
+
*/
|
|
308
|
+
async eraseSamples(db, srcs) {
|
|
309
|
+
// 先删数据再删图
|
|
310
|
+
const ids = (0, app_utils_1.getIdsBySamples)(srcs);
|
|
311
|
+
const count = await this.eraseByIds(db, ids);
|
|
312
|
+
await (0, app_utils_1.deleteSamples)(srcs);
|
|
313
|
+
return count;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* 移动sample小图,只能移动到同pattern
|
|
317
|
+
* @param db sample小图对应的db
|
|
318
|
+
* @param data sample小图的地址 [{src,dist}]
|
|
319
|
+
* @returns 是否成功
|
|
320
|
+
*/
|
|
321
|
+
async updateSamples(db, data) {
|
|
322
|
+
// 先拷贝sample小图,待db更新成功之后再将原小图删除
|
|
323
|
+
await (0, app_utils_1.copySamples)(data);
|
|
324
|
+
const count = await this.update(db, data.map(e => (0, app_utils_1.getIdTypeBySample)(e.dist)));
|
|
325
|
+
data.forEach(e => fs.unlink(e.src));
|
|
326
|
+
return count;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* insertsample小图,同时添加到db
|
|
330
|
+
* @param db sample小图对应的db
|
|
331
|
+
* @param data sample小图的地址与特征 [{src,dist,feature}]
|
|
332
|
+
* @returns db的条目总数
|
|
333
|
+
*/
|
|
334
|
+
async insertSamples(db, data) {
|
|
335
|
+
await (0, app_utils_1.copySamples)(data);
|
|
336
|
+
return this.insert(db, data.map(({ dist, feature }) => {
|
|
337
|
+
return { ...(0, app_utils_1.getIdTypeBySample)(dist), feature };
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* 根据.db中的数据格式化sample小图;删除.db文件中没有的小图
|
|
342
|
+
*/
|
|
343
|
+
async formatSamples(db) {
|
|
344
|
+
const data = await this.exportDB(db);
|
|
345
|
+
return (0, app_utils_1.formatSamples)(path.join(this.KLConfig.samplePath, db), data);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* 读图
|
|
349
|
+
*/
|
|
350
|
+
async readImage(src, width, height, channel, buffer) {
|
|
351
|
+
if (!buffer)
|
|
352
|
+
buffer = Buffer.alloc(width * height * channel);
|
|
353
|
+
await (0, node_util_1.promisify)(this.UtilsLib.imread.async)(src, buffer, height, width, channel, true);
|
|
354
|
+
return buffer;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* 写图
|
|
358
|
+
*/
|
|
359
|
+
async writeImage(src, width, height, channel, buffer, mkdir) {
|
|
360
|
+
if (mkdir)
|
|
361
|
+
await fs.mkdir(path.dirname(src), { recursive: true });
|
|
362
|
+
return (0, node_util_1.promisify)(this.UtilsLib.imwrite.async)(src, buffer, height, width, channel, true);
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
exports.AppService = AppService;
|
|
366
|
+
__decorate([
|
|
367
|
+
(0, event_emitter_1.OnEvent)('defect.erase'),
|
|
368
|
+
__metadata("design:type", Function),
|
|
369
|
+
__metadata("design:paramtypes", [Number]),
|
|
370
|
+
__metadata("design:returntype", Promise)
|
|
371
|
+
], AppService.prototype, "eraseDefect", null);
|
|
372
|
+
exports.AppService = AppService = __decorate([
|
|
373
|
+
(0, common_1.Injectable)(),
|
|
374
|
+
__param(0, (0, common_1.Inject)('CONFIG_OPTIONS')),
|
|
375
|
+
__metadata("design:paramtypes", [Object])
|
|
376
|
+
], AppService);
|
|
377
|
+
//# sourceMappingURL=app.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.service.js","sourceRoot":"","sources":["../src/app.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import KLBuffer from "kl-buffer";
|
|
2
|
+
import { IdTypeDto, FeatureDto, SampleDto } from "./app.dto";
|
|
3
|
+
export declare function getKLBufferByIntArray(array: number[]): KLBuffer;
|
|
4
|
+
export declare function getBufferByBase64(data: string[], featureDIM: number): Buffer;
|
|
5
|
+
/**
|
|
6
|
+
* 导出.db文件中的特征列表
|
|
7
|
+
*/
|
|
8
|
+
export declare function exportDB(dbPath: string, exportFeature?: boolean): Promise<FeatureDto[]>;
|
|
9
|
+
/**
|
|
10
|
+
* 删除.db文件中没有的小图
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatSamples(samplePath: string, data: FeatureDto[]): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* 拷贝sample小图;将没有拷贝成功的从列表中移除
|
|
15
|
+
*/
|
|
16
|
+
export declare function copySamples(data: SampleDto[]): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* 删除sample小图
|
|
19
|
+
*/
|
|
20
|
+
export declare function deleteSamples(srcs: string[]): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* 根据缺陷小图获取id列表
|
|
23
|
+
*/
|
|
24
|
+
export declare function getIdsBySamples(srcs: string[]): number[];
|
|
25
|
+
/**
|
|
26
|
+
* 根据缺陷小图获取id和type
|
|
27
|
+
*/
|
|
28
|
+
export declare function getIdTypeBySample(src: string): IdTypeDto;
|
|
29
|
+
/**
|
|
30
|
+
* 计算copy的srcROI与distROI
|
|
31
|
+
* @retuns KLBuffer KLBuffer.inArray = [...srcROI, ...distROI]
|
|
32
|
+
*/
|
|
33
|
+
export declare function calcuCopyROI(sx: number, sy: number, w: number, h: number, tw: number, th: number): KLBuffer;
|
|
34
|
+
/**
|
|
35
|
+
* 修正提取特征的位置
|
|
36
|
+
* @retuns KLBuffer KLBuffer.inArray = [srcROI.x, srcROI.y, srcROI.w, srcROI.h, distROI.x, distROI.y, distROI.w, distROI.h, cx/特征在小图中的位置, cy]
|
|
37
|
+
*/
|
|
38
|
+
export declare function correctExtractROI(sx: number, sy: number, w: number, h: number, tw: number, th: number): KLBuffer;
|