智能手机摄像头"/>
OpenCV 调用 Android智能手机摄像头
目录
环境配置
示例效果
关键代码
源代码文件
JavaCameraView
CvCameraViewListener2
环境配置
Android Studio 配置OpenCV,参考下面的链接:
示例效果
注意:本例程没有使用自定义View的方式实现
使用自定义View方式实现的例程有空了更新
关键代码
RealtimeActivity.java
package cn.edu.zju.myopencv;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.Surface;
import android.view.SurfaceView;
import android.view.WindowManager;import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;public class RealtimeActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {private CameraBridgeViewBase mOpenCvCameraView;private static final String TAG = "nikolajohn";private boolean mIsJavaCamera = true;private MenuItem mItemSwitchCamera = null;private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {@Overridepublic void onManagerConnected(int status) {switch (status){case LoaderCallbackInterface.SUCCESS:{Log.i(TAG,"OpenCV loaded successfully");mOpenCvCameraView.enableView();}break;default:{super.onManagerConnected(status);}break;}}};public RealtimeActivity() {// InstantiateLog.i(TAG, "Instantiated new " + this.getClass());}@Overrideprotected void onCreate(Bundle savedInstanceState) {Log.i(TAG,"Called on Create");super.onCreate(savedInstanceState);// 屏幕常亮getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);setContentView(R.layout.activity_realtime);mOpenCvCameraView = findViewById(R.id.tutorial1_activity_java_surface_view);mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);mOpenCvCameraView.setCvCameraViewListener(this);}@Overridepublic void onPause(){super.onPause();if (mOpenCvCameraView != null)mOpenCvCameraView.disableView();}@Overridepublic void onResume(){super.onResume();if(!OpenCVLoader.initDebug()){Log.d(TAG,"Internal OpenCV library not found , Using OpenCV Manager for initialization");OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0,this,mLoaderCallback);}else{Log.d(TAG,"OpenCV library found inside package , Using it");mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);}}public void onDestroy() {super.onDestroy();if (mOpenCvCameraView != null)mOpenCvCameraView.disableView();}@Overridepublic void onCameraViewStarted(int width, int height) {}@Overridepublic void onCameraViewStopped() {}@Overridepublic Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {Mat src = inputFrame.rgba();Mat temp = new Mat();Mat dst = new Mat();Imgproc.cvtColor(src, temp, Imgproc.COLOR_RGBA2BGR);Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2HLS);return src;}
}
activity_realtime.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android=""xmlns:opencv=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".RealtimeActivity"><org.opencv.android.JavaCameraViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:visibility="visible"android:id="@+id/tutorial1_activity_java_surface_view"opencv:show_fps="true"opencv:camera_id="any" /></FrameLayout>
源代码文件
链接:
提取码: qeh8
JavaCameraView
先看一下类的派生关系
显然,其父类是CameraBridgeViewBase
JavaCameraView类是View的子类,可以认为是用于OpenCV和Java Camera之间衔接的一种Bridge View
这个类继承了基类中可用的功能,并实现一些必要的方法:
- connectCamera
打开java camera 并设置需要被传递的变量PreviewCallback
- disconnectCamera
关闭摄像头并停止预览
当一帧一帧的图像数据通过callback从摄像头传递过来时,图像数据将会通过OpenCV转换为RGBA32格式
CvCameraViewListener2
这个是Activity需要实现的接口类
implement这个接口类后,我们需要实现以下几个方法:
- onCameraFrame
当图像的数据需要被传递时调用此方法,返回值是被修改过的帧数据
- onCameraViewStarted
当摄像头的预览开启时,此方法被调用。当这个方法被调用后,图像数据才能通过onCameraFrame函数返回给屏幕
- onCameraViewStopped
当摄像头的预览由于某些原因而被终止时该方法将会被调用,当该方法被调用后,图像无法再通过onCameraFrame显示到屏幕
BaseLoaderCallback
用法如下图:
参考
可以看一下这些文章:
.0-beta/platforms/android/service/doc/BaseLoaderCallback.html
更多推荐
OpenCV 调用 Android智能手机摄像头
发布评论