CameraSource(vision api)未检测到手机何时处于横向模式

时间:2017-08-18 09:29:33

标签: android android-orientation vision

我创建了一个应用程序,使用Vision api跟踪眼睛,当手机处于纵向模式时工作正常但是当我将手机倾斜到横向位置时,应用程序暂停相机并转到onMissing()方法。

请给我一些建议,以便应用程序可以在两种布局中工作,或者可以通过任何电话轮换感知眼睛(0,90,180,270)

代码:

private void createCameraResources() {
    Context context = getApplicationContext();

    // create and setup the face detector
    mFaceDetector = new FaceDetector.Builder(context)
            .setProminentFaceOnly(true)
            .setTrackingEnabled(true) 
            .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
            .setMode(FaceDetector.FAST_MODE) 
            .build();

    mFaceDetector.setProcessor(new LargestFaceFocusingProcessor(mFaceDetector, new FaceTracker()));

    if (!mFaceDetector.isOperational()) {
        Log.w(TAG, "createCameraResources: detector NOT operational");
    } else {
        Log.d(TAG, "createCameraResources: detector operational");
    }
    mCameraSource = new CameraSource.Builder(this, mFaceDetector)
            .setRequestedPreviewSize(640, 480)
            .setFacing(CameraSource.CAMERA_FACING_FRONT)
            .setRequestedFps(30f)
            .build();
}



public class FaceTracker extends Tracker<Face> {

private static final float PROB_THRESHOLD = 0.7f;
private static final String TAG = FaceTracker.class.getSimpleName();
private boolean leftClosed;
private boolean rightClosed;

@Override
public void onUpdate(Detector.Detections<Face> detections, Face face) {
    if (leftClosed && face.getIsLeftEyeOpenProbability() > PROB_THRESHOLD) {
        leftClosed = false;
    } else if (!leftClosed &&  face.getIsLeftEyeOpenProbability() < PROB_THRESHOLD){
        leftClosed = true;
    }
    if (rightClosed && face.getIsRightEyeOpenProbability() > PROB_THRESHOLD) {
        rightClosed = false;
    } else if (!rightClosed && face.getIsRightEyeOpenProbability() < PROB_THRESHOLD) {
        rightClosed = true;
    }

    if (leftClosed && !rightClosed) {
        EventBus.getDefault().post(new LeftEyeClosedEvent());
    } else if (rightClosed && !leftClosed) {
        EventBus.getDefault().post(new RightEyeClosedEvent());
    } else if (!leftClosed && !rightClosed) {
        EventBus.getDefault().post(new NeutralFaceEvent());
    }
}

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.eyetoggle">

<uses-permission android:name="android.permission.CAMERA" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

对应的XML布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentFrameLayout       xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
tools:context="com.android.eyetoggle.MainActivity">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:orientation="horizontal">

    <android.support.v7.widget.SwitchCompat
        android:id="@+id/switchButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/emoticon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/emoji_neutral" />
</LinearLayout>


<View
    android:id="@+id/light"
    android:layout_gravity="center"
    android:background="@color/green"
    app:layout_aspectRatio="100%"
    app:layout_widthPercent="75%" />

</android.support.percent.PercentFrameLayout>

2 个答案:

答案 0 :(得分:0)

您需要检查方向更改并执行类似的操作

private void startIfReady() throws IOException {
    if (mStartRequested && mSurfaceAvailable) {
        mCameraSource.start(mSurfaceView.getHolder());
        if (mOverlay != null) {
            Size size = mCameraSource.getPreviewSize();
            int min = Math.min(size.getWidth(), size.getHeight());
            int max = Math.max(size.getWidth(), size.getHeight());
            if (isPortraitMode()) {
                // Swap width and height sizes when in portrait, since it will be rotated by
                // 90 degrees
                mOverlay.setCameraInfo(min, max, mCameraSource.getCameraFacing());
            } else {
                mOverlay.setCameraInfo(max, min, mCameraSource.getCameraFacing());
            }
            mOverlay.clear();
        }
        mStartRequested = false;
    }
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    int width = 320;
    int height = 240;
    if (mCameraSource != null) {
        Size size = mCameraSource.getPreviewSize();
        if (size != null) {
            width = size.getWidth();
            height = size.getHeight();
        }
    }

    // Swap width and height sizes when in portrait, since it will be rotated 90 degrees
    if (isPortraitMode()) {
        int tmp = width;
        width = height;
        height = tmp;
    }

private boolean isPortraitMode() {
    int orientation = mContext.getResources().getConfiguration().orientation;
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
        return false;
    }
    if (orientation == Configuration.ORIENTATION_PORTRAIT) {
        return true;
    }

    Log.d(TAG, "isPortraitMode returning false by default");
    return false;
}

这是来自官方Android Vision github page

答案 1 :(得分:0)

您需要查看CameraSourcePreview类文件。这是具有所有预览条件的文件。

以下是代码段:

if (childHeight > layoutHeight) {
    childHeight = layoutHeight;
    childWidth = (int)(((float) layoutHeight / (float) height) * width);
}

因此,如果正确删除或处理它,就可以解决问题。