本教程旨在帮助您在 Android 项目中使用 OpenCV 库。
本指南已在 Ubuntu 上进行了检查,但不包含与平台相关的部分,因此应与 Android Studio 和 OpenCV4Android SDK 支持的任何操作系统兼容。
本教程假定您已安装并配置了以下内容:
如果您需要上述任何方面的帮助,请参阅我们的?Android 开发简介指南。
如果您在彻底执行这些步骤后遇到任何错误,请随时通过 OpenCV?论坛与我们联系。我们将尽最大努力为您提供帮助。
在本节中,我们将创建一个简单的应用程序,它只执行 OpenCV 加载。在下一节中,我们将扩展它以支持相机。
除了此说明之外,您还可以使用一些视频指南,例如这个
打开 Android Studio,然后选择?Empty Views Activity (空视图活动) 创建空项目
设置项目:
OpenCV-android-sdk/sdk/build.gradle
android -> defaultConfig -> minSdkVersion
单击“文件”->“新建”-“>导入模块...”,然后选择“OpenCV SDK 路径”
将模块名称设置为并按OpenCV
Finish
MyApplication/OpenCV/build.gradle
buildConfig
MyApplication/OpenCV/build.gradle
android
将模块添加到项目中:
app
OpenCV
选择要检查示例的设备,然后按按钮运行代码run
从 OpenCV 4.9.0 开始,OpenCV for Android 包随 Maven Central 一起提供,并且可以作为 Gradle 依赖项自动安装。在本节中,我们将创建一个简单的应用程序,它只使用 Maven Central 加载 OpenCV。
打开 Android Studio,然后选择?Empty Views Activity (空视图活动) 创建空项目
设置项目:
build.gradle
4.9.0
可以被官方发布的任何版本所取代。选择要检查示例的设备,然后按按钮运行代码run
在本节中,我们将扩展在上一节中创建的空 OpenCV 应用程序以支持相机。我们将拍摄相机帧并将它们显示在屏幕上。
MyApplication/app/src/main/AndroidManifest.xml
转到布局并删除带有文本“Hello World!”activity_main.xml
这也可以通过从 XML 文件中删除块在代码或拆分模式下完成。TextView
将相机视图添加到布局中:
- 在布局描述中添加方案:
xmlns:opencv=“http://schemas.android.com/apk/res-auto”- 替换为小部件:
TextView
org.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=“任何” />- 如果收到布局警告,请将值替换为 for 和 properties
fill_parent
match_parent
android:layout_width
android: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] -->
org.opencv.android.CameraActivity
onCreate
onDestroy
onPause
onResume
getCameraViewList
org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2
onCameraFrame
Mat
return inputFrame.rgba();
org.opencv.android.CameraBridgeViewBase
onCreate
onPause
onResume
onDestroy
getCameraViewList
或者,您可以禁止手机调暗屏幕或锁定:
最后,你将获得类似于以下内容的源代码:
软件包 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());}@Overridepublic 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(这个);}@Overridepublic void onPause(){super.onPause();if (mOpenCvCameraView != 空)mOpenCvCameraView.disableView();}@Overridepublic void onResume(){super.onResume();if (mOpenCvCameraView != 空)mOpenCvCameraView.enableView();}@Override保护列表<?扩展 CameraBridgeViewBase> getCameraViewList() {返回集合.singletonList(mOpenCvCameraView);}@Override公共无效 onDestroy() {super.onDestroy();if (mOpenCvCameraView != 空)mOpenCvCameraView.disableView();}@Overridepublic void onCameraViewStarted(int width, int height) {}@Override公共无效 onCameraViewStopped() {}@Override公共垫 onCameraFrame(CvCameraViewFrame inputFrame) {返回 inputFrame.rgba();}}
就是这样!现在,您可以在设备上运行代码进行检查。