org.vinesrobotics.bot.utils.opencv.OpenCvManager.java Source code

Java tutorial

Introduction

Here is the source code for org.vinesrobotics.bot.utils.opencv.OpenCvManager.java

Source

/*
 * Copyright (c) 2017 Vines High School Robotics Team
 *
 *                            Permission is hereby granted, free of charge, to any person obtaining a copy
 *                            of this software and associated documentation files (the "Software"), to deal
 *                            in the Software without restriction, including without limitation the rights
 *                            to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *                            copies of the Software, and to permit persons to whom the Software is
 *                            furnished to do so, subject to the following conditions:
 *
 *                            The above copyright notice and this permission notice shall be included in all
 *                            copies or substantial portions of the Software.
 *
 *                            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *                            IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *                            FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *                            AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *                            LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *                            OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 *                            SOFTWARE.
 */

package org.vinesrobotics.bot.utils.opencv;

import android.app.Activity;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.SurfaceView;

import org.firstinspires.ftc.robotcontroller.internal.FtcRobotControllerActivity;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import org.vinesrobotics.bot.utils.Utils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Created by ViBots on 12/21/2017.
 */

public class OpenCvManager implements CameraBridgeViewBase.CvCameraViewListener2 {
    static {
        System.loadLibrary("opencv_java3");
    }

    private static Handler createView = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            OpenCvManager cvm = (OpenCvManager) msg.obj;

            Activity rcact = FtcRobotControllerActivity.ActivityInstance;

            cvm.mOpenCvCameraView = (JavaCameraView) rcact
                    .findViewById(com.qualcomm.ftcrobotcontroller.R.id.color_blob_detection_activity_surface_view);

            cvm.mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
            cvm.mOpenCvCameraView.setCvCameraViewListener(cvm);
            cvm.mOpenCvCameraView.setCameraIndex(JavaCameraView.CAMERA_ID_FRONT);

            Log.i(TAG, "CVCameraView created");
        }
    };

    private static String TAG = "ViBots::OpenCvManager";
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(Utils.getContext()) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i(TAG, "OpenCV loaded successfully");
                mOpenCvCameraView.enableView();

                recorder.setVideoSize(mOpenCvCameraView.getWidth(), mOpenCvCameraView.getHeight());
                try {
                    recorder.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                recorder.start();

                mOpenCvCameraView.setRecorder(recorder);
            }
                break;
            default: {
                super.onManagerConnected(status);
                Log.i(TAG, "Callback Failed");
            }
                break;
            }
        }
    };
    private Mat mRgba;
    private List<ColorBlobDetector> mDetectors = new ArrayList<>();
    private boolean mIsColorSelected = true;
    private JavaCameraView mOpenCvCameraView;
    private MediaRecorder recorder;

    public static int getFrontFacingCameraId() {
        int cameraCount = 0;
        int camId = -1;
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        cameraCount = Camera.getNumberOfCameras();
        for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
            Camera.getCameraInfo(camIdx, cameraInfo);
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                try {
                    camId = camIdx;
                } catch (RuntimeException e) {
                    Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
                }
            }
        }

        return camId;
    }

    public void initCV() {

        if (recorder == null)
            recorder = new VideoRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        recorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
        recorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/"
                + new Date().getTime() + "_auton.mp4");

        Message msg = createView.obtainMessage(0, this);
        msg.sendToTarget();

        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, Utils.getContext(), mLoaderCallback);
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
        //mOpenCvCameraView.setCameraIndex(cam);
    }

    public void stopCV() {
        mOpenCvCameraView.disableView();
        recorder.stop();
        recorder.reset();
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        mRgba = new Mat(height, width, CvType.CV_8UC4);
        Log.i(TAG, "View started");
    }

    public void registerBlobDetector(ColorBlobDetector blob) {
        mDetectors.add(blob);
    }

    @Override
    public void onCameraViewStopped() {
        mRgba.release();
    }

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        mRgba = inputFrame.rgba();
        //Log.i(TAG, "Frame accepted");

        if (mIsColorSelected) {
            for (ColorBlobDetector det : mDetectors) {
                det.process(mRgba);
            }
            /*List<MatOfPoint> contours = mDetector.getContours();
            Log.e(TAG, "Contours count: " + contours.size());
            Imgproc.drawContours(mRgba, contours, -1, CONTOUR_COLOR);
                
            Mat colorLabel = mRgba.submat(4, 68, 4, 68);
            colorLabel.setTo(mBlobColorRgba);
                
            Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70, 70 + mSpectrum.cols());
            mSpectrum.copyTo(spectrumLabel);*/
        }

        return mRgba;
    }

    public Scalar converScalarHsv2Rgba(Scalar hsvColor) {
        Mat pointMatRgba = new Mat();
        Mat pointMatHsv = new Mat(1, 1, CvType.CV_8UC3, hsvColor);
        Imgproc.cvtColor(pointMatHsv, pointMatRgba, Imgproc.COLOR_HSV2RGB_FULL, 4);

        return new Scalar(pointMatRgba.get(0, 0));
    }
}