Blogs

2OpenCV中值模糊方法

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 源码 KqwOpenCVBlurDemo 步骤 将获取到的Bitmap图片转成Mat对象 // Bitmap转为Mat Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4); Utils.bitmapToMat(bitmap, src); 调用OpenCV的中值模糊方法 // 中值模糊方法 Imgproc.medianBlur(src, src, 33); 将处理完的Mat数据转成Bitmap对象 // Mat转Bitmap Bitmap processedImage = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(src, processedImage); 封装 这里我用到了RxJava。主要是因为图片处理是耗时操作,会阻塞线程,为了防止界面卡顿,这里使用RxJava进行了线程切换。 package kong.qingwei.kqwopencvblurdemo; import android.graphics.Bitmap; import org.opencv.android.Utils; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; import rx.Observable; import rx.Subscriber; import rx.

继续阅读

OpenCV高斯模糊方法

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 源码 KqwOpenCVBlurDemo 步骤 将获取到的Bitmap图片转成Mat对象 // Bitmap转为Mat Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4); Utils.bitmapToMat(bitmap, src); 调用OpenCV的高斯模糊方法 // 高斯模糊方法 Imgproc.GaussianBlur(src, src, new Size(91, 91), 0); 将处理完的Mat数据转成Bitmap对象 // Mat转Bitmap Bitmap processedImage = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(src, processedImage); 封装 这里我用到了RxJava。主要是因为图片处理是耗时操作,会阻塞线程,为了防止界面卡顿,这里使用RxJava进行了线程切换。 package kong.qingwei.kqwopencvblurdemo; import android.graphics.Bitmap; import org.opencv.android.Utils; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; import rx.Observable; import rx.

继续阅读

OpenCV均值模糊方法

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 源码 KqwOpenCVBlurDemo 步骤 将获取到的Bitmap图片转成Mat对象 // Bitmap转为Mat Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4); Utils.bitmapToMat(bitmap, src); 调用OpenCV的均值模糊方法 // 均值模糊方法 Imgproc.blur(src, src, new Size(100, 100)); 将处理完的Mat数据转成Bitmap对象 // Mat转Bitmap Bitmap processedImage = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(src, processedImage); 封装 这里我用到了RxJava。主要是因为图片处理是耗时操作,会阻塞线程,为了防止界面卡顿,这里使用RxJava进行了线程切换。 package kong.qingwei.kqwopencvblurdemo; import android.graphics.Bitmap; import org.opencv.android.Utils; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; import rx.Observable; import rx.

继续阅读

OpenCV的部署

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 官网 官网 之前时间比较紧张,在网上找了很多文章,写了一个人脸识别的程序,也是模棱两可,今天开始抽时间系统学习一下OpenCV在Android上的使用。 OpenCV版本 后面用到的是OpenCV的2.4.11版本,据说新的3.x的版本和2.x的版本改动较大,2.x的版本学习完可以再看看与3.x版本的区别。毕竟老版本的学习资源更多一些。 SDK 我们下载完SDK以后,里面会有一个Library的库供我们使用,但是核心的功能不在这里面,它只是一个调用的工具,我们还需要安装OpenCV Manager,在下载的SDK里有一个apk的文件夹,里面是对应各个cup架构的Manager,选择对应的Manager安装就可以了。 除了安装OpenCV Manager,也可以直接在工程里添加so,但是这会使我们的APK体积大大增加,不过这不是我们要关心的,我们主要学习怎么使用OpenCV。 OpenCV的图像存储 OpenCV使用Mat对象存储图像,该对象保存了图像的行数、列数、数据等能唯一标识该图像的信息,并且可以利用该数据还原图像,不同的图像所包含的信息量也不同,例如彩色图像所包含的信息量就要比灰色图像多得多。因为灰色图是单通道的,彩色图是三通道的。 灰色图 数字代表指定颜色的亮度 以整数表示时,取值范围是0~255,0表示纯黑色,255表示纯白色。 以浮点数表示时,取值范围是0~1,0表示纯黑色,1表示纯白色。 彩色图 第一通道表示蓝色,第二通道表示绿色,第三通道表示红色。 OpenCV的线性滤波器 有的时候,图像信息量太大,处理的时间就会比较长(有的时候可能不需要这么信息就可以解析出来我们想要的结果了),为了解决这个问题,OpenCV提供了一个线性滤波器,可以对图片进行模糊处理。 很多线性滤波器都利用了称为核的数字向量,核可以看作是沿着像素滑动的窗口,并把计算结果输出给核像素。 下面的图中,是一个3 * 3的核作用在了一副10 * 10的图像上。 创建OpenCV工程 Android Studio版本:2.1 创建Android Studio工程,命名为FirstOpenCVDemo 导入OpenCV Library File -> New -> Import Module 引用OpenCV Library 安装OpenCV Manager 加载OpenCV Manager,如果诶呦安装会有提示 private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.

