OpenCV 调用 Android智能手机摄像头

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24118527/article/details/88195131

目录

环境配置

示例效果

关键代码

源代码文件

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

猜你喜欢

转载自blog.csdn.net/qq_24118527/article/details/88195131