Java tutorial
/* Copyright 2015 Samsung Electronics Co., LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gearvrf.ipbsample; import org.gearvrf.GVRTexture; import org.gearvrf.GVRActivity; import org.gearvrf.GVRBitmapTexture; import org.gearvrf.GVRContext; import org.gearvrf.GVRScene; import org.gearvrf.GVRSceneObject; import org.gearvrf.GVRScript; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.android.Utils; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc; import org.gearvrf.ipbsample.util.TouchPadInput; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.hardware.Camera; import android.hardware.Camera.Parameters; public class SampleViewManager extends GVRScript implements Camera.PreviewCallback { private final int TOTAL_VIEWS = 4; private boolean showData = false; private int viewNum = 1, zoomNum = 0; private double imageFps = 0; private int imageCount = 0, imageStep = 20; private double imageFreq = 0, imageTime = 0; private Bitmap bitmap = null; private Camera camera = null; // private float pressure = 0; private double latitude = 0, longitude = 0, altitude = 0; private GVRBitmapTexture bitmapTexture; // private SensorManager sensorManager = null; // private Sensor sensorPressure = null; // private LocationManager locationManager; // private Location location; private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(SampleActivity.context) { @Override public void onManagerConnected(int status) { if (status == LoaderCallbackInterface.SUCCESS) { System.loadLibrary("mixed_sample"); // System.loadLibrary("ImageProcessing"); } else { super.onManagerConnected(status); } } }; public SampleViewManager(final SampleActivity activity) { bitmap = Bitmap.createBitmap(SampleProcessing.width, SampleProcessing.height, Bitmap.Config.ARGB_8888); } @Override public GVRTexture getSplashTexture(GVRContext gvrContext) { Bitmap bitmapSplash = BitmapFactory.decodeResource(gvrContext.getActivity().getResources(), R.drawable.ipbgearvr_splash); GVRBitmapTexture bitmapSplashTexture = new GVRBitmapTexture(gvrContext, bitmapSplash); return (GVRTexture) bitmapSplashTexture; } @Override public void onInit(GVRContext arg0) throws Throwable { GVRScene gvrScene = arg0.getNextMainScene(new Runnable() { @SuppressWarnings("deprecation") @Override public void run() { initializeCamera(); // initializeSensors(); // initializeLocation(); imageFreq = Core.getTickFrequency(); imageTime = Core.getTickCount(); } }); bitmapTexture = new GVRBitmapTexture(arg0, bitmap); GVRSceneObject cameraObject = new GVRSceneObject(arg0, arg0.createQuad(5.3333f, 3.0f), bitmapTexture); cameraObject.getTransform().setPosition(0.0f, 0.0f, -4.0f); gvrScene.getMainCameraRig().addChildObject(cameraObject); } @Override public void onStep() { } public void onPause() { // sensorManager.unregisterListener(this); } public void onResume() { if (!OpenCVLoader.initDebug()) { OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, SampleActivity.context, mLoaderCallback); } else { mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } // sensorManager.registerListener(this, sensorPressure, // SensorManager.SENSOR_DELAY_NORMAL); } public void onStop() { if (camera != null) { camera.setPreviewCallback(null); camera.stopPreview(); camera.release(); camera = null; } } public void onRestart() { initializeCamera(); } @Override public void onPreviewFrame(byte[] data, Camera camera) { setFps(); getTouchPadInput(); Mat yuvImage = new Mat(SampleProcessing.height * 3 / 2, SampleProcessing.width, CvType.CV_8UC1); yuvImage.put(0, 0, data); Mat rgbaImage = new Mat(SampleProcessing.height, SampleProcessing.width, CvType.CV_8UC4); Imgproc.cvtColor(yuvImage, rgbaImage, Imgproc.COLOR_YUV420sp2RGBA, 4); Mat outputImage = new Mat(SampleProcessing.height, SampleProcessing.width, CvType.CV_8UC4); outputImage = SampleProcessing.processImage(rgbaImage, viewNum); if (zoomNum > 0) { outputImage = SampleProcessing.zoomImage(outputImage, zoomNum); } if (showData) { outputImage = SampleProcessing.dataImage(outputImage, viewNum, zoomNum, imageFps, latitude, longitude, altitude); } Utils.matToBitmap(outputImage, bitmap); bitmapTexture.update(bitmap); } private void getTouchPadInput() { TouchPadInput.process(); switch (TouchPadInput.getCurrent().swipeDirection) { case Up: if (showData) { showData = false; } else { showData = true; } break; case Down: if (viewNum < TOTAL_VIEWS) { viewNum++; } else { viewNum = 1; } break; case Forward: if (zoomNum < 40) { zoomNum += 10; } break; case Backward: if (zoomNum > 0) { zoomNum -= 10; } break; case Ignore: break; default: break; } } private void initializeCamera() { camera = Camera.open(); camera.setPreviewCallback(SampleViewManager.this); Parameters params = camera.getParameters(); params.setPreviewSize(SampleProcessing.width, SampleProcessing.height); int[] range = new int[2]; params.getPreviewFpsRange(range); params.setPreviewFrameRate(range[Parameters.PREVIEW_FPS_MAX_INDEX] / 1000); params.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); camera.setParameters(params); camera.startPreview(); } // private void initializeSensors() { // sensorManager = (SensorManager) SampleActivity.context // .getSystemService(Context.SENSOR_SERVICE); // // sensorPressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE); // } // private void initializeLocation() { // locationManager = (LocationManager) SampleActivity.context // .getSystemService(Context.LOCATION_SERVICE); // // locationManager.requestLocationUpdates( // LocationManager.NETWORK_PROVIDER, 5, 0, this); // // location = locationManager // .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); // // if (location != null) { // latitude = location.getLatitude(); // longitude = location.getLongitude(); // } // } private void setFps() { ++imageCount; if (imageCount % imageStep == 0) { long time = Core.getTickCount(); imageFps = Math.round(imageStep * imageFreq / (time - imageTime) * 100.0) / 100.0; imageTime = time; } } // @Override // public void onAccuracyChanged(Sensor sensor, int accuracy) { // // TODO Auto-generated method stub // } // // @Override // public void onSensorChanged(SensorEvent event) { // switch (event.sensor.getType()) { // case Sensor.TYPE_PRESSURE: // pressure = event.values[0]; // altitude = Math // .round(SensorManager.getAltitude( // SensorManager.PRESSURE_STANDARD_ATMOSPHERE, // pressure) * 10.00) / 10.00; // break; // } // } // // @Override // public void onLocationChanged(Location location) { // this.location = location; // latitude = this.location.getLatitude(); // longitude = this.location.getLongitude(); // } // // @Override // public void onProviderDisabled(String provider) { // // TODO Auto-generated method stub // // } // // @Override // public void onProviderEnabled(String provider) { // // TODO Auto-generated method stub // // } // // @Override // public void onStatusChanged(String provider, int status, Bundle extras) { // // TODO Auto-generated method stub // // } }