继续阅读

科大讯飞与灵云语音对比

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 对比 科大讯飞 灵云语音 语音能力 语音合成、语音识别、语义、命令词、唤醒 没有独立的唤醒功能,需要使用命令词实现唤醒。 初始化 我们购买完离线资源包以后,集成到工程里,就可以保持在离线环境下使用 即使使用离线语音能力,第一次使用的时候,也必须要联网,激活离线语音能力以后,才可以使用 网络请求 各种请求均异步操作,不会阻塞线程。 在线文字语义识别,是同步操作,其它是异步操作过程。(同步操作时间超过5秒会导致Android终端抛出NAR异常导致崩溃) 语义 场景定义灵活,开发者可在后台自定义,通过申请的方式,可以开通自定义场景,目前免费开放。语义解析失败,可以将语音转文字。 场景的定义需要联系客服人员开通,自定义场景需要付费(说是一般一个场景2万元)。语义解析失败不能转成文字 语音唤醒 支持(官方自称低功耗) 实际没有唤醒功能,是使用离线命令词的方式模拟出了唤醒,效果不理想。尚未发现可以发现可以设置门限值等常用参数的API。 命令词识别 离线使用BNF语法,在线使用ABNF语法,语法可以使用占位符等等的操作符 离线和在线都使用JSGF语法。 灵云唤醒机制 用命令词的方式实现唤醒,用唤醒词做命令词,做好标识,然后循环开启命令词识别,当识别到唤醒的命令词的时候,视为被唤醒了。 个人认为这种方式实现唤醒效果不好,原因如下: 录音都有前端点超时时间和后端点超时时间,这样一来,即使我们准确的说出唤醒词,也要在说完唤醒词以后,保证在后端点时间内不再有声音录入,才能提高被唤醒的几率。 唤醒不是即时的,即使我们准确的说出唤醒词,并保持不再有声音录入,也要至少等待后端点时间过去,录音结束以后,才会识别(被唤醒)。 这种方式的唤醒其实就是在进行语音识别,如果一直开启唤醒,消耗性能,耗电。 前端点超时时间: 在前置端点时间内没有有效的声音录入,表示此次录音无效,结束录音. 后端点超时时间: 录音结束以后,在后置端点时间内没有再录入有效声音,表示录音完成,结束录音。 总结 科大讯飞语音方面更灵活,更好用。 灵云语音,在人工智能方面提供的技术更全面(还包括图像识别,手写识别,人脸识别,指纹识别、机器翻译等),偏定制(智能家居、车载系统、机器人等智能设备的定制)。 单从语音能力角度来比较,讯飞更好。

继续阅读

