一、从一次小吃街“踩雷”说起
楼主喜欢旅游,热爱骑行,喜欢在路上的感觉。从而也发现每到一个城市,总能发现几个美食街。炭烤的香气、铁板上的滋滋声、五光十色的招牌……但每次面对琳琅满目的小吃,总免不了犯难:这个圆滚滚炸得金黄的究竟是炸鲜奶还是炸酸奶?那串红彤彤的辣度到底几颗星?网红推荐的“暴辣鸡脚”吃了会不会直接爆痘?更别提那些加了各种酱料的奇怪组合,我连名字都叫不上来。
作为一枚资深的吃货,我渴望一种方式,能让我在目光扫过美食的瞬间,就“读懂”它——不仅是名字,还有热量、成分、辣度、甚至网友的推荐指数。这时,我脑海中浮现出最近接触的AI Glasses产品。如果戴上眼镜,看到小吃时,眼前直接浮现它的“美食名片”,那该多酷?
于是,一个面向“吃货”的技术方案应运而生:AI眼镜 + 图像识别 + 美食百科 + AR投射。用户只需用眼镜扫过街边小吃,系统便实时识别并投射出小吃的百科信息,让每一次逛吃都变成一场有准备的“美食探险”。
目标用户:吃货、游客、注重健康饮食的人群、带小朋友逛吃的家长。
二、系统设计:看见即“识”,边逛边学
整个系统采用端云协同的混合架构,核心流程如下:
- 图像采集:眼镜摄像头捕捉用户注视的小吃画面。
- 端侧预处理:本地进行图像裁剪、去噪、增强,提取关键特征,压缩后上传。
- 云侧识别:云端AI模型对图像进行精确分类,匹配对应的小吃品种。
- 百科匹配:根据识别结果,从美食知识库中提取名称、热量、成分、辣度等信息。
- AR投射:将信息以悬浮窗形式投射到用户视野中,不影响正常观看。
三、关键代码实现
1. 图像采集与预处理(Java)
使用CXR-M SDK连接摄像头,并增加自动对焦与防抖优化,确保小吃细节清晰。
java
// 小吃街模式摄像头服务 public class SnackCameraService extends Service { private CameraDevice mCameraDevice; private HandlerThread mBackgroundThread; private Handler mBackgroundHandler; @Override public void onCreate() { super.onCreate(); startBackgroundThread(); openCamera(); } private void startBackgroundThread() { mBackgroundThread = new HandlerThread("CameraBackground"); mBackgroundThread.start(); mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); } private void openCamera() { CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE); try { // 选择后置摄像头 manager.openCamera("0", new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { mCameraDevice = camera; createCaptureSession(); } // ... 其他回调 }, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private void createCaptureSession() { // 创建CaptureSession,配置自动对焦模式 List<Surface> surfaces = Arrays.asList(mImageReader.getSurface()); try { mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(mImageReader.getSurface()); // 开启自动对焦 builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); session.setRepeatingRequest(builder.build(), null, mBackgroundHandler); } }, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } // 捕获图像并触发上传 private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = reader -> { Image image = reader.acquireLatestImage(); if (image != null) { // 此处将image转换为字节流,调用上传服务 uploadToCloud(image); image.close(); } }; }
技术亮点:
- 使用独立线程处理图像流,避免阻塞UI。
- 开启连续自动对焦,适合小吃街多变的拍摄距离。
- 图像捕获后立即释放,保持内存稳定。
2. 云侧识别与美食百科匹配(Python)
调用百度智能云食物识别API,并匹配本地美食百科库(可扩展为在线知识图谱)。
python
import requests import base64 import json # ---------------------- 1. 配置(需申请百度云AK/SK)---------------------- API_KEY = "你的百度云API_KEY" SECRET_KEY = "你的百度云SECRET_KEY" TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token" RECOGNIZE_URL = "https://aip.baidubce.com/rest/2.0/image-classify/v1/dish" # 菜品识别 # ---------------------- 2. 本地美食百科(可根据API结果动态扩展)---------------------- SNACK_ENCYCLOPEDIA = { "炸鲜奶": { "热量": "约200千卡/100g", "成分": "牛奶、淀粉、糖、面包糠", "辣度": "不辣", "推荐指数": "⭐⭐⭐⭐", "温馨提示": "外酥里嫩,小心烫口" }, "烤面筋": { "热量": "约150千卡/串", "成分": "面筋、孜然、辣椒粉", "辣度": "可调(默认中辣)", "推荐指数": "⭐⭐⭐⭐⭐", "温馨提示": "趁热吃口感最佳" }, "臭豆腐": { "热量": "约250千卡/份", "成分": "豆腐、卤水、辣椒酱", "辣度": "中辣", "推荐指数": "⭐⭐⭐", "温馨提示": "闻着臭,吃着香,初次尝试建议少量" }, # 更多小吃条目... } # ---------------------- 3. 核心功能:获取token + 识别 + 匹配百科 ---------------------- def get_access_token(): """获取百度云API访问令牌""" params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY} return requests.post(TOKEN_URL, params=params).json().get("access_token") def recognize_snack(image_path): # 1. 读取图片并Base64编码 with open(image_path, "rb") as f: img_base64 = base64.b64encode(f.read()).decode() # 2. 调用百度菜品识别API token = get_access_token() headers = {"Content-Type": "application/x-www-form-urlencoded"} data = {"image": img_base64, "top_num": 1} response = requests.post(f"{RECOGNIZE_URL}?access_token={token}", headers=headers, data=data) result = response.json() # 3. 解析识别结果 if "result" in result and len(result["result"]) > 0: dish_name = result["result"][0]["name"] confidence = round(result["result"][0]["score"] * 100, 2) else: dish_name = "未知小吃" confidence = 0.0 # 4. 匹配百科信息(若无则返回默认) info = SNACK_ENCYCLOPEDICA.get(dish_name, { "热量": "暂无数据", "成分": "未知", "辣度": "未知", "推荐指数": "暂无", "温馨提示": "请以实物为准" }) # 5. 组装最终结果 final = { "小吃名称": dish_name, "置信度": confidence, "百科信息": info } print(json.dumps(final, ensure_ascii=False, indent=2)) return final # 测试 if __name__ == "__main__": recognize_snack("snack.jpg")
技术亮点:
- 使用百度云专业的菜品识别API,准确率高。
- 本地百科可随用户反馈动态更新,甚至接入UGC内容。
- 返回结构化JSON,便于端侧解析与AR展示。
3. AR信息投射(Java)
将识别到的小吃信息以悬浮窗形式投射在视野右上角,并根据热量高低改变背景色(绿色=低卡,黄色=中卡,红色=高卡)。
java
public class SnackARRenderer implements GLSurfaceView.Renderer { private String mSnackInfo = "等待识别..."; private int mCalorieLevel = 0; // 0-低,1-中,2-高 public void updateSnackInfo(String name, String calorie, String level) { mSnackInfo = name + " | " + calorie; // 根据热量设置颜色等级(示例简化) if (calorie.contains("低") || calorie.contains("<150")) mCalorieLevel = 0; else if (calorie.contains("中") || calorie.contains("150~300")) mCalorieLevel = 1; else mCalorieLevel = 2; } @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrthof(0, 1, 0, 1, -1, 1); // 2D正交投影 // 绘制背景色块(根据热量等级) if (mCalorieLevel == 0) gl.glColor4f(0.0f, 1.0f, 0.0f, 0.7f); // 半透明绿 else if (mCalorieLevel == 1) gl.glColor4f(1.0f, 1.0f, 0.0f, 0.7f); // 黄 else gl.glColor4f(1.0f, 0.0f, 0.0f, 0.7f); // 红 // 绘制背景矩形(右上角) gl.glRectf(0.65f, 0.85f, 0.95f, 0.95f); // 绘制文本(简化,实际需使用文本渲染库) gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); drawText(gl, mSnackInfo, 0.67f, 0.90f); } private void drawText(GL10 gl, String text, float x, float y) { // 实际需调用CXR-M SDK的文本渲染接口 // 此处省略实现 } }
技术亮点:
- 根据热量动态配色,一眼识别健康指数。
- 固定右上角显示,避免遮挡美食主体。
- 半透明背景,不影响观察实物。
四、技术亮点与未来想象
这套方案围绕 “端云协同+智能感知+场景化呈现”,让AI眼镜成为吃货的“第二层味蕾”:
- 端云协同:端侧快速采集与预处理,云侧精准识别,响应时间控制在500ms内,实现“即看即知”。
- 智能感知:通过自动对焦与防抖,即使在光线复杂的小吃街也能捕获清晰图像。
- 场景化呈现:信息按需显示,热量分级、温馨提示,甚至可扩展过敏源提醒(如“含花生”)。
当然,这仅是开始。随着大模型升级,未来AI眼镜可化身“美食博士”——看到一碗面,不仅能识别名称,还能告诉你“这是陕西Biangbiang面,筋道十足,推荐搭配冰峰汽水”;扫描一份菜单,直接投射网友推荐菜和人均消费;甚至结合健康数据,提醒你“今日热量已超标,建议选择轻食”。
技术改变生活,AI让逛吃不再盲目。也许明年此时,我们就能戴着这样的眼镜,在夜市里悠然自得,一眼看尽人间烟火里的美食密码。