1. 项目简介 本项目是一个基于HarmonyOS的图像识别应用,用户可以选择图片进行植物识别,并获取识别结果。应用使用百度AI开放平台的图像识别API进行图像分析。 2. 设计思路 用户界面包含选择图片按钮、显示图片、识别按钮以及显示识别结果的文本框。 用户选择图片后,图片会显示在界面上。 用户点击识别按钮后,应用首先获取访问令牌,然后将图片转换为Base64编码,并调用百度AI的图像识别API进行识别。 最终识别结果会显示在界面上。 3. 代码实现详细解释 数据初始化 在数据初始化部分,定义了几个状态变量来存储用户输入和处理结果。 @Entry @Component struct Index { @State access_token: string = '24.b838d59d269ca45a880dd3138a7eab04.2592000.1720668624.282335-81083572' @State Base64Str: string = 'Hello World' @State result_description: string = '' @State result_image: string = 'image' @State image_name:string='potato'; @State r:string='识别结果'; 页面构建 在页面构建部分,定义了用户界面的布局,包括按钮和显示区域。 javascript 复制代码 onPageShow() { const param = router.getParams(); if (param) { console.log("Received param info:", param['info']); this.image_name = param['info']; console.log("Updated image_url:", this.image_name); } else { // 使用一个已知有效的占位符图片URL进行测试 this.image_name = 'potato'; } } build() { Column({ space: 10 }) { Button('选择图片') .onClick(() => { this.result_description=''; router.pushUrl({ url: 'pages/image' }); }); Image("/pages/"+this.image_name+".png") .width(150) .height(150) .onError((err) => { console.error('Image load error:', err); console.log('Image URL:', this.image_name); }); Button('识别') .onClick(() => { console.info('Button clicked'); console.log("=========="+$r('app.media.potato').id) console.log("=========="+$r('app.media.potato').id) this.r='正在识别中...' this.GetAccessToken(); this.GetBase64(() => { console.info('Base64 obtained, calling AI_request'); this.recognition(); }); }); Text(this.r) .fontSize(20) .textAlign(TextAlign.Start) .width('90%') Text(this.result_description) .fontSize(20) .textAlign(TextAlign.Start) .width('90%') .height(250); } .width('100%') .height('100%'); } 选择图片 用户点击“选择图片”按钮后,应用会跳转到图片选择页面,并将选择的图片名保存到状态变量中。 javascript 复制代码 onPageShow() { const param = router.getParams(); if (param) { console.log("Received param info:", param['info']); this.image_name = param['info']; console.log("Updated image_url:", this.image_name); } else { // 使用一个已知有效的占位符图片URL进行测试 this.image_name = 'potato'; } } 获取访问令牌 调用百度AI开放平台的OAuth接口获取访问令牌。 javascript 复制代码 GetAccessToken() { let httpRequest = http.createHttp(); httpRequest.request( "https://aip.baidubce.com/oauth/2.0/token?client_id=mpXlmuTMsl6kFbocBKmi7Ros&client_secret=p2ykY40Wj6Pmk3XKy58UF1CfR3HXBiKl&grant_type=client_credentials", { method: http.RequestMethod.POST, header: { 'Content-Type': 'application/json', "Accept":"application/json" }, connectTimeout: 60000, readTimeout: 60000, }, (err, data) => { if (!err) { let obj = JSON.parse(data.result.toString()); this.access_token = obj.access_token; console.info('Access token obtained:', this.access_token); } else { console.error('Access token error:', JSON.stringify(err)); httpRequest.destroy(); } }); } 获取Base64编码 从资源管理器中获取选定图片的Base64编码。 javascript 复制代码 GetBase64(callback) { let that = this; resourceManager.getResourceManager((error, mgr) => { if (error != null) { } else { mgr.getMediaBase64ByName(this.image_name, (error, value) => { if (error != null) { console.error("Base64 error:", error); } else { console.info('Base64 result:', value); that.Base64Str = that.getCaption(value); console.info('Base64Str:', that.Base64Str); if (callback) callback(); } }); } }); } // 去掉编码头 getCaption(obj) { var index = obj.lastIndexOf("\,"); obj = obj.substring(index + 1, obj.length); return obj; } 图像识别 将Base64编码的图片发送到百度AI的图像识别API进行识别,并处理返回结果。 javascript 复制代码 recognition() { let httpRequest = http.createHttp(); httpRequest.request( "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant?access_token=" + this.access_token, { method: http.RequestMethod.POST, header: { 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json' }, extraData: `image=${encodeURIComponent(this.Base64Str)}`, // 确保Base64字符串正确编码 connectTimeout: 60000, readTimeout: 60000, }, (err, data) => { if (!err) { try { console.log("=================" + data.result.toString()); let obj = JSON.parse(data.result.toString()); if (obj.result && obj.result.length > 0) { this.r='识别结果' this.result_description = obj.result[0].name; } } catch (parseError) { console.error('Failed to parse response:', parseError); } } else { console.error('recognition error:', JSON.stringify(err)); } httpRequest.destroy(); }); } }