使用 OpenCV 进行 Android 开发

本文详细介绍了如何在Android项目中使用OpenCV库,包括设置环境、添加依赖、HelloOpenCV示例、MavenCentral集成以及集成相机视图的步骤。
摘要由CSDN通过智能技术生成

本教程旨在帮助您在 Android 项目中使用 OpenCV 库。

本指南已在 Ubuntu 上进行了检查,但不包含与平台相关的部分,因此应与 Android Studio 和 OpenCV4Android SDK 支持的任何操作系统兼容。

本教程假定您已安装并配置了以下内容:

如果您需要上述任何方面的帮助,请参阅我们的 Android 开发简介指南。

如果您在彻底执行这些步骤后遇到任何错误,请随时通过 OpenCV 论坛与我们联系。我们将尽最大努力为您提供帮助。

使用 SDK 的 Hello OpenCV 示例

在本节中,我们将创建一个简单的应用程序,它只执行 OpenCV 加载。在下一节中,我们将扩展它以支持相机。

除了此说明之外,您还可以使用一些视频指南,例如这个

  1. 打开 Android Studio,然后选择 Empty Views Activity (空视图活动) 创建空项目

  2. 设置项目:

    • 选择 Java 语言
    • 选择 Groovy DSL 构建配置语言
    • 选择版本号不低于 OpenCV 4 Android 构建期间使用的版本号的 Minumum SDK
      • 如果你不知道,你可以在文件中找到它OpenCV-android-sdk/sdk/build.gradleandroid -> defaultConfig -> minSdkVersion

    setup_project.png

  3. 单击“文件”->“新建”-“>导入模块...”,然后选择“OpenCV SDK 路径”

    sdk_path.png

  4. 将模块名称设置为并按OpenCVFinish

    module_name.png

  5. OpenCV 还提供体验式 Kotlin 支持。请将 Android Kotlin 插件添加到文件中:MyApplication/OpenCV/build.gradle
    插件 {
    ID:'org.jetbrains.kotlin.android',版本:'1.7.10',#version 可能因您的设置而异
    }
    喜欢这个:

    gradle_ocv_fix.png

    如果不这样做,可能会出现错误:
    任务失败,出现异常。
    -----------
    *哪里:
    构建文件“/home/alexander/AndroidStudioProjects/MyApplication/opencv/build.gradle”行:4
    * 出了什么问题:
    评估项目“:opencv”时出现问题。
    找不到 ID 为“kotlin-android”的>插件。
    修复程序是在这里找到的
  6. OpenCV 项目使用功能。请在文件中启用它以阻止:buildConfigMyApplication/OpenCV/build.gradleandroid
    buildFeatures{
    buildConfig 为 true
    }
    喜欢这个:

    module_gradle_fix.png

    如果不这样做,可能会出现错误:
    JavaCameraView.java:15:错误:找不到符号导入 org.opencv.BuildConfig;^ symbol: class BuildConfig location: package org.opencv
    修复程序是在这里这里找到的
  7. 将模块添加到项目中:

    • 单击“文件”->“项目结构...”->依赖关系 ->所有模块 -> +(“添加依赖项”按钮) -> 模块依赖项

    add_module_1.png

    • 选择app

    add_module_2.png

    • 选择OpenCV

    add_module_3.png

  8. 在使用任何 OpenCV 函数之前,您必须先加载库。如果您的应用程序包含其他依赖于 OpenCV 的本机库,则应在 OpenCV 初始化加载它们。添加以下代码以在应用启动时加载库:
    如果 (OpenCVLoader.initLocal()) {
    Log.i(TAG, “OpenCV 加载成功”);
    } {
    Log.e(TAG, “OpenCV 初始化失败!”);
    (Toast.makeText(this“OpenCV 初始化失败!”, Toast.LENGTH_LONG)).show();
    返回;
    }
    喜欢这个:

    sample_code.png

  9. 选择要检查示例的设备,然后按按钮运行代码run

    run_app.png

使用 Maven Central 的 Hello OpenCV 示例

从 OpenCV 4.9.0 开始,OpenCV for Android 包随 Maven Central 一起提供,并且可以作为 Gradle 依赖项自动安装。在本节中,我们将创建一个简单的应用程序,它只使用 Maven Central 加载 OpenCV。

  1. 打开 Android Studio,然后选择 Empty Views Activity (空视图活动) 创建空项目

    create_empty_project.png

  2. 设置项目:

    • 选择 Java 语言
    • 选择 Groovy DSL 构建配置语言
    • 选择版本号不小于 OpenCV 支持的 Minumum SDK。对于 4.9.0,最低 SDK 版本为 21。

    setup_project.png

  3. 编辑 OpenCV 库并将其添加到依赖项列表,如下所示:build.gradle
    依赖项 {
    实现“org.opencv:opencv:4.9.0”
    }
    4.9.0可以被官方发布的任何版本所取代。
  4. 在使用任何 OpenCV 函数之前,您必须先加载库。如果您的应用程序包含其他依赖于 OpenCV 的本机库,则应在 OpenCV 初始化加载它们。添加以下代码以在应用启动时加载库:
    如果 (OpenCVLoader.initLocal()) {
    Log.i(TAG, “OpenCV 加载成功”);
    } {
    Log.e(TAG, “OpenCV 初始化失败!”);
    (Toast.makeText(this“OpenCV 初始化失败!”, Toast.LENGTH_LONG)).show();
    返回;
    }
    喜欢这个:

    sample_code.png

  5. 选择要检查示例的设备,然后按按钮运行代码run

    run_app.png

相机视图示例

