added OpenCV

This commit is contained in:
AR Fashion
2021-12-05 23:41:02 +08:00
committed by GitHub
parent 80744fe9de
commit fad66a56e0
14 changed files with 9895 additions and 4 deletions

151
package_lesson2/index.js Normal file
View File

@@ -0,0 +1,151 @@
// 画布
const canvas1 = 'canvas1'
// 示例图片
const sampleImage1 = './assets/sampleImage1.jpg'
// 画布最大宽度
const maxCanvasWidth = 375
// wasm路径
global.wasm_url = '/package_lesson2/assets/opencv3.4.16.wasm.br'
// opencv_exec.js会从global.wasm_url获取wasm路径
let cv = require('./assets/opencv_exec.js');
Page({
// 画布的dom对象
canvasDom: null,
data: {
canvas1Width: 375,
canvas1Height: 150,
// 示例图片
sampleImage1Url: sampleImage1,
},
onReady() {
// 可见的画布
this.initCanvas(canvas1)
},
// 获取画布
initCanvas(canvasId) {
var _that = this;
wx.createSelectorQuery()
.select('#' + canvasId)
.fields({ node: true, size: true })
.exec((res) => {
const canvas2d = res[0].node;
// 设置画布的宽度和高度
canvas2d.width = res[0].width;
canvas2d.height = res[0].height;
_that.canvasDom = canvas2d
});
},
// 获取图像数据和调整图像大小
getImageData(image,offscreenCanvas) {
var _that = this
// const ctx = wx.createCanvasContext(canvasId);
var canvasWidth = image.width;
if (canvasWidth > maxCanvasWidth) {
canvasWidth = maxCanvasWidth;
}
// canvas Height
var canvasHeight = Math.floor(canvasWidth * (image.height / image.width));
// 离屏画布的宽度和高度不能小于图像的
offscreenCanvas.width = canvasWidth;
offscreenCanvas.height = canvasHeight;
// draw image on canvas
var ctx = offscreenCanvas.getContext('2d')
ctx.drawImage(image, 0, 0, canvasWidth, canvasHeight);
// get image data from canvas
var imgData = ctx.getImageData(0, 0, canvasWidth, canvasHeight);
return imgData
},
// 创建图像对象
async createImageElement(imgUrl) {
var _that = this
// 创建2d类型的离屏画布需要微信基础库2.16.1以上)
var offscreenCanvas = wx.createOffscreenCanvas({type: '2d'});
const image = offscreenCanvas.createImage();
await new Promise(function (resolve, reject) {
image.onload = resolve
image.onerror = reject
image.src = imgUrl
})
const imageData = _that.getImageData(image,offscreenCanvas)
return imageData
},
imgProcess1(imageData, canvasDom) {
// 读取图像
let src = cv.imread(imageData);
let dst = new cv.Mat();
// 灰度化
cv.cvtColor(src, dst, cv.COLOR_RGBA2GRAY, 0);
// 显示图像
cv.imshow(canvasDom, dst);
// 回收对象
src.delete();
dst.delete()
},
imgProcess2(imageData, canvasDom) {
let src = cv.imread(imageData);
let dst = new cv.Mat();
// 灰度化
cv.cvtColor(src, src, cv.COLOR_RGBA2GRAY, 0);
// 边缘检测
cv.Canny(src, dst, 50, 100, 3, false);
cv.imshow(canvasDom, dst);
src.delete();
dst.delete()
},
imgProcess3(imageData, canvasDom) {
let src = cv.imread(imageData);
let dst = new cv.Mat();
// 灰度化
cv.cvtColor(src, src, cv.COLOR_RGBA2GRAY, 0);
var orb = new cv.ORB();
var keypoints = new cv.KeyPointVector();
var descriptors = new cv.Mat();
// 特征点
orb.detect(src, keypoints)
// 特征点的描述因子
orb.compute(src, keypoints, descriptors)
// 绘制特征点
cv.drawKeypoints(src, keypoints, dst)
cv.imshow(canvasDom, dst);
src.delete();
dst.delete()
},
async btnRun1() {
var _that = this;
// 将图像转换为ImageData
const image1Data = await _that.createImageElement(sampleImage1)
// 设置画布的显示大小
_that.setData({
canvas1Width: image1Data.width,
canvas1Height: image1Data.height,
})
_that.imgProcess1(image1Data, _that.canvasDom)
},
async btnRun2() {
// 同上
var _that = this;
const image1Data = await _that.createImageElement(sampleImage1)
_that.setData({
canvas1Width: image1Data.width,
canvas1Height: image1Data.height,
})
_that.imgProcess2(image1Data, _that.canvasDom)
},
async btnRun3() {
// 同上
var _that = this;
const image1Data = await _that.createImageElement(sampleImage1)
_that.setData({
canvas1Width: image1Data.width,
canvas1Height: image1Data.height,
})
_that.imgProcess3(image1Data, _that.canvasDom)
},
})