This commit is contained in:
ivo 2023-03-10 16:47:13 +08:00
parent fabc1861d2
commit 4be4c755e5
15 changed files with 14464 additions and 9 deletions

14
app.js
View File

@ -1,8 +1,18 @@
import updateManager from './common/updateManager'; import updateManager from './common/updateManager';
import * as paddlejs from '@paddlejs/paddlejs-core';
import '@paddlejs/paddlejs-backend-webgl';
// const paddlejs = require('paddlejs');
const plugin = requirePlugin("paddlejs-plugin");
let pdjs;
App({ App({
onLaunch: function () {}, onLaunch: function () {
plugin.register(paddlejs, wx);
},
onShow: function () { onShow: function () {
updateManager(); updateManager();
}, },
}); });

View File

@ -9,7 +9,8 @@
"pages/user/index", "pages/user/index",
"pages/user/session-list/index", "pages/user/session-list/index",
"pages/user/edit/index", "pages/user/edit/index",
"pages/info/content-page/index" "pages/info/content-page/index",
"pages/home/camera/index"
], ],
"tabBar": { "tabBar": {
"custom": true, "custom": true,
@ -49,5 +50,11 @@
"scope.userLocation": { "scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示" "desc": "你的位置信息将用于小程序位置接口的效果展示"
} }
},
"plugins": {
"paddlejs-plugin": {
"version": "2.0.1",
"provider": "wx7138a7bb793608c3"
}
} }
} }

View File

@ -21,8 +21,10 @@
}, },
"dependencies": { "dependencies": {
"dayjs": "^1.9.3", "dayjs": "^1.9.3",
"tdesign-miniprogram": "^0.24.0", "tdesign-miniprogram": "1.0.1",
"tslib": "^1.11.1" "tslib": "^1.11.1",
"@paddlejs/paddlejs-backend-webgl": "^1.0.7",
"@paddlejs/paddlejs-core": "^2.0.7"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^6.8.0", "eslint": "^6.8.0",
@ -33,4 +35,4 @@
"lint-staged": "^10.0.8", "lint-staged": "^10.0.8",
"prettier": "^2.1.2" "prettier": "^2.1.2"
} }
} }

207
pages/home/camera/index.js Normal file
View File

@ -0,0 +1,207 @@
// pages/home/camera/index.js
import {
paddlejs
} from '@paddlejs/paddlejs-core';
import {
Paddlejs
} from '../../../services/_utils/ocr';
Page({
/**
* 页面的初始数据
*/
data: {
isAuth: false,
src: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
const _this = this
wx.getSetting({
success: res => {
if (res.authSetting['scope.camera']) {
// 用户已经授权
_this.setData({
isAuth: true
})
} else {
// 用户还没有授权,向用户发起授权请求
wx.authorize({
scope: 'scope.camera',
success() { // 用户同意授权
_this.setData({
isAuth: true
})
},
fail() { // 用户不同意授权
_this.openSetting().then(res => {
_this.setData({
isAuth: true
})
})
}
})
}
},
fail: res => {
console.log('获取用户授权信息失败')
}
})
},
openSetting() {
const _this = this
let promise = new Promise((resolve, reject) => {
wx.showModal({
title: '授权',
content: '请先授权获取摄像头权限',
success(res) {
if (res.confirm) {
wx.openSetting({
success(res) {
if (res.authSetting['scope.camera']) { // 用户打开了授权开关
resolve(true)
} else { // 用户没有打开授权开关, 继续打开设置页面
_this.openSetting().then(res => {
resolve(true)
})
}
},
fail(res) {
console.log(res)
}
})
} else if (res.cancel) {
_this.openSetting().then(res => {
resolve(true)
})
}
}
})
})
return promise;
},
takePhoto() {
console.log("开始识别图片");
const ctx = wx.createCameraContext()
ctx.takePhoto({
quality: 'high',
success: (res) => {
console.log(res);
this.setData({
src: res.tempImagePath
})
// Paddlejs.predict(res.tempImagePath).then(res => {
// console.log(res);
// })
var pic0 = new Image();
pic0.src = res.tempImagePath;
const this_ = this
pic0.onload = () => {
var img0 = tf.browser.fromPixels(pic0);
this_.predict(img0);
}
// 获取到图片的像素信息
// wx.getImageInfo({
// src: res.tempImagePath,
// success: (imgInfo) => {
// const {
// width,
// height,
// path
// } = imgInfo;
// const canvasId = 'myCanvas';
// const me = this;
// // 获取页面中的canvas上下文tipscanvas设置的宽高要大于选择的图片宽高canvas位置可以绝对定位到视口不可以见
// let ctx = canvas.getContext(canvasId);
// ctx.drawImage(path, 0, 0, width, height);
// ctx.draw(false, () => {
// // API 1.9.0 获取图像数据
// wx.canvasGetImageData({
// canvasId: canvasId,
// x: 0,
// y: 0,
// width: width,
// height: height,
// success(res) {
// console.log(res);
// me.predict({
// data: res.data,
// width: width,
// height: height
// });
// }
// });
// });
// }
// });
}
})
},
predict(imgObj) {
// 4. 在线预测计算
const me = this;
Paddlejs.predict(imgObj, function (data) {
// 5. 对预测结果进行后处理
const maxItem = pdjs.utils.getMaxItem(data);
console.log(maxItem);
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

View File

@ -0,0 +1,6 @@
<!--pages/home/camera/index.wxml-->
<view class='camera'>
<image src="/images/border.png" mode="widthFix"></image>
<camera wx:if="{{isAuth}}" device-position="back" flash="off" binderror="error"></camera>
</view>
<button class="takePhoto" type="primary" bindtap="takePhoto">拍照</button>

View File

@ -0,0 +1,29 @@
/* pages/home/camera/index.wxss */
.camera {
width: 430rpx;
height: 430rpx;
border-radius: 50%;
margin: 20px auto 0;
position: relative;
}
.camera image {
position: absolute;
width: 100%;
height: 100%;
z-index: 10;
}
.camera camera {
width: 428rpx;
height: 428rpx;
}
button.takePhoto:not([size='mini']) {
position: fixed;
bottom: 0;
left: 0;
width: 100vw;
height: 90rpx;
border-radius: 0;
}

View File

@ -95,6 +95,13 @@ Page({
// 上传图片 // 上传图片
uploadPicture() { uploadPicture() {
// 跳转扫描
wx.navigateTo({
url: `/pages/home/camera/index`,
});
return
// 打开摄像头
wx.chooseMedia({ wx.chooseMedia({
count: 1, count: 1,
mediaType: ['image'], mediaType: ['image'],
@ -150,5 +157,26 @@ Page({
wx.navigateTo({ wx.navigateTo({
url: `/pages/home/session/session?sessionId=${sessionId}`, url: `/pages/home/session/session?sessionId=${sessionId}`,
}); });
},
onShareAppMessage() {
var shareObj = {
title: "食品配料分析", // 默认是小程序的名称(可以写slogan等)
path: '/pages/home/home', // 默认是当前页面,必须是以‘/'开头的完整路径
imageUrl: 'https://webplus-cn-hangzhou-s-603871eef968dd14ced82ed5.oss-cn-hangzhou.aliyuncs.com/hextech/static/Hammer_and_Keyboard_2-svg.png', //自定义图片路径可以是本地文件路径、代码包文件路径或者网络图片路径支持PNG及JPG不传入 imageUrl 则使用默认截图。显示图片长宽比是 5:4
success: function (res) {
// 转发成功之后的回调
if (res.errMsg == 'shareAppMessage:ok') {}
},
fail: function () {
// 转发失败之后的回调
if (res.errMsg == 'shareAppMessage:fail cancel') {
// 用户取消转发
} else if (res.errMsg == 'shareAppMessage:fail') {
// 转发失败,其中 detail message 为详细失败信息
}
}
}
return shareObj;
} }
}); });

View File

@ -146,7 +146,10 @@ page {
color: #b9b9b9 !important; color: #b9b9b9 !important;
} }
.content {}
.dialog-content { .dialog-content {
min-width: 100%;
display: flex; display: flex;
justify-content: center; justify-content: center;
flex-direction: column; flex-direction: column;

View File

@ -55,7 +55,7 @@
<view> <view>
<text class="body-value" style="color: #0052d9;" wx:if="{{pageData.standard}}" bindtap="onOpenStandard">{{pageData.standard}}</text> <text class="body-value" style="color: #0052d9;" wx:if="{{pageData.standard}}" bindtap="onOpenStandard">{{pageData.standard}}</text>
<text class="body-empty" wx:else>未识别到数据</text> <text class="body-empty" wx:else>未识别到数据</text>
<t-tag wx:if="{{pageData.standard}}" t-class="standard-tag" variant="light" theme="primary" size="small">{{pageData.standardInfo.type}}</t-tag> <t-tag wx:if="{{pageData.standardInfo.type}}" t-class="standard-tag" variant="light" theme="primary" size="small">{{pageData.standardInfo.type}}</t-tag>
<text wx:if="{{pageData.standardInfo.isFound == 2}}" style="margin-left: 10px; color: #0052d9;">标准查询中…</text> <text wx:if="{{pageData.standardInfo.isFound == 2}}" style="margin-left: 10px; color: #0052d9;">标准查询中…</text>
<text style="margin-left: 20px; color: #0052d9; font-size: 0.875rem; line-height: 1.25rem;" bindtap="onChangeStandard">修正</text> <text style="margin-left: 20px; color: #0052d9; font-size: 0.875rem; line-height: 1.25rem;" bindtap="onChangeStandard">修正</text>
<view wx:if="{{pageData.standardInfo.isFound == 0}}" class="comment">未查询到该标准,请前往国家标准网站查询或修正识别错误,再次查询。</view> <view wx:if="{{pageData.standardInfo.isFound == 0}}" class="comment">未查询到该标准,请前往国家标准网站查询或修正识别错误,再次查询。</view>
@ -64,7 +64,7 @@
<view class="body-row"> <view class="body-row">
<text class="body-key">生产许可证:</text> <text class="body-key">生产许可证:</text>
<view> <view>
<text class="body-value" wx:if="{{pageData.licenseCode.length}}" wx:for="{{pageData.licenseCode}}" wx:key="index" wx:for-item="item">{{item}}</text> <view class="body-value" wx:if="{{pageData.licenseCode.length}}" wx:for="{{pageData.licenseCode}}" wx:key="index" wx:for-item="item">{{item}}</view>
<text class="body-empty" wx:if="{{pageData.licenseCode.length == 0}}">未识别到数据</text> <text class="body-empty" wx:if="{{pageData.licenseCode.length == 0}}">未识别到数据</text>
</view> </view>
</view> </view>

View File

@ -40,6 +40,7 @@ Page({
console.log(response.content); console.log(response.content);
this.setData({ this.setData({
pageData: response.content, pageData: response.content,
contentText: response.content.content
}) })
} }
}) })

View File

@ -11,6 +11,6 @@
<text>发表</text> <text>发表</text>
</view> </view>
<t-image t-class="hearder-image" mode="widthFix" src="{{pageData.headerUrl}}"></t-image> <t-image t-class="hearder-image" mode="widthFix" src="{{pageData.headerUrl}}"></t-image>
<rich-text class="content-text" nodes="{{pageData.content}}" /> <rich-text class="content-text" nodes="{{contentText}}" />
</view> </view>

View File

@ -53,6 +53,7 @@
line-height: 1.25rem; line-height: 1.25rem;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
max-width: 200px;
} }
.history-right { .history-right {

14137
resources/paddle.json Normal file

File diff suppressed because it is too large Load Diff

21
services/_utils/ocr.js Normal file
View File

@ -0,0 +1,21 @@
import * as paddlejs from '@paddlejs/paddlejs-core';
import '@paddlejs/paddlejs-backend-webgl';
const plugin = requirePlugin("paddlejs-plugin");
plugin.register(paddlejs, wx);
export const Paddlejs = new paddlejs.Runner({
modelPath: '/resources/paddle.json',
feedShape: {
fw: 224,
fh: 224
},
fill: '#fff',
targetSize: {
height: 224,
width: 224
},
mean: [0.485, 0.456, 0.406],
std: [0.229, 0.224, 0.225],
// needPreheat: true
})