在本节中,我们将扩展在上一节中创建的空 OpenCV 应用程序以支持相机。我们将拍摄相机帧并将它们显示在屏幕上。

  1. 告诉系统我们需要相机权限。将以下代码添加到该文件中:MyApplication/app/src/main/AndroidManifest.xml
    <使用权限 android:name=“android.permission.CAMERA”/>
    <使用功能 android:name=“android.hardware.cameraandroid:required=“false”/>
    <使用功能 android:name=“android.hardware.camera.autofocusandroid:required=“false”/>
    <使用功能 android:name=“android.hardware.camera.frontandroid:required=“false”/>
    <使用功能 android:name=“android.hardware.camera.front.autofocusandroid:required=“false”/>
    喜欢这个:

    camera_permissions.png

  2. 转到布局并删除带有文本“Hello World!”activity_main.xml

    delete_text.png

    这也可以通过从 XML 文件中删除块在代码或拆分模式下完成。TextView

  3. 将相机视图添加到布局中:

    1. 在布局描述中添加方案:
      xmlns:opencv=“http://schemas.android.com/apk/res-auto”
    2. 替换为小部件:TextVieworg.opencv.android.JavaCameraView
      <org.opencv.android.JavaCameraView
      安卓:layout_width=“fill_parent”
      安卓:layout_height=“fill_parent”
      android:visibility=“消失了”
      android:id=“@+id/tutorial1_activity_java_surface_view”
      opencv:show_fps=“真”
      opencv:camera_id=“任何” />
    3. 如果收到布局警告,请将值替换为 for 和 propertiesfill_parentmatch_parentandroid:layout_widthandroid:layout_height

    你会得到这样的代码:

    <FrameLayout xmlns:android=“http://schemas.android.com/apk/res/android”
    xmlns:tools=“http://schemas.android.com/tools”
    xmlns:opencv=“http://schemas.android.com/apk/res-auto”
    安卓:layout_width=“match_parent”
    安卓:layout_height=“match_parent” >
    <!-- [camera_view] -->
    <org.opencv.android.JavaCameraView
    安卓:layout_width=“fill_parent”
    安卓:layout_height=“fill_parent”
    android:visibility=“消失了”
    android:id=“@+id/tutorial1_activity_java_surface_view”
    opencv:show_fps=“真”
    opencv:camera_id=“任何” />
    <!-- [camera_view] -->
    </FrameLayout(框架布局)>
  4. 从 继承主类。CameraActivity 实现了 CV 应用程序所需的相机周边要求和其他一些实用程序。我们感兴趣的重写方法是 、 、 和org.opencv.android.CameraActivityonCreateonDestroyonPauseonResumegetCameraViewList
  5. 实现接口方法应返回包含渲染内容的对象。此示例仅返回用于预览的相机帧:org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2onCameraFrameMatreturn inputFrame.rgba();
  6. 分配对象:org.opencv.android.CameraBridgeViewBase
    • 它应该在应用程序启动(方法)时创建,并且此类应设置为侦听器onCreate
    • 在暂停/恢复 (, 方法) 时,它应该被禁用/启用onPauseonResume
    • 应在应用完成时禁用(方法)onDestroy
    • 应该在getCameraViewList
  7. 或者,您可以禁止手机调暗屏幕或锁定:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    最后,你将获得类似于以下内容的源代码:

软件包 org.opencv.samples.tutorial1;
导入 org.opencv.android.CameraActivity;
导入 org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
导入 org.opencv.android.OpenCVLoader;
导入 org.opencv.core.Mat;
导入 org.opencv.android.CameraBridgeViewBase;
导入 org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
导入 android.os.Bundle;
导入 android.util.Log;
导入android.view.SurfaceView;
导入 android.view.WindowManager;
导入 android.widget.Toast;
导入 java.util.Collections;
导入 java.util.List;
公共Tutorial1Activity 扩展了 CameraActivity 实现 CvCameraViewListener2 {
private static final String TAG = “OCVSample::Activity”;
私人CameraBridgeViewBase mOpenCvCameraView;
公共教程1活动() {
Log.i(TAG, “实例化的新” + this.getClass());
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, “调用 onCreate”);
super.onCreate(savedInstanceState);
如果 (OpenCVLoader.initLocal()) {
Log.i(TAG, “OpenCV 加载成功”);
} {
Log.e(TAG, “OpenCV 初始化失败!”);
(Toast.makeText(this“OpenCV 初始化失败!”, Toast.LENGTH_LONG)).show();
返回;
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.tutorial1_surface_view);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(这个);
}
@Override
public void onPause()
{
super.onPause();
if (mOpenCvCameraView != 空)
mOpenCvCameraView.disableView();
}
@Override
public void onResume()
{
super.onResume();
if (mOpenCvCameraView != 空)
mOpenCvCameraView.enableView();
}
@Override
保护列表<?扩展 CameraBridgeViewBase> getCameraViewList() {
返回集合.singletonList(mOpenCvCameraView);
}
@Override
公共无效 onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != 空)
mOpenCvCameraView.disableView();
}
@Override
public void onCameraViewStarted(int width, int height) {
}
@Override
公共无效 onCameraViewStopped() {
}
@Override
公共垫 onCameraFrame(CvCameraViewFrame inputFrame) {
返回 inputFrame.rgba();
}
}

就是这样!现在,您可以在设备上运行代码进行检查。

   在线教程

有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

请添加图片描述

人工智能书籍

第一阶段:零基础入门(3-6个月)

新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。

第二阶段:基础进阶(3-6个月)

熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。

第三阶段:工作应用

这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。

 有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值