Opencv

OpenCV实现图片锐化

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 源码 KqwOpenCVBlurDemo 锐化也可以看作是一种线性滤波操作,并且锚点像素有较高的权重,而周围的像素权重较低。 因此,我们可以自定义一个这样的核。 /* 自定义核 0 -1 0 -1 5 -1 0 -1 0 */ Mat kernel = new Mat(3, 3, CvType.CV_16SC1); kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0); 这里我们将图像的深度设为16SC1,表示包含一个通道(C1),图像中的每个像素包含一个16比特有符号整型数(16S)。 定义完核以后,我们对图像和核做卷积操作 // 对图像和自定义核做卷积 Imgproc.filter2D(src, src, src.depth(), kernel); 第一个参数表示输入的图像 第二个参数表示输出的图像 第三个参数表示图像的深度 第四个参数是我们自定义的核 封装 这里我用到了RxJava。主要是因为图片处理是耗时操作,会阻塞线程,为了防止界面卡顿,这里使用RxJava进行了线程切换。 /** * 锐化图片 * * @param bitmap 要处理的图片 */ public void filter2D(Bitmap bitmap) { // 使用RxJava处理图片 if (null !

继续阅读

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.

继续阅读

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.

继续阅读