灵云语音唤醒

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 严格来讲,灵云没有语音唤醒功能,但是通过命令词的方式可以实现 实现方式 用命令词的方式实现唤醒,用唤醒词做命令词,做好标识,然后循环开启命令词识别,当识别到唤醒的命令词的时候,视为被唤醒了。 我个人认为这种方式实现唤醒意义不大,所以没有做demo,原因如下: 录音都有前端点超时时间和后端点超时时间,这样一来,即使我们准确的说出唤醒词,也要在说完唤醒词以后,保证在后端点时间内不再有声音录入,才能提高被唤醒的几率。 唤醒不是即时的,即使我们准确的说出唤醒词,并保持不再有声音录入,也要至少等待后端点时间过去,录音结束以后,才会识别(被唤醒)。 这种方式的唤醒其实就是在进行语音识别,如果一直开启唤醒,消耗性能,耗电。 前端点超时时间: 在前置端点时间内没有有效的声音录入,表示此次录音无效,结束录音. 后端点超时时间: 录音结束以后,在后置端点时间内没有再录入有效声音,表示录音完成,结束录音。

继续阅读

灵云语音识别

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 源码 GitHub 在线语音识别 SDK下载 灵云SDK下载 SDK集成 下载SDK以后,将jar和so导入工程 权限 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> 封装 灵云配置类 package kong.qingwei.kqwhcidemo; /** * Created by kqw on 2016/8/12. * 灵云配置信息 */ public final class ConfigUtil { /** * 灵云APP_KEY */ public static final String APP_KEY = "3d5d5466"; /** * 开发者密钥 */ public static final String DEVELOPER_KEY = "eca643ff7b3c758745d7cf516e808d34"; /** * 灵云云服务的接口地址 */ public static final String CLOUD_URL = "test.

继续阅读

灵云语义理解

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 源码 GitHub SDK下载 灵云SDK下载 SDK集成 下载SDK以后,将jar和so导入工程 权限 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 封装 灵云配置类 package kong.qingwei.kqwhcidemo; /** * Created by kqw on 2016/8/12. * 灵云配置信息 */ public final class ConfigUtil { /** * 灵云APP_KEY */ public static final String APP_KEY = "3d5d5466"; /** * 开发者密钥 */ public static final String DEVELOPER_KEY = "eca643ff7b3c758745d7cf516e808d34"; /** * 灵云云服务的接口地址 */ public static final String CLOUD_URL = "test.

继续阅读

灵云语音合成

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 注册 官网 注册比较简单,就不做过多介绍了,注册万应用以后,在后台创建自己的应用,创建完应用以后需要给应用开通对应的语音能力。 集成 下载灵云SDK 如果使用在线功能,下载对应的SDK,里面有jar包和so,就可以满足需求了。如果要使用离线的语音功能,还需要下载灵云资源文件 源码 GitHub 灵云在线语音合成 权限 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 配置类 package kong.qingwei.kqwhcittsdemo; /** * Created by kqw on 2016/8/12. * 灵云配置信息 */ public final class ConfigUtil { /** * 灵云APP_KEY */ public static final String APP_KEY = "填入自己的APP KEY"; /** * 开发者密钥 */ public static final String DEVELOPER_KEY = "填入自己的DEVELOPER KEY"; /** * 灵云云服务的接口地址 */ public static final String CLOUD_URL = "test.

继续阅读

Android蓝牙通信

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN Android蓝牙通信 效果图 两台真机设备 源码 GitHub 关于蓝牙的开关控制,设置设备可见、搜索附近的蓝牙设备,已经封装到了 BluetoothManager 类 关于设备的连接、通信。已经封装到了 BluetoothService 类 注:下面的全部内容,主要是思路,具体的可以参考上面的源码,如果对你有帮助记得给个赞哦。 权限 <!-- 蓝牙的权限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 蓝牙的打开与关闭 开启蓝牙 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); /** * 开启蓝牙 */ public void openBluetooth() { try { mBluetoothAdapter.enable(); } catch (Exception e) { e.printStackTrace(); } } 关闭蓝牙 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); /** * 关闭蓝牙 */ public void closeBluetooth() { try { mBluetoothAdapter.

继续阅读