Blogs

Android使用OpenCV实现人脸识别

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 先上效果图,GIF不好弄 在网上找了在Android平台上使用OpenCV相关的教程,很少,大部分也都主要是介绍下人脸检测,很少有讲人脸识别,还有的人连人脸检测和人脸识别的概念都没有搞清,人脸识别只是识别到有人脸,能获取到一个人脸的大概位置,有几个人脸,而人脸识别是要获取到人脸特征做对比,识别这个人脸。有好多文章都写自己在讲人脸识别,实际上他只是在做人脸检测。 OpenCV官网 官方给的Demo是在Eclipse工程下的,如果你现在已经是在Android Studio下开发,因为Eclipse工程有makefile文件,迁移到Android Studio好像还是有点麻烦,我是干脆就在Eclipse下跑的Demo。 先甩过来官方给的一些文档: OpenCV4Android SDK Android Development with OpenCV 实现方式 按照官方的文档,我们在Eclipse里导入Demo进去以后,是不能直接运行的,需要安装Manager的一个APK,然后在Demo工程里通过AIDL的方式,调用OpenCV的核心方法,不过Demo给实现的功能也只是一个人脸检测。 SDK SDK下载 下面来看一下SDK 目录: apk:Manager的apk doc:一些文档 samples:示例工程和一些编译好的apk sdk:一些库文件 当然, 如果你的C/C++足够好,你肯定可以自己编译一个库,直接导入到工程,就不用安装Manager了,可惜了我自己还不行,哈哈……无奈安装Manager把…… 如何将Demo导入到Eclipse并运行,上面官方的文档已经说的比较清楚了,至于会有什么问题就自行Google吧。 人脸检测 其实人脸检测并不是重点,Demo里已经实现了人脸检测的功能。 主要的实现方式:OpenCV有一个自己的org.opencv.android.JavaCameraView自定义控件,它循环的从摄像头抓取数据,在回调方法中,我们能获取到Mat数据,然后通过调用OpenCV的Native方法,检测当前是否有人脸,我们会获取到一个Rect数组,里面会有人脸数据,最后将人脸画在屏幕上,到此为止,Demo的人脸检测功能,就结束了。 人脸识别 人脸识别我这里用到了JavaCV 人脸识别逻辑:人脸识别的主要方式就是获取到人脸的特征值,然后将两个特征值做比对,取到一个相似度去做人脸识别,OpenCV这里的特征值,其实就是一张图片。 我们的从回调的Mat数据检测到有人脸以后,提取特征值(也就是保存人脸的一张图片到某个路径),然后比较特征值 为了提高识别的准确度,需要在检测到人脸以后,把人脸的部分截取出来,然后置灰(置灰的目的是为了方式色泽和明暗度对识别有影响)。 保存人脸特征值 /** * 特征保存 * * @param image Mat * @param rect 人脸信息 * @param fileName 文件名字 * @return 保存是否成功 */ public boolean saveImage(Mat image, Rect rect, String fileName) { try { String PATH = Environment.

继续阅读

科大讯飞离线语音合成(语记)

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 离线语音合成(语记) 讯飞的语音合成有三种方式 在线语音合成(免费) 离线使用语记语音合成(免费,需要本地装一个语记App并且下载离线资源) 使用讯飞离线语音包(付费) 这里使用语记实现离线语音合成 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9063593 说明 使用语记实现离线语音合成和在线语音合成的步骤非常相似,下载SDK的方式是一样的,一样是选择在线语音合成,只不过是使用离线引擎就可以借用语音合成语音了。 在线语音合成地址:http://blog.csdn.net/q4878802/article/details/48092495 下面说说和在线语音合成不用的地方 1. 下载并安装语记,下载离线资源 离线语音听写的文章里有介绍,地址: http://blog.csdn.net/q4878802/article/details/47834601 2. 网络权限就可以删掉了,本地合成不需要联网,但是获取网络状态的权限一定要有。 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 3. 将识别引擎改为本地引擎 // 引擎类型 本地 mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL); 4. 在Application初始化的类里把引擎模式设置的参数注释掉 // param.append(","); // param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC); SpeechConstant.MODE_MSC 参数意思是使用离线包资源,如果离线包资源找不到会走网络识别,如果设置这种模式是不会使用语记(语音+)的如果使用离线包,就需要这条参数。

继续阅读

科大讯飞离线语音合成

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 离线语音合成(离线资源包) 讯飞的语音合成有三种方式 在线语音合成(免费) 离线使用语记语音合成(免费,需要本地装一个语记App并且下载离线资源) 使用讯飞离线语音包(付费) 这里使用离线资源包实现离线语音合成,因为正式版是要付费的,所以这里使用试用的离线包(35天试用期、3个装机量)。 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9063779 开通服务,下载SDK 之前已经介绍过,地址:http://blog.csdn.net/q4878802/article/details/47762169#t8 将SDK里提供的jar包、so库、离线资源都拷贝到我们的工程(Android Studio工程) 创建的工程默认可能没有jniLibs和assets目录,我们要自己在main下创建这两个目录 初始化 在清单文件中application标签下添加name属性 android:name=".InitApplication" 初始化 package com.example.kongqw.kqwspeechcompounddemo; import android.app.Application; import android.widget.Toast; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechUtility; /** * Created by kongqw on 2015/8/29. */ public class InitApplication extends Application { @Override public void onCreate() { Toast.makeText(this, "InitApplication", Toast.LENGTH_LONG).show(); // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true" // 参数间使用“,”分隔。 // 设置你申请的应用appid StringBuffer param = new StringBuffer(); param.

继续阅读

科大讯飞语义识别

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9064463 语义测试接口 地址:http://osp.voicecloud.cn/index.php/default/quicktest/index 开通服务,下载SDK 之前已经介绍过,地址:http://blog.csdn.net/q4878802/article/details/47762169#t8 这里说一下,进入到SDK的下载界面,你发现找不到语义的服务,而在我们开通服务的时候都是默认就帮我们把语义的服务开启了,可能是因为语义是只能用网络的,没有本地的资源,所以只要选择一个在线的功能,使用的jar包应该都是一样的,为什么没有直接下载语义的SDK我也不是很清楚,但是都可以用。 说明 之前的工程都是在Eclipse下演示的,随着Android Studio的普及,我这里也开始使用Android Studio写Demo,虽然导入jar包和so库的过程可能不太一样,但是整体的流程是一样的。 将jar包和so库导入Android Studio工程 将jar包copy到libs目录下 在main目录下创建jniLibs目录,将so文件copy过来 初始化 在清单文件中application标签下添加name属性 android:name=".InitApplication" 初始化 package com.example.kongqw.kqwunderstanddemo; import android.app.Application; import android.widget.Toast; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechUtility; /** * Created by kongqw on 2015/8/29. */ public class InitApplication extends Application { @Override public void onCreate() { Toast.makeText(this, "InitApplication", Toast.LENGTH_LONG).show(); // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true" // 参数间使用“,”分隔。 // 设置你申请的应用appid StringBuffer param = new StringBuffer(); param.

继续阅读

科大讯飞在线语音合成

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9062261 下载SDK 1. 选择服务 2. 选择平台 3. 选择应用 4. 下载SDK 说明 之前的工程都是在Eclipse下演示的,随着Android Studio的普及,我这里也开始使用Android Studio写Demo,虽然细节导入jar包和so库的过程可能不太一样,但是整体的流程是一样的。 将jar包和so库导入Android Studio工程 将jar包copy到libs目录下 在main目录下创建jniLibs目录,将so文件copy过来 添加网络权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET"/> 初始化 在清单文件中application标签下添加name属性 android:name=".InitApplication" 初始化 package com.example.kongqw.kqwspeechcompounddemo; import android.app.Application; import android.widget.Toast; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechUtility; /** * Created by kongqw on 2015/8/29. */ public class InitApplication extends Application { @Override public void onCreate() { Toast.makeText(this, "InitApplication", Toast.

继续阅读

科大讯飞语音识别

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 离线语音识别(语记) 效果图 源码 下载地址:http://download.csdn.net/detail/q4878802/9032149 下载语记并安装离线资源 集成 初始化 在清单文件中application标签下添加 android:name="InitKqwSpeech" 初始化 package com.example.kqwlocalspeechdemo; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechUtility; import android.app.Application; public class InitKqwSpeech extends Application { @Override public void onCreate() { // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true" // 参数间使用“,”分隔。 // 设置你申请的应用appid StringBuffer param = new StringBuffer(); param.append("appid=55d33f09"); param.append(","); param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC); // param.append(","); // param.append(SpeechConstant.FORCE_LOGIN + "=true"); SpeechUtility.createUtility(InitKqwSpeech.this, param.toString()); super.onCreate(); } } 语音听写工具类 package com.

继续阅读

科大讯飞离线命令词+语义识别

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 离线命令词+语义识别 意思就是先走离线命令词识别,如果离线命令词识别没有识别到结果,那么就再走语义接口,如果已开通对应场景,则转为语义,如果没有开通对应场景,则将语音转为文字 效果图 说的话满足本地构建的语法—-离线命令词识别 说的话离线命令词无法识别,走语义识别并且满足语义场景—-将语音转为语义 说话既不满足离线命令词识别也不满足语义开通的场景—-将语音转为文字 程序和离线命令词识别基本一样 离线命令词识别地址:http://blog.csdn.net/q4878802/article/details/47780485 只要改一个参数,将识别引擎改为混合模式即可 mAsr.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_MIX); 因为使用的混合模式,当本地命令词没有识别到结果的时候会走在线语义(语义只有在线),所以,我们必须要先开通语义服务 程序流程 最后 如果你直接用我的Demo,我用的是测试版的离线包,只有35天的试用期,而且装机量只有3个,如果大家都用,很可能是不能正常运行的 如果是参考我的demo自己写一个,千万不要忘记替换appid和资源文件。

继续阅读

科大讯飞语音唤醒

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 语音唤醒 唤醒功能,顾名思义,通过语音,唤醒服务,做我们想做的事情。 效果图 开启应用后说讯飞语音或者讯飞语点唤醒 源码下载 地址:http://download.csdn.net/detail/q4878802/9023213 步骤 1. 创建应用,开通服务 地址:http://blog.csdn.net/q4878802/article/details/47762169 2. 下载SDK 我们要使用的是讯飞的付费功能,选择唤醒服务,点击下载以后,会提示没有购买。点击“购买服务” 点击购买一会看到付费情况,有项目需要,就必须购买,我们写Demo,讯飞给提供了体验版的SDK,和正式版的没有功能上的区别,但是只能试用35天,装机量只有3个,唤醒词不能改,只有“讯飞语音”和“讯飞语点”两个唤醒词。 3. 解压SDK assets目录下是一些图片资源文件 doc目录下是一些开发文档 libs目录下是一些jar包和so库 res目录下是语音的资源文件,非常重要 sample目录下是Demo 开发步骤 1. 添加权限 这里用到的唤醒功能不是所有的权限都用到的,具体用到了哪些权限,可以看上面的链接,用到哪写权限就加哪些权限,这个为了快速方便测试,把讯飞用到的权限都加上了。 <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 2. 初始化appid 我是将appid的初始化放在的Applicaiton下,具体可以下载源码 // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true" // 参数间使用“,”分隔。 // 设置你申请的应用appid StringBuffer param = new StringBuffer(); param.

继续阅读

科大讯飞离线命令词识别

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 示例源码 地址:http://download.csdn.net/detail/q4878802/9023825 步骤: 1. 下载SDK 前面文章有,就不在复述了。这里要选择离线命令词的服务以后,重新加载,因为需要下载离线命令词识别的资源文件 地址:http://blog.csdn.net/q4878802/article/details/47762169 2. 集成方法 前面文章有,就不在复述了。 地址:http://blog.csdn.net/q4878802/article/details/47778629 3. 正题,开始集成 1. 添加权限 这里用到的唤醒功能不是所有的权限都用到的,具体用到了哪些权限,可以看上面的链接,用到哪写权限就加哪些权限,这个为了快速方便测试,把讯飞用到的权限都加上了。 <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 2. 初始化appid 我是将appid的初始化放在的Applicaiton下,具体可以下载源码 // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true" // 参数间使用“,”分隔。 // 设置你申请的应用appid StringBuffer param = new StringBuffer(); param.

继续阅读

layout: w title: Android服务 date: 2016-04-15 18:51:03 categories: tags: [服务,Android] 转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 服务 Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。 服务基本上分为两种形式: 启动 当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。例如,它可能通过网络下载或上传文件。 操作完成后,服务会自行停止运行。 绑定 > 当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。 虽然本文档是分开概括讨论这两种服务,但是您的服务可以同时以这两种方式运行,也就是说,它既可以是启动服务(以无限期运行),也允许绑定。问题只是在于您是否实现了一组回调方法:onStartCommand()(允许组件启动服务)和 onBind()(允许绑定服务)。 无论应用是处于启动状态还是绑定状态,抑或处于启动并且绑定状态,任何应用组件均可像使用活动那样通过调用 Intent 来使用服务(即使此服务来自另一应用)。 不过,您可以通过清单文件将服务声明为私有服务,并阻止其他应用访问。 使用清单文件声明服务部分将对此做更详尽的阐述。 注意: 服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。 这意味着,如果服务将执行任何 CPU 密集型工作或阻止性操作(例如 MP3 播放或联网),则应在服务内创建新线程来完成这项工作。通过使用单独的线程,可以降低发生“应用无响应”(ANR) 错误的风险,而应用的主线程仍可继续专注于运行用户与 Activity 之间的交互。 基础知识 要创建服务,您必须创建 Service 的子类(或使用它的一个现有子类)。在实现中,您需要重写一些回调方法,以处理服务生命周期的某些关键方面并提供一种机制将组件绑定到服务(如适用)。 应重写的最重要的回调方法包括:

继续阅读