马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在本节中,我们将扩展上一节中创建的空 OpenCV 应用步调以支持摄像头。我们将获取摄像头帧并将其表现在屏幕上。
告诉体系我们必要相机权限。将以下代码添加到文件MyApplication/app/src/main/AndroidManifest.xml:- <uses-permission android:name="android.permission.CAMERA"/>
-
- <uses-feature android:name="android.hardware.camera" android:required="false"/>
- <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
- <uses-feature android:name="android.hardware.camera.front" android:required="false"/>
- <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>
复制代码
- 转到activity_main.xml结构并删除带有文本“Hello World!”的 TextView
TextView这也可以在代码或拆分模式下通过从 XML 文件中删除块来完成。
xmlns pencv = "http://schemas.android.com/apk/res-auto"
TextView用小部件更换org.opencv.android.JavaCameraView:- <org.opencv.android.JavaCameraView
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:visibility="gone"
- android:id="@+id/tutorial1_activity_java_surface_view"
- opencv:show_fps="true"
- opencv:camera_id="any" />
复制代码
- 如果你收到结构告诫,请用for和properties更换fill_parent值match_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" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- [camera_view] -->
- <org.opencv.android.JavaCameraView
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:visibility="gone"
- android:id="@+id/tutorial1_activity_java_surface_view"
- opencv:show_fps="true"
- opencv:camera_id="any" /> <!-- [camera_view] --> </FrameLayout>
复制代码
- 从 继承主类。CameraActivity 实现相机权限哀求和org.opencv.android.CameraActivityCV 应用步调所需的一些其他实用步调。我们想要重写的方法包罗onCreate、onDestroy、和onPauseonResumegetCameraViewList
- 实现接口org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2 onCameraFrame方法应该返回Mat带有内容的对象以供渲染。示例仅返回相机帧以供预览:return inputFrame.rgba();
- 分配org.opencv.android.CameraBridgeViewBase对象:
- 它应该在应用步调启动时创建(onCreate方法),而且该类应该设置为监听器
- 在停息/规复(onPause,onResume方法)时应该禁用/启用它
- 应在应用步调完成时禁用(onDestroy方法)
- 应归还getCameraViewList
- 您可以选择克制手机调暗屏幕或锁定:
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
复制代码 终极的源码:- package org.opencv.samples.tutorial1; import org.opencv.android.CameraActivity;import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;import org.opencv.android.OpenCVLoader;import org.opencv.core.Mat;import org.opencv.android.CameraBridgeViewBase;import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import android.os.Bundle;import android.util.Log;import android.view.SurfaceView;import android.view.WindowManager;import android.widget.Toast; import java.util.Collections;import java.util.List; public class Tutorial1Activity extends CameraActivity implements CvCameraViewListener2 { private static final String TAG = "OCVSample::Activity"; private CameraBridgeViewBase mOpenCvCameraView; public Tutorial1Activity() { Log.i(TAG, "Instantiated new " + this.getClass()); } @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); if (OpenCVLoader.initLocal()) { Log.i(TAG, "OpenCV loaded successfully"); } else { Log.e(TAG, "OpenCV initialization failed!"); (Toast.makeText(this, "OpenCV initialization failed!", Toast.LENGTH_LONG)).show(); return; }
- 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(this); } @Override public void onPause() { super.onPause(); if (mOpenCvCameraView != null) mOpenCvCameraView.disableView(); } @Override public void onResume() { super.onResume(); if (mOpenCvCameraView != null) mOpenCvCameraView.enableView(); } @Override protected List<? extends CameraBridgeViewBase> getCameraViewList() { return Collections.singletonList(mOpenCvCameraView); } @Override public void onDestroy() { super.onDestroy(); if (mOpenCvCameraView != null) mOpenCvCameraView.disableView(); } @Override public void onCameraViewStarted(int width, int height) { } @Override public void onCameraViewStopped() { } @Override public Mat onCameraFrame(CvCameraViewFrame inputFrame) { return inputFrame.rgba(); }}
复制代码 就是如许!现在您可以在装备上运行代码来查抄它。
记载一下最紧张的步调
每个带有 UI 的 Android 应用步调都必须实现 Activity 和 View。起首,我们创建空缺活动和默认视图结构。最简朴的以 OpenCV 为中心的应用步调必须实行 OpenCV 初始化,创建一个视图来表现来自摄像头的预览,并实现CvCameraViewListener2接口以从摄像头获取帧并对其举行处理处罚。
起首,我们使用 XML 结构创建应用步调视图。我们的结构仅包罗一个类的全屏组件org.opencv.android.JavaCameraView。此 OpenCV 类继承自CameraBridgeViewBase扩展类SurfaceView,并在底层使用标准 Android 相机 API。
该CvCameraViewListener2接口允许您在从相机抓取帧之后和在屏幕上渲染之前添加一些处理处罚步调。最紧张的方法是onCameraFrame。这是一个回调函数,在从相机检索帧时调用。它渴望该onCameraFrame函数返回将在屏幕上绘制的 RGBA 帧。
回调将相机中的帧作为类对象转达给我们的类CvCameraViewFrame。此对象具有rgba()和gray()方法,可让用户获取彩色或单通道灰度帧作为Mat类对象。
条记
不要生存或使用回调CvCameraViewFrame之外的对象onCameraFrame。此对象没有本身的状态,而且其在回调之外的活动不可猜测!
|