mirror of
https://github.com/sanyuered/WeChat-MiniProgram-AR-WASM.git
synced 2025-10-05 15:06:49 +08:00
152 lines
4.0 KiB
JavaScript
152 lines
4.0 KiB
JavaScript
// 画布
|
||
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)
|
||
},
|
||
})
|