JDS
JDS

Reputation: 16998

Android OpenCV display both (front + back) cameras in app

I'm trying to overlay the front camera preview on top of the back camera preview. I'm able to access either front or back camera, but not both of them together.

Here is my code:

activity_main.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:opencv="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_framelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <org.opencv.android.JavaCameraView
        android:id="@+id/CameraViewBack"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"
        opencv:camera_id="back"
        opencv:show_fps="true" />
    <!-- camera_id: "any", "back", "front" or by number value -->
    
    <org.opencv.android.JavaCameraView
        android:id="@+id/CameraViewFront"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:visibility="gone"
        opencv:camera_id="front"
        opencv:show_fps="true" />

</FrameLayout>

MainActivity.java:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.activity_main);

        mFrameLayout = (FrameLayout) findViewById(R.id.main_framelayout);

        mOpenCvCameraViewBack = (CameraBridgeViewBase) findViewById(R.id.CameraViewBack);
        mOpenCvCameraViewBack.setVisibility(SurfaceView.VISIBLE);
        mOpenCvCameraViewBack.setCvCameraViewListener(this);
        
        mOpenCvCameraViewFront = (CameraBridgeViewBase) findViewById(R.id.CameraViewFront);
        mOpenCvCameraViewFront.setVisibility(SurfaceView.VISIBLE);
        mOpenCvCameraViewFront.setCvCameraViewListener(this);
        

    }

Problem: I only see the back camera view over the screen. What I want is a small window with the front camera view overlaid on top of this so I can see both.

How can I do this?

Upvotes: 1

Views: 3507

Answers (2)

gvigelet
gvigelet

Reputation: 1

this works:

package org.opencv.samples.tutorial1;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraActivity;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;

import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.WindowManager;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Tutorial1Activity extends CameraActivity {
    private static final String TAG = "OCVSample::Activity";

    private CameraBridgeViewBase mOpenCvCameraView1;
    private CameraBridgeViewBase mOpenCvCameraView2;
    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");
                    mOpenCvCameraView1.enableView();
                    mOpenCvCameraView2.enableView();
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };

    public Tutorial1Activity() {
        Log.i(TAG, "Instantiated new " + this.getClass());
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "called onCreate");
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setContentView(R.layout.tutorial1_surface_view);

        mOpenCvCameraView1 = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view1);
        mOpenCvCameraView2 = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view2);

        mOpenCvCameraView1.setVisibility(SurfaceView.VISIBLE);
        mOpenCvCameraView2.setVisibility(SurfaceView.VISIBLE);

        mOpenCvCameraView1.setCvCameraViewListener(new CvCameraViewListener2() {
            @Override
            public void onCameraViewStarted(int width, int height) {
                Log.i(TAG, "Camera 1 started");
            }

            @Override
            public void onCameraViewStopped() {
                Log.i(TAG, "Camera 1 stopped");
            }

            @Override
            public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
                return inputFrame.rgba();
            }
        });

        mOpenCvCameraView2.setCvCameraViewListener(new CvCameraViewListener2() {
            @Override
            public void onCameraViewStarted(int width, int height) {
                Log.i(TAG, "Camera 2 started");
            }

            @Override
            public void onCameraViewStopped() {
                Log.i(TAG, "Camera 2 stopped");
            }

            @Override
            public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
                return inputFrame.rgba();
            }
        });

    }

    @Override
    public void onPause()
    {
        super.onPause();
        if (mOpenCvCameraView1 != null)
            mOpenCvCameraView1.disableView();
        if (mOpenCvCameraView2 != null)
            mOpenCvCameraView2.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, this, mLoaderCallback);
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }

    @Override
    protected List<? extends CameraBridgeViewBase> getCameraViewList() {
        // return Collections.singletonList(mOpenCvCameraView2);
        return Arrays.asList(mOpenCvCameraView1, mOpenCvCameraView2);
    }

    public void onDestroy() {
        super.onDestroy();
        if (mOpenCvCameraView1 != null)
            mOpenCvCameraView1.disableView();
        if (mOpenCvCameraView2 != null)
            mOpenCvCameraView2.disableView();
    }

}

Upvotes: 0

hn7
hn7

Reputation: 56

Cannot do this.

"cv::VideoCapture class implementation for Android does not support several cameras in the same time." "Android Camera API does not support cocurrent camera usage"

http://answers.opencv.org/question/8328/can-i-open-2-android-cameras-concurrently/

Upvotes: 4

Related Questions