• 高强度学习训练第二天总结:Opencv+Android+CameraView小demo


    前言:网上已经有很多人将Opencv集成进Android项目中了。因此我只给大家看Gradle文件和项目目录。

    1、gradle

    三个gradle script

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    
    buildscript {
        repositories {
            google()
            jcenter()
            
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.5.0'
            
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
            
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "cn.baldorange.myapplication"
            minSdkVersion 22
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'androidx.appcompat:appcompat:1.0.2'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test:runner:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
        implementation project(':openCVLibrary347')
        implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
    }
    task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
        destinationDir file("$buildDir/native-libs")
        baseName 'native-libs'
        from fileTree(dir: 'libs', include: '**/*.so')
        into 'lib/'
    }
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn(nativeLibsToJar)
    }
    apply plugin: 'com.android.library'
    
    android {
        compileSdkVersion 28
        buildToolsVersion "28.0.3"
    
        defaultConfig {
            minSdkVersion 22
            targetSdkVersion 28
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
        }
    }

    二、JNILIB

     三、MainActivity

    package cn.baldorange.myapplication;
    
    import androidx.appcompat.app.AppCompatActivity;
    import cn.baldorange.myapplication.activities.CameraActivity;
    
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import org.opencv.android.OpenCVLoader;
    import org.opencv.android.Utils;
    import org.opencv.core.Mat;
    import org.opencv.imgproc.Imgproc;
    
    public class MainActivity extends AppCompatActivity {
    
        private ImageView imageView;
        private Button button;
        private Button button2;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
            //初始化
            if (OpenCVLoader.initDebug()) {
                Toast.makeText(this, "OpenCVLoader初始化成功", Toast.LENGTH_SHORT).show();
            }
    
            //测试灰度
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    convert2Grey();
                }
            });
    
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent i = new Intent(MainActivity.this, CameraActivity.class);
                    startActivity(i);
                }
            });
        }
    
        private void convert2Grey() {
            Mat src = new Mat();//Mat是OpenCV的一种图像格式
            Mat temp = new Mat();
            Mat dst = new Mat();
            Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.powershell);
            Utils.bitmapToMat(bitmap, src);
            Imgproc.cvtColor(src, temp, Imgproc.COLOR_RGB2BGR);
            Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);
            Utils.matToBitmap(dst, bitmap);
            imageView.setImageBitmap(bitmap);
            //
            src.release();
            temp.release();
            dst.release();
        }
    
        private void initView() {
            imageView = (ImageView) findViewById(R.id.imageView);
            button = (Button) findViewById(R.id.button);
            button2 = findViewById(R.id.button2);
        }
    }
    package cn.baldorange.myapplication.activities;
    
    import androidx.appcompat.app.AppCompatActivity;
    import cn.baldorange.myapplication.MainActivity;
    import cn.baldorange.myapplication.R;
    
    import android.content.pm.ActivityInfo;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    import org.opencv.android.BaseLoaderCallback;
    import org.opencv.android.CameraBridgeViewBase;
    import org.opencv.android.LoaderCallbackInterface;
    import org.opencv.android.OpenCVLoader;
    import org.opencv.core.CvType;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    import java.io.File;
    import java.util.Date;
    
    public class CameraActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{
    
        private String TAG = "OpenCV_Test";
        //OpenCV的相机接口
        private CameraBridgeViewBase mCVCamera;
        //缓存相机每帧输入的数据
        private Mat mRgba;
        private Button button;
    
        /**通过OpenCV管理Android服务,初始化OpenCV**/
        BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
            @Override
            public void onManagerConnected(int status) {
                switch (status) {
                    case LoaderCallbackInterface.SUCCESS:
                        Log.i(TAG, "OpenCV loaded successfully");
                        mCVCamera.enableView();
                        break;
                    default:break;
                }
            }
        };
        Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg){
                super.handleMessage(msg);
                if(msg.what == 1){
                    button.performClick();
                }
            }
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_camera);
            //初始化并设置预览部件
            mCVCamera = (CameraBridgeViewBase) findViewById(R.id.camera_view);
            mCVCamera.setCvCameraViewListener(this);
    
            //拍照按键
            button = (Button) findViewById(R.id.deal_btn);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mRgba != null) {
                        if(!mRgba.empty()) {
                            Mat inter = new Mat(mRgba.width(), mRgba.height(), CvType.CV_8UC4);
                            Log.e("Mat","...............1...............");
                            //将四通道的RGBA转为三通道的BGR,重要!!
                            Imgproc.cvtColor(mRgba, inter, Imgproc.COLOR_RGBA2BGR);
                            Log.e("Mat","...............2...............");
                            File sdDir = null;
                            //判断是否存在机身内存
                            boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
                            if(sdCardExist) {
                                //获得机身储存根目录
                                sdDir = Environment.getExternalStorageDirectory();
                                Log.e("Mat","...............3...............");
                            }
                            //将拍摄准确时间作为文件名
                            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
                            String filename = sdf.format(new Date());
                            String savepath=sdDir + "/Pictures/OpenCV/";
                            File f=new File(savepath);
                            if(!f.exists()){
                                f.mkdirs();
                            }
                            String filePath = sdDir + "/Pictures/OpenCV/" + filename + ".png";
                            Log.e("Mat","..............."+filePath+"...............");
                            //将转化后的BGR矩阵内容写入到文件中
                            Imgcodecs.imwrite(filePath, inter);
                            Toast.makeText(CameraActivity.this, "图片保存到: "+ filePath, Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            });
    
            // moveTaskToBack(true);
    //        new test().start();
        }
        private class test extends Thread{
            @Override
            public void run() {
                super.run();
                while (true){
                    try {
                        Thread.sleep(2000);
                        Log.e("begin","kaishi.........");
    
                        Message message = new Message();
                        message.what = 1;
                        handler.sendMessage(message);
                    }catch (Exception e){
                        Log.e("error",e.getMessage());
                    }
                }
            }
        }
        @Override
        protected void onResume() {
            /***强制横屏***/
            if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            } else {
                //横屏后才加载部件,否则会FC
                if(!OpenCVLoader.initDebug()) {
                    Log.d(TAG, "OpenCV library not found!");
                } else {
                    Log.d(TAG, "OpenCV library found inside package. Using it!");
                    mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
                }
            }
            super.onResume();
        }
    
        @Override
        protected void onDestroy() {
            if(mCVCamera != null) {
                mCVCamera.disableView();
            }
            super.onDestroy();
        }
    
        //对象实例化及基本属性的设置,包括长度、宽度和图像类型标志
        public void onCameraViewStarted(int width, int height) {
            Log.e("Mat","...............4...............");
            mRgba = new Mat(height, width, CvType.CV_8UC4);
        }
    
        /**图像处理都写在这里!!!**/
        @Override
        public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
            mRgba = inputFrame.rgba();  //一定要有!!!不然数据保存不进MAT中!!!
            //直接返回输入视频预览图的RGB数据并存放在Mat数据中
            Log.e("Mat","...............5...............");
            return mRgba;
        }
    
        //结束时释放
        @Override
        public void onCameraViewStopped() {
            Log.e("Mat","...............6...............");
            mRgba.release();
            // mTmp.release();
        }
    }

    四、运行结果

  • 相关阅读:
    每日签到
    手机刮刮卡
    js随机更换
    jquery实现input输入框实时输入触发事件代码
    webAPP前端必备知识
    让你分分钟学会 JS 闭包
    js获取url?后的参数
    js获取上传的文件名
    Javascript 中神奇的 this
    由浅入深完全掌握Ajax
  • 原文地址:https://www.cnblogs.com/godoforange/p/11529274.html
Copyright © 2020-2023  润新知