Files
WeChat-MiniProgram-AR-WASM/package_lesson2/index.js
2021-12-05 23:41:02 +08:00

152 lines
4.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 画布
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)
},
})