OpenCV 调用 Android智能手机摄像头
目录
环境配置
示例效果
关键代码
源代码文件
JavaCameraView
CvCameraViewListener2
环境配置
Android Studio 配置OpenCV,参考下面的链接:
https://blog.csdn.net/qq_24118527/article/details/87923390
示例效果
注意:本例程没有使用自定义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) {
@Override
public 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() {
// Instantiate
Log.i(TAG, "Instantiated new " + this.getClass());
}
@Override
protected 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);
}
@Override
public void onPause()
{
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
@Override
public 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();
}
@Override
public void onCameraViewStarted(int width, int height) {
}
@Override
public void onCameraViewStopped() {
}
@Override
public 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="http://schemas.android.com/apk/res/android"
xmlns:opencv="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RealtimeActivity">
<org.opencv.android.JavaCameraView
android: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>
源代码文件
链接: https://pan.baidu.com/s/1uFvg\_KvB7IIBaqgSANuAtg
提取码: 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
用法如下图:
参考
可以看一下这些文章:
https://jayrambhia.com/blog/beginning-android-opencv
https://docs.opencv.org/3.0-beta/platforms/android/service/doc/BaseLoaderCallback.html
还没有评论,来说两句吧...