Android Studio使用OpenCV进行图像基本处理

2023-05-16

Android Studio使用OpenCV进行图像基本处理

1.环境配置

①进入OpenCV官网下载SDK包

进入官网(https://opencv.org/releases/)选择"Android"版本下载,我下载了3.4.16版本

在这里插入图片描述

解压后的文件目录:

在这里插入图片描述

  • sdk 目录提供了Android的API与Java 库

  • sdk/java 目录包含了一个 Eclipse 项目,该项目提供 OpenCV 的Java API,且可以导入到开发环境里。

  • sdk/native 目录包含了OpenCV C++ 头文件(用于JNI),与Android的 .so动态库 .a静态库。

  • sdk/etc 目录包含了Haar 与 LBP cascades 级联。

  • apk 目录包含了用户安装在指定的Android设备的安装文件,该文件使opencv 库可以管理opencv API(对应于各内核版本的OpenCV应用安装包)

  • samples :目录中存放着若干opencv应用例子,可为我们进行android下的opencv开发提供参考

②导入模块到项目中

1.Android Studio 下载cmake和ndk

在这里插入图片描述

2.选择 File -> New ->Import Module

在这里插入图片描述

3.选择下载的SDK包中的sdk/java

在这里插入图片描述

4.点击Finish

在这里插入图片描述

5.修改导入OpenCV的build.gradle的对应的compileSdkVersion等信息

在这里插入图片描述

6.修改build.gradle将module改为以library形式存在

  • apply plugin: 'com.android.library’一定要改成library

  • 去掉applicationld “com.xx.xx”

7.加入依赖:设置module 的依赖 OpenCV lib

在这里插入图片描述
在这里插入图片描述
点击Apply

8.导入so库

在 app/src/main 目录下 创建一个jniLibs 目录,然后把sdk/native/libs 下所有文件 拷贝到jniLibs下

在这里插入图片描述

至此Android Studio下OpenCV环境配置完成


2.图像基本处理

1.灰度处理

将彩色图像转化为灰度图像

调用cvtColor方法,参数选择cv2.COLOR_BGR2GRAY

private void Togray(){
    //灰度处理
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);

    Mat src = new Mat();
    Mat dst = new Mat();

    Utils.bitmapToMat(bitmap,src);
    Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGR2GRAY);
    Utils.matToBitmap(dst,bitmap);

    iv.setImageBitmap(bitmap);
    src.release();
    dst.release();
}

效果展示:

在这里插入图片描述

2.腐蚀和膨胀

①腐蚀操作

腐蚀操作会去除图像中,多余的白色噪点,增强黑色的部分(增强识别)

OpenCV中提供给了erode()函数来完成腐蚀操作

private void Tocorrosion(){
    //腐蚀
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
        Mat src = new Mat();
    Mat dst = new Mat();
    Mat element = Imgproc.getStructuringElement(MORPH_RECT, new Size(10,10));;

    Utils.bitmapToMat(bitmap,src);
    //    src:源图像
    //    dst:输出图像
    //    element:这是我们将用来执行操作的内核。如果我们不指定,默认是一个简单的3x3矩阵。否则,我们可以指定它的形状。为此,我们需要使用函数cv :: getStructuringElement:

    Imgproc.erode(src, dst, element);
    Utils.matToBitmap(dst,bitmap);

    iv.setImageBitmap(bitmap);
    src.release();
    dst.release();
}

效果展示:

在这里插入图片描述

②膨胀操作

膨胀操作会把白色线条加粗,白色的线条勾勒的物体会变成白色一块区域(增强识别)

OpenCV中提供给了dilate()函数来完成膨胀操作

private void Todilate(){
    //膨胀
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
    //    src:源图像
    //    dst:输出图像
    //    element:这是我们将用来执行操作的内核。如果我们不指定,默认是一个简单的3x3矩阵。否则,我们可以指定它的形状。为此,我们需要使用函数cv :: getStructuringElement:
    Mat src = new Mat();
    Mat dst = new Mat();
    Mat element = Imgproc.getStructuringElement(MORPH_RECT, new Size(10,10));;

    Utils.bitmapToMat(bitmap,src);
    Imgproc.dilate(src, dst, element);
    Utils.matToBitmap(dst,bitmap);

    iv.setImageBitmap(bitmap);
    src.release();
    dst.release();
}

效果展示:

在这里插入图片描述

3.中值滤波

OpenCV中提供给了medianBlur()函数来完成中值滤波操作

private void TomedianBlur(){
    //中值滤波
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
    Mat src = new Mat();
    Mat ret = new Mat();

    Utils.bitmapToMat(bitmap, src);
    // InputArray src: 输入图像,图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U。
	// OutputArray dst: 输出图像,尺寸和类型与输入图像一致,可以使用Mat::Clone以原图像为模板来初始化输出图像dst
	// int ksize: 滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7……
    Imgproc.medianBlur(src, ret, 77);
    Utils.matToBitmap(ret, bitmap);

    iv.setImageBitmap(bitmap);
    src.release();
    ret.release();
}

效果展示:

在这里插入图片描述

4.高斯模糊

OpenCV中提供给了GaussianBlur()函数来完成高斯模糊操作

private void ToGaussian(){
    //高斯模糊
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
    Mat src = new Mat();
    Mat ret = new Mat();

    Utils.bitmapToMat(bitmap, src);
    // src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
    // dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
    // ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。
    // sigmaX,表示高斯核函数在X方向的的标准偏差。
    // sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
    Imgproc.GaussianBlur(src,ret,new Size(77,77),5, 5);
    Utils.matToBitmap(ret, bitmap);

    iv.setImageBitmap(bitmap);
    src.release();
    ret.release();
}

效果展示:

在这里插入图片描述

5.Canny边缘检测

OpenCV中提供给了Canny()函数来完成图像边缘检测操作

private void CannyScan(){
    //边缘检测
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
    Mat src = new Mat();
    Utils.bitmapToMat(bitmap, src);

    Mat gray = new Mat();
    Imgproc.cvtColor(src,gray,Imgproc.COLOR_BGR2GRAY);//灰度处理
    Mat ret = src.clone();
    // image  输入图像,必须是CV_8U的单通道或者三通道图像。
    // edges  输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV_8U。
    // threshold1  第一个滞后阈值。
    // threshold2  第二个滞后阈值。
    Imgproc.Canny(src, ret, 75, 200);
    Utils.matToBitmap(ret, bitmap);

    iv.setImageBitmap(bitmap);
    src.release();
    gray.release();
    ret.release();
}

效果展示:

在这里插入图片描述

参考文档:

https://blog.csdn.net/weixin_43815930/article/details/90516455

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Studio使用OpenCV进行图像基本处理 的相关文章

  • 从 Throwable 获取错误代码 - Android

    我怎样才能从错误代码可投掷 https developer android com reference java lang Throwable html public void onFailure Throwable exception 我
  • 如何将安卓手机从睡眠状态唤醒?

    如何以编程方式将 Android 手机从睡眠状态唤醒 挂起至内存 我不想获取任何唤醒锁 这意味着手机在禁用 CPU 的情况下进入 真正的 睡眠状态 我想我可以使用某种RTC 实时时钟 机制 有人有例子吗 Thanks 为了让Activity
  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • Android:“dp”到“px”转换?

    我正在读这篇文章 http developer android com guide practices screens support html http developer android com guide practices scre
  • RxJava、Proguard 和 sun.misc.Unsafe

    我有以下问题RxJava 1 1 0 使用时Proguard 我没有更改 RxJava 版本或其 pro文件 但更新后OkHttp我无法编译使用Proguard因为我有关于sun misc Unsafe不在场 rxJava pro keep
  • 在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符 (ë ä ï)

    我目前正在开发一个具有大量服务器端通信的 Android 应用程序 昨天 我收到一份错误报告 称用户无法发送 简单 特殊字符 例如 我搜索过但没有找到任何有用的东西 可能重复 没有答案 https stackoverflow com que
  • 获取 AlarmManager 中活动的 PendingIntents 列表

    我有办法获取活动列表PendingIntent在设备中 我开始工作AlarmManager我想看看我的PendingIntents 已正确创建和删除 也很高兴看到其他什么PendingIntent在那里 只是为了看看某些应用程序是否正在做一
  • 在 Visual Studio C++ 2008 中包含 dll

    有没有办法将 dll 包含在项目中 这样我就不必在编译后将这些 dll 与可执行文件放在同一文件夹中 这样我就可以用它们编译我的项目 这是否有可能 如果是 有人可以指导我 我的项目是一个 opencv 项目 有很多 dll 我必须包含在文件
  • 应用程序未安装在 Android 模拟器上

    我正在 android Geocoder 中开发一个应用程序 当我运行该应用程序时 它会显示 2011 01 11 11 08 13 GeoTourProject 自动目标模式 使用现有模拟器 emulator 5554 运行兼容的 AVD
  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo
  • ROOM迁移过程中如何处理索引信息

    CODE Entity tableName UserRepo indices Index value id unique true public class GitHubRepo PrimaryKey autoGenerate true p
  • Android相机意图:如何获取全尺寸照片?

    我正在使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 如何删除因 Google Fitness API 7.5.0 添加的权限

    将我的 play services fitness api 从 7 0 0 更新到 7 5 0 后 我注意到当我将新版本上传到 PlayStore 时 它 告诉我正在添加一个新权限和 2 个新功能 我没有这样做 有没有搞错 在做了一些研究来
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少

随机推荐