安卓开发 利用百度识图api进行物体识别
之前的随笔中,已经通过相机或相册获取到了我们想要的图片,接下来进行识图api的配置工作。我使用的是百度的api,利用python获取信息,并在MainActivity中进行调用来输出信息。
一、首先我们需要申请创建一个应用(管理控制台->产品服务->图像识别),百度智能云,得到api key和secret key
利用百度api进行识图的python代码,因为我们一会需要在as中调用函数,所以不需要写主函数了
# coding=utf-8 import sys
import json
import base64 # 保证兼容python2以及python3
IS_PY3 = sys.version_info.major == 3
if IS_PY3:
from urllib.request import urlopen
from urllib.request import Request
from urllib.error import URLError
from urllib.parse import urlencode
from urllib.parse import quote_plus
else:
import urllib2
from urllib import quote_plus
from urllib2 import urlopen
from urllib2 import Request
from urllib2 import URLError
from urllib import urlencode # 防止https证书校验不正确
import ssl
ssl._create_default_https_context = ssl._create_unverified_context API_KEY = '你的API Key' SECRET_KEY = '你的Secret Key' IMAGE_RECOGNIZE_URL = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general" """ TOKEN start """
TOKEN_URL = 'https://aip.baidubce.com/oauth/2.0/token' """
获取token
"""
def fetch_token():
params = {'grant_type': 'client_credentials',
'client_id': API_KEY,
'client_secret': SECRET_KEY}
post_data = urlencode(params)
if (IS_PY3):
post_data = post_data.encode('utf-8')
req = Request(TOKEN_URL, post_data)
try:
f = urlopen(req, timeout=5)
result_str = f.read()
except URLError as err:
print(err)
if (IS_PY3):
result_str = result_str.decode() result = json.loads(result_str) if ('access_token' in result.keys() and 'scope' in result.keys()):
if not 'brain_all_scope' in result['scope'].split(' '):
print ('please ensure has check the ability')
exit()
return result['access_token']
else:
print ('please overwrite the correct API_KEY and SECRET_KEY')
exit() """
读取文件
"""
def read_file(image_path):
f = None
try:
f = open(image_path, 'rb')
return f.read()
except:
print('read image file fail')
return None
finally:
if f:
f.close() """
调用远程服务
"""
def request(url, data):
req = Request(url, data.encode('utf-8'))
has_error = False
try:
f = urlopen(req)
result_str = f.read()
if (IS_PY3):
result_str = result_str.decode()
return result_str
except URLError as err:
print(err) """
调用识别接口并打印结果
"""
def print_result(filename,url):
# 获取图片
file_content = read_file(filename) response = request(url, urlencode(
{
'image': base64.b64encode(file_content),
'top_num': 1
}))
result_json = json.loads(response) #返回识别结果中得分最高的"keyword"
for data in result_json["result"]:
return data["keyword"] #返回结果示例
# "result": [{
# "score": 0.967622,
# "root": "公众人物",
# "baike_info": {
# "baike_url": "http://baike.baidu.com/item/%E6%96%B0%E5%9E%A3%E7%BB%93%E8%A1%A3/8035884",
# "image_url": "http://imgsrc.baidu.com/baike/pic/item/91ef76c6a7efce1b27893518a451f3deb58f6546.jpg",
# "description": "新垣结衣(Aragaki Yui),1988年6月11日出生于冲绳县那霸市。日本女演员、歌手、模特。毕业于日出高中。2001年,参加《nicola》模特比赛并获得最优秀奖。2005年,因出演现代剧《涩谷15》而作为演员出道。2006年,参演校园剧《我的老大,我的英雄》;同年,她还出版了个人首本写真集《水漾青春》。2007年,她从日出高校毕业后开始专注于演艺发展,并发表个人首张音乐专辑《天空》;同年,新垣结衣还主演了爱情片《恋空》,而她也凭借该片获得了多个电影新人奖项。2010年,主演爱情片《花水木》。2011年,主演都市剧《全开女孩》。2012年,相继参演现代剧《Legal High》、剧情片《剧场版新参者:麒麟之翼》。2013年,主演都市剧《飞翔情报室》。2014年,她主演了剧情片《黎明的沙耶》。2016年,主演爱情喜剧《逃避虽可耻但有用》,并凭借该剧获得了多个电视剧女主角奖项。2017年,主演爱情片《恋爱回旋》,凭借该片获得第60届蓝丝带奖最佳女主角;同年11月,她还凭借医疗剧《Code Blue 3》获得第94届日剧学院赏最佳女配角。"
# },
# "keyword": "新垣结衣"
# },
# {
# "score": 0.716067,
# "root": "人物-人物特写",
# "keyword": "头发"
# },
# {
# "score": 0.421281,
# "root": "商品-穿戴",
# "keyword": "围巾"
# },
# {
# "score": 0.22347,
# "root": "商品-五金",
# "keyword": "拉链"
# },
# {
# "score": 0.028031,
# "root": "商品-穿戴",
# "keyword": "脖套"
# }]
二、将这个python代码插入到as中,需要用到chaquopy,具体配置教程
三、在MainActivity中调用python函数
// 初始化Python环境
void initPython(){
if (! Python.isStarted()) {
Python.start(new AndroidPlatform(this));
}
}
mBtnFinish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mTvPath.getText().toString().equals("图片路径:")){
// 如果一张图片都没选
ToastUtil.showMsg(getApplicationContext(), "您还没有选择图片呢!");
}else{
Python py = Python.getInstance();
PyObject token = py.getModule("hello").callAttr("fetch_token");//获取token
String token2 = token.toJava(String.class);//将获取的token转换为Java中的string类型
String url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general?access_token=" + token2;//拼接url PyObject pyObject = py.getModule("hello").callAttr("print_result",mTvPath.getText(),url);//调用python函数
String returnString = pyObject.toString();
System.out.println(returnString);
mTvResult.setText("识别成功!结果为:"+returnString);
}
}
});
遇到的问题:
点击拍照后,照片不会更新,但是并不影响识别结果
原因分析:在安卓7.0以上,使用了共享文件的形式,每次拍照使用了相同的路径,旧图片会被新图片顶替掉,于是在
Glide.with(MainActivity.this).load(outputUri).into(mIvPic);//使用Glide进行图片展示
的时候,glide使用了相同的uri,导致imageview没有刷新图片,但是并不影响使用python函数进行图片识别的结果,因为uri是正确的。
暂时还没有解决
安卓开发 利用百度识图api进行物体识别的更多相关文章
- 安卓开发 利用百度识图api进行物体识别(java版)
之前的随笔中,已经实现了python版本调用api接口,之所以使用python是因为python比java要简洁. 但是我发现在使用过程中,chaquopy插件会弹出底部toast显示"un ...
- OpenResy+Lua 利用百度识图 将图片地址解析成文字
LUA代码:(注:LUA里有一个调用百度识图的接口IP:123.125.115.189(stu.baidu.com),不知为什么我的虚拟机无法解析stu.baidu.com,所以我只能PING出IP来 ...
- 百度识图API
http://stu.baidu.com/ http://www.360doc.com/content/14/0801/17/21412_398653199.shtml http://download ...
- Tensorflow object detection API 搭建物体识别模型(二)
二.数据准备 1)下载图片 图片来源于ImageNet中的鲤鱼分类,下载地址:https://pan.baidu.com/s/1Ry0ywIXVInGxeHi3uu608g 提取码: wib3 在桌面 ...
- Tensorflow object detection API 搭建物体识别模型(一)
一.开发环境 1)python3.5 2)tensorflow1.12.0 3)Tensorflow object detection API :https://github.com/tensorfl ...
- Tensorflow object detection API 搭建物体识别模型(四)
四.模型测试 1)下载文件 在已经阅读并且实践过前3篇文章的情况下,读者会有一些文件夹.因为每个读者的实际操作不同,则文件夹中的内容不同.为了保持本篇文章的独立性,制作了可以独立运行的文件夹目标检测. ...
- Tensorflow object detection API 搭建物体识别模型(三)
三.模型训练 1)错误一: 在桌面的目标检测文件夹中打开cmd,即在路径中输入cmd后按Enter键运行.在cmd中运行命令: python /your_path/models-master/rese ...
- 对于谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程
本教程针对Windows10实现谷歌近期公布的TensorFlow Object Detection API视频物体识别系统,其他平台也可借鉴. 本教程将网络上相关资料筛选整合(文末附上参考资料链接) ...
- 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程
视频中的物体识别 摘要 物体识别(Object Recognition)在计算机视觉领域里指的是在一张图像或一组视频序列中找到给定的物体.本文主要是利用谷歌开源TensorFlow Object De ...
随机推荐
- mysql《一》
一.启动和停止服务器 通过管理员权限打开cmd命令指示符 通过 net stop mysql(自己的服务器名字) 停止服务器 通过 net start mysql(自己的服务器名字) 启动服务器 ...
- Install Redmine Server with Bitnami Installer
Download bitnami installer: bitnami-redmine-2.4.1-1-linux-installer.run $ chmod 755 bitnami...instal ...
- STM32—ADC详解
文章目录 一.ADC简介 二.ADC功能框图讲解 1.电压输入范围 2.输入通道 3.转换顺序 4.触发源 5.转换时间 6.数据寄存器 7.中断 8.电压转换 三.初始化结构体 四.单通道电压采集 ...
- xv6学习笔记(4) : 进程调度
xv6学习笔记(4) : 进程 xv6所有程序都是单进程.单线程程序.要明白这个概念才好继续往下看 1. XV6中进程相关的数据结构 在XV6中,与进程有关的数据结构如下 // Per-process ...
- NOIP 模拟 9 数颜色
题解 一道裸的数据结构题 正解是排序 \(+\) 二分,但是这怎么能有动态开点线段树好写呢? 于是我就打了暴力,骗了五十分. 对于每种颜色,我们在下标上开一颗线段树,对于交换若颜色相同则跳过,否则直接 ...
- WPF 附件路由事件
public class Person { public static readonly RoutedEvent NameChangedEvent = EventManager.RegisterRou ...
- vs2019 快捷键汇总
https://docs.microsoft.com/zh-cn/visualstudio/ide/default-keyboard-shortcuts-for-frequently-used-com ...
- 菜鸟攻略–C语言多文件编程初探(二):使用 gcc 手动编译多文件 C 程序
step1:下载安装 Dev-C++ 已经安装了 Dev-C++ 或系统中的可以跳过这步.去官网下载 Dev-C++.我昨天下载,发现有点慢,所以我把安装文件放到百度网盘了,供大家下载,下载链接为:h ...
- 【转】分布式之redis复习精讲
转自:https://www.cnblogs.com/rjzheng/p/9096228.html 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚 ...
- linux下设备驱动的结构&编译&加载
构造和运行模块 insmod modprobe rmmod 用来装载模块到正运行的内核和移除模块的用户空间工具. #include<linux/init.h> module_init(in ...