Google 视觉 API 示例:让 CameraSource 聚焦
Google Vision API Samples: Get the CameraSource to Focus
我已从此处查看最新的 Google Vision API:
https://github.com/googlesamples/android-vision
我 运行 在装有 KitKat 的 LG G2 设备上使用它。我所做的唯一更改是 Gradle 文件中的 minSdkVerion:
...
defaultConfig {
applicationId "com.google.android.gms.samples.vision.face.multitracker"
minSdkVersion 19
...
然而它并没有聚焦。我如何让它成为焦点?
我修改了CameraSourcePreview(....)构造函数如下:
public CameraSourcePreview(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mStartRequested = false;
mSurfaceAvailable = false;
mSurfaceView = new SurfaceView(context);
mSurfaceView.getHolder().addCallback(new SurfaceCallback());
addView(mSurfaceView);
mSurfaceView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
cameraFocus(mCameraSource, Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
});
}
private static boolean cameraFocus(@NonNull CameraSource cameraSource, @NonNull String focusMode) {
Field[] declaredFields = CameraSource.class.getDeclaredFields();
for (Field field : declaredFields) {
if (field.getType() == Camera.class) {
field.setAccessible(true);
try {
Camera camera = (Camera) field.get(cameraSource);
if (camera != null) {
Camera.Parameters params = camera.getParameters();
params.setFocusMode(focusMode);
camera.setParameters(params);
return true;
}
return false;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
return false;
}
这里给出了建议:https://github.com/googlesamples/android-vision/issues/2
代码参考在这里:https://gist.github.com/Gericop/7de0b9fdd7a444e53b5a
我还必须修改 FaceTrackerFactory draw(Canvas ...) 方法:
@Override
public void draw(Canvas canvas) {
Face face = mFace;
if (face == null) {
return;
}
// Draws a circle at the position of the detected face, with the face's track id below.
float cx = translateX(face.getPosition().x + face.getWidth() / 2);
float cy = translateY(face.getPosition().y + face.getHeight() / 2);
canvas.drawCircle(cx, cy, FACE_POSITION_RADIUS, mFacePositionPaint);
canvas.drawText("id: " + getId(), cx + ID_X_OFFSET, cy + ID_Y_OFFSET, mIdPaint);
// Draws an oval around the face.
float xOffset = scaleX(face.getWidth() / 2.0f);
float yOffset = scaleY(face.getHeight() / 2.0f);
float left = cx - xOffset;
float top = cy - yOffset;
float right = cx + xOffset;
float bottom = cy + yOffset;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
canvas.drawOval(left, top, right, bottom, mBoxPaint);
} else {
canvas.drawCircle(cx, cy, Math.max(xOffset, yOffset), mBoxPaint);
}
}
官方现已提供自动对焦选项API。请参阅此处的 setAutoFocusEnabled 方法:
此外,我们还开源了 CameraSource class,它也具有自动对焦方法。这个允许你设置一个特定的焦点模式,而不是官方 API 默认的 "continuous video" 模式:
这对我有用 Google Play Services 8.4:
'com.google.android.gms:play-services:8.4.0'
cameraSource = new CameraSource.Builder(this, detector).setRequestedPreviewSize(640, 480).setAutoFocusEnabled(true).build();
我已从此处查看最新的 Google Vision API:
https://github.com/googlesamples/android-vision
我 运行 在装有 KitKat 的 LG G2 设备上使用它。我所做的唯一更改是 Gradle 文件中的 minSdkVerion:
...
defaultConfig {
applicationId "com.google.android.gms.samples.vision.face.multitracker"
minSdkVersion 19
...
然而它并没有聚焦。我如何让它成为焦点?
我修改了CameraSourcePreview(....)构造函数如下:
public CameraSourcePreview(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mStartRequested = false;
mSurfaceAvailable = false;
mSurfaceView = new SurfaceView(context);
mSurfaceView.getHolder().addCallback(new SurfaceCallback());
addView(mSurfaceView);
mSurfaceView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
cameraFocus(mCameraSource, Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
});
}
private static boolean cameraFocus(@NonNull CameraSource cameraSource, @NonNull String focusMode) {
Field[] declaredFields = CameraSource.class.getDeclaredFields();
for (Field field : declaredFields) {
if (field.getType() == Camera.class) {
field.setAccessible(true);
try {
Camera camera = (Camera) field.get(cameraSource);
if (camera != null) {
Camera.Parameters params = camera.getParameters();
params.setFocusMode(focusMode);
camera.setParameters(params);
return true;
}
return false;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
return false;
}
这里给出了建议:https://github.com/googlesamples/android-vision/issues/2
代码参考在这里:https://gist.github.com/Gericop/7de0b9fdd7a444e53b5a
我还必须修改 FaceTrackerFactory draw(Canvas ...) 方法:
@Override
public void draw(Canvas canvas) {
Face face = mFace;
if (face == null) {
return;
}
// Draws a circle at the position of the detected face, with the face's track id below.
float cx = translateX(face.getPosition().x + face.getWidth() / 2);
float cy = translateY(face.getPosition().y + face.getHeight() / 2);
canvas.drawCircle(cx, cy, FACE_POSITION_RADIUS, mFacePositionPaint);
canvas.drawText("id: " + getId(), cx + ID_X_OFFSET, cy + ID_Y_OFFSET, mIdPaint);
// Draws an oval around the face.
float xOffset = scaleX(face.getWidth() / 2.0f);
float yOffset = scaleY(face.getHeight() / 2.0f);
float left = cx - xOffset;
float top = cy - yOffset;
float right = cx + xOffset;
float bottom = cy + yOffset;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
canvas.drawOval(left, top, right, bottom, mBoxPaint);
} else {
canvas.drawCircle(cx, cy, Math.max(xOffset, yOffset), mBoxPaint);
}
}
官方现已提供自动对焦选项API。请参阅此处的 setAutoFocusEnabled 方法:
此外,我们还开源了 CameraSource class,它也具有自动对焦方法。这个允许你设置一个特定的焦点模式,而不是官方 API 默认的 "continuous video" 模式:
这对我有用 Google Play Services 8.4: 'com.google.android.gms:play-services:8.4.0'
cameraSource = new CameraSource.Builder(this, detector).setRequestedPreviewSize(640, 480).setAutoFocusEnabled(true).build();