Reputation: 16998
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
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
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