- 第一步肯定是去http://ai.baidu.com 注册账号,登陆并注册创建应用。
- http://ai.baidu.com/docs#/Begin/top 具体操作就看百度给出的文档即可很详细的哦。图文说明的
- 第二步https://mp.weixin.qq.com/cgi-bin/wx注册个微信小程序(作者不会移动端开发所以选择了微信小程序)
- 微信小程序需要注意事项:1.必须有一个具有公网IP的服务器。且需要HTTPS协议(这样很好,可以直接跳转域名备案的问题) 2.选择BCC(百度云服务器)是一个不错的选择。当然别家的也是可以的
- 第三步就是熟悉百度AI文档,并进行测试接口,以备后续使用
- http://ai.baidu.com/docs#/ImageClassify-API/top 图像识别的文档。包含了示例代码根据自己所学语言查看即可。(最好会一门后端开发语言 作者使用Java)
图像识别模块截图示意 小程序专属码(微信扫一扫即可体验查看)
官网给出的Java代码示例:大家可以直接复制替换参数使用即可
package com.baidu.ai.aip;
import com.baidu.ai.aip.utils.Base64Util;
import com.baidu.ai.aip.utils.FileUtil;
import com.baidu.ai.aip.utils.HttpUtil;
import java.net.URLEncoder;
/**
* 菜品识别
*/
public class Dish {
/**
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
*/
public static String dish() {
// 请求url
String url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/dish";
try {
// 本地文件路径
String filePath = "[本地文件路径]";
byte[] imgData = FileUtil.readFileByBytes(filePath);
String imgStr = Base64Util.encode(imgData);
String imgParam = URLEncoder.encode(imgStr, "UTF-8");
String param = "image=" + imgParam + "&top_num=" + 5;
// 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
String accessToken = "[调用鉴权接口获取的token]";
String result = HttpUtil.post(url, accessToken, param);
System.out.println(result);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Dish.dish();
}
}
作者本人的微信小程序展示分2大部分
- Java后端实现:使用SpringMVC实现上传图片并进行读取图片的本地路径转base64请求百度AI接口实现。由于后台具体功能尚未完善就不公开源码了。示例代码如下:
/**
* 上传文件方法 植物识别
* @param request
* @param response
* @throws Exception
*/
@RequestMapping(value="/uploadBDPLANT",method=RequestMethod.POST)
public void UploadBDPLANT()throws Exception{
String result = "";
MultipartHttpServletRequest mpRequest = (MultipartHttpServletRequest)this.request;
int sizeThreshold = 6144;
String respath = "/uploads";
String despath = "/uploads/";
String baseResPath = getRealPath(respath);
String baseDespath = getRealPath(despath);
File repository = new File(baseResPath);
long sizeMax = 8388608L;
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setRepository(repository);
diskFileItemFactory.setSizeThreshold(sizeThreshold);
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
servletFileUpload.setSizeMax(sizeMax);
Iterator iter = mpRequest.getFileNames();
MultipartFile file = null;
while (iter.hasNext()) {
file = mpRequest.getFile((String)iter.next());
if ((file != null) && (file.getSize() != 0L))
{
byte[] b = file.getBytes();
String filename = "BDPLANT" + new Date().getTime() / 1000L + file.getOriginalFilename();
String allfilename = filename.substring(0, filename.lastIndexOf("."));
String ext = filename.substring(filename.lastIndexOf(".") + 1);
if (!ext.toLowerCase().equals("amr")) {
logger.info("==============非音频文件==============");
File targetDir = new File(baseDespath);
System.out.println("非音频文件 目录是否存在 是否是目录" + targetDir.exists() + "-" + targetDir.isDirectory());
try {
boolean a = targetDir.mkdirs();
System.out.println(a + "目录已经创建");
} catch (Exception e) {
logger.error("目录创建失败:" + e.getMessage(), e);
}
String path = baseDespath + File.separator + filename;
File target = new File(path);
System.out.println("target path=" + path);
if (!target.exists())
try {
boolean a = target.createNewFile();
System.out.println(a + "文件夹创建");
} catch (Exception e) {
logger.error("文件夹创建失败" + e.getMessage(), e);
}
try
{
FileUtil.saveFile(b, path);
String token = getBDTokenParam();
String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant";
byte[] imgData = FileUtil.readFileByBytes(path);
String imgStr = com.bdxc.util.Base64Util.encode(imgData);
String params = URLEncoder.encode("image", "UTF-8") + "=" + URLEncoder.encode(imgStr, "UTF-8")+"&top_num=1";
String responseBD = HttpUtils.post(url, token, params);
net.sf.json.JSONObject object = net.sf.json.JSONObject.fromObject(responseBD);
Map classMap = new HashMap();
classMap.put("result",com.bdxc.vo.baiduVO.BDPlantAnimal.Result.class);
BDPlantAnimal bdPlant = (BDPlantAnimal) JSONObject.toBean(object,BDPlantAnimal.class,classMap);
if (bdPlant != null) {
double returnscore = bdPlant.getResult().get(0).getScore();
if (returnscore<0.001) {
result = "{\"result\":\"fail\",\"words\":\"未能识别出植物或可信度过低 Sorry\"}";
PrintUtil.printJson(this.response, result);
continue;
}
logger.info("百度植物返回的信息" + object.toString());
String name = bdPlant.getResult().get(0).getName().toString();
String score = Double.toString(bdPlant.getResult().get(0).getScore()*100).substring(0, 5);
result = "{\"result\":\"ok\",\"words\":\"success\",\"name\":\"" +name + "\",\"score\":\""+score+"%\"}";
logger.info("===========百度植物输出为" + result);
PrintUtil.printJson(this.response, result);
continue;
}
}catch (Exception e){
logger.error("非音频文件上传失败" + e.getMessage(), e);
result = "{\"result\":\"fail\",\"words\":\"植物识别失败\"}";
PrintUtil.printJson(this.response, result);
}
}
else {
File targetDir = new File(baseDespath);
System.out.println("音频文件 目录是否存在 是否是目录" + targetDir.exists() + "-" + targetDir.isDirectory());
try {
boolean a = targetDir.mkdirs();
System.out.println("音频文件目录不存在 创建成功" + a);
} catch (Exception e) {
logger.error("音频文件目录创建失败" + e.getMessage(), e);
}
String path = baseDespath + File.separator + filename;
File target = new File(path);
System.out.println("音频文件存放目录" + path);
if (!target.exists())
try {
boolean a = target.createNewFile();
System.out.println("音频文件夹创建成功" + a);
} catch (Exception e) {
logger.error("音频文件夹创建失败" + e.getMessage(), e);
}
try
{
FileUtil.saveFile(b, path);
System.out.println("====音频文件=====" + filename);
result = "{\"result\", \"OK\"}";
PrintUtil.printJson(this.response, result);
} catch (Exception e) {
logger.error("音频文件上传失败 或者 转换失败" + e.getMessage(), e);
result = "{\"result\", \"FAIL\"}";
PrintUtil.printJson(this.response, result);
}
}
} else {
logger.error("请检查上传文件是否正确");
result = "{\"result\", \"FAIL\"}";
PrintUtil.printJson(this.response, result);
}
}
}
- 微信小程序前端实现页面(源代码地址如下):
https://gitee.com/xshuai/weixinxiaochengxu
TOP
切换版块
QQ:783021975
你好,方便邮箱联系吗?
不太明白您的意思
小程序代码链接入口直接填写百度智能云的API吗?
此话是不错,搭配才是最重要的。这样职业生涯路才会长。
语言不在于多,精通就行;编译型、解释型语言搭配更高,如:java+python+shell
前台是跟java没关系,但是后台用java的也好少,是不是要考虑多学习下其他的语言呢。
小程序和Java没关系。后台用什么语言也行 我只是熟悉Java罢了。
可是小程序用java的好少啊
最新版小程序代码
https://gitee.com/xshuai/weixinxiaochengxu
小程序后台代码
https://gitee.com/xshuai/xai
小帅的代码习惯真不是一般的好啊.
一直想了解小程序的开发,感谢楼主分享。
大神,好想给你打工,带我飞。
啊。现成的第三方平台都一堆一堆的
laoyu2005@163.com 有意向邮箱联系一下
楼主有兴趣一起搞个小程序创业吗?
没太懂
太棒了,值得学习
小程序开发应该不复杂吧,做了桌面版
很详细,长知识了