From cd883af92ffd33419d7b33b957ba4c34c26a0919 Mon Sep 17 00:00:00 2001 From: mazengfei <331023091@qq.com> Date: Tue, 4 Nov 2025 15:46:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=8F=9C=E5=93=81=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sw/dualscreen/objbox/FoodModule.kt | 22 ++++++++++++------- .../SecondaryScreenPresentation.kt | 9 ++++++-- .../com/sw/dualscreen/sdk/SensorScaleUtils.kt | 4 ++-- gradle/libs.versions.toml | 14 +++++++++--- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/sw/dualscreen/objbox/FoodModule.kt b/app/src/main/java/com/sw/dualscreen/objbox/FoodModule.kt index 50a976f..ab8a526 100644 --- a/app/src/main/java/com/sw/dualscreen/objbox/FoodModule.kt +++ b/app/src/main/java/com/sw/dualscreen/objbox/FoodModule.kt @@ -11,6 +11,7 @@ import io.objectbox.query.Query import org.pytorch.IValue import org.pytorch.Module import org.pytorch.torchvision.TensorImageUtils +import timber.log.Timber import java.io.File import java.io.FileOutputStream import java.io.IOException @@ -18,6 +19,7 @@ import java.io.InputStream object FoodModule { + private const val THRESHOLD = 0.8 private lateinit var module_mobile: Module private lateinit var box: Box private lateinit var embeddingsList: List> @@ -37,7 +39,7 @@ object FoodModule { // } } - fun queryFood(bitmap: Bitmap, queryCount:Int = 15): List { + fun queryFood(bitmap: Bitmap, queryCount: Int = 15): List { val inputTensor = TensorImageUtils.bitmapToFloat32Tensor( bitmap, NO_MEAN_RGB, // [0.485, 0.456, 0.406] TORCHVISION_NORM_MEAN_RGB @@ -45,20 +47,24 @@ object FoodModule { ) val outputTensor = module_mobile.forward(IValue.from(inputTensor)).toTensor() val floatArray = outputTensor.dataAsFloatArray - return queryFood(floatArray,queryCount) + return queryFood(floatArray, queryCount) } - fun queryFood(floatArray: FloatArray, queryCount:Int = 15): List { - val query: Query = box.query(Food_.foodVector.nearestNeighbors(floatArray, queryCount)).build() + fun queryFood(floatArray: FloatArray, queryCount: Int = 15): List { + val query: Query = + box.query(Food_.foodVector.nearestNeighbors(floatArray, queryCount)).build() //查询比较分数 // val tempList = query.findWithScores().sortedBy { it.score }.map { "${it.get().name}|${it.get().foodIdx}|${it.score}" } val map = mutableMapOf() query.findIdsWithScores().forEach { val food = box.get(it.id) - //FoodQueryResult(id = it.id, name = food.name, foodIdx = food.foodIdx, score = it.score) - food.name?.let { key -> - val count = map[key] ?: 0 - map.put(key, count + 1) + Timber.d("${food.name}|${food.foodIdx}|${it.score}") + if (1 - it.score >= THRESHOLD) { + //FoodQueryResult(id = it.id, name = food.name, foodIdx = food.foodIdx, score = it.score) + food.name?.let { key -> + val count = map[key] ?: 0 + map.put(key, count + 1) + } } } val list = map.entries.sortedByDescending { it.value }.map { it.key } diff --git a/app/src/main/java/com/sw/dualscreen/presentation/SecondaryScreenPresentation.kt b/app/src/main/java/com/sw/dualscreen/presentation/SecondaryScreenPresentation.kt index 4bd5688..c70a005 100644 --- a/app/src/main/java/com/sw/dualscreen/presentation/SecondaryScreenPresentation.kt +++ b/app/src/main/java/com/sw/dualscreen/presentation/SecondaryScreenPresentation.kt @@ -74,8 +74,9 @@ class SecondaryScreenPresentation( private lateinit var itemUserNutritionBinding: ItemUserNutritionBinding private lateinit var stepChangeCallback: (Int) -> Unit - // 上一次的计算热量结果 - private var lastWeight = 0.0 + + private var detectWeight = 0.0 //识别菜品时的重量 + private var lastWeight = 0.0 // 上一次的计算热量结果 private val debouncer = Debouncer(500) private var recognitionTime: Long = 0L // 人脸识别时的时间 private var recognitionWeight: Double = 0.0 // 人脸识别时的重量 @@ -288,6 +289,10 @@ class SecondaryScreenPresentation( calculateNutrition(recognitionWeight - lastWeight) } + fun updateDetectWeight(weight: Double) { + detectWeight = weight * 1000 // 将千克转成克 + } + /** * 余量取餐 */ diff --git a/app/src/main/java/com/sw/dualscreen/sdk/SensorScaleUtils.kt b/app/src/main/java/com/sw/dualscreen/sdk/SensorScaleUtils.kt index d3ad7cb..04402f0 100644 --- a/app/src/main/java/com/sw/dualscreen/sdk/SensorScaleUtils.kt +++ b/app/src/main/java/com/sw/dualscreen/sdk/SensorScaleUtils.kt @@ -19,7 +19,7 @@ object SensorScaleUtils { private var mSensorScale: SensorScale? = null private var isOpened: Boolean = false private var isRead: Boolean = false - private var isZero = false + var isZero = false private var callback: Callback? = {} private var lastWeight: Double? = null @@ -118,8 +118,8 @@ object SensorScaleUtils { fun zero() { Timber.d("zero isOpened = $isOpened, mSensorScale = $mSensorScale") if (!isOpened) return -// isZero = true mSensorScale?.zero { + isZero = true Timber.d("zero 零位标定操作成功") ToastUtils.showToast("零位标定操作成功") } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8c59cbb..ab75124 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,11 @@ fragmentKtx = "1.5.6" lifecycleViewmodelKtx = "2.8.3" lifecycleRuntimeKtx = "2.8.3" -pytorch="1.13.0" +pytorch = "1.13.0" + +recyclerview = "1.3.2" + +#baseQuickAdapter = "4.1.2" [libraries] android-core = { module = "com.google.zxing:android-core", version.ref = "androidCore" } @@ -64,8 +68,12 @@ androidx-fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" } -pytorch-android={ group = "org.pytorch", name = "pytorch_android", version.ref = "pytorch" } -pytorch-android-torchvision={ group = "org.pytorch", name = "pytorch_android_torchvision", version.ref = "pytorch" } +pytorch-android = { group = "org.pytorch", name = "pytorch_android", version.ref = "pytorch" } +pytorch-android-torchvision = { group = "org.pytorch", name = "pytorch_android_torchvision", version.ref = "pytorch" } + +#base-quick-adapter-ktx = { module = "io.github.cymchad:BaseRecyclerViewAdapterHelper4", version.ref = "baseQuickAdapter" } +androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" } + [plugins] android-application = { id = "com.android.application", version.ref = "agp" }