android触屏对焦_[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

import java.util.ArrayList;

import java.util.List;

import org.opencv.android.JavaCameraView;

import android.R.integer;

import android.content.Context;

import android.graphics.Rect;

import android.graphics.RectF;

import android.hardware.Camera;

import android.hardware.Camera.AutoFocusCallback;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.widget.Toast;

public class MTCameraView extends JavaCameraView implements AutoFocusCallback {

public MTCameraView(Context context, int attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

}

public List getResolutionList() {

return mCamera.getParameters().getSupportedPreviewSizes();

}

public Camera.Size getResolution() {

Camera.Parameters params = mCamera.getParameters();

Camera.Size s = params.getPreviewSize();

return s;

}

public void setResolution(Camera.Size resolution) {

disconnectCamera();

connectCamera((int)resolution.width, (int)resolution.height);

}

public void focusOnTouch(MotionEvent event) {

Rect focusRect = calculateTapArea(event.getRawX(), event.getRawY(), 1f);

Rect meteringRect = calculateTapArea(event.getRawX(), event.getRawY(), 1.5f);

Camera.Parameters parameters = mCamera.getParameters();

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

if (parameters.getMaxNumFocusAreas() > 0) {

List focusAreas = new ArrayList();

focusAreas.add(new Camera.Area(focusRect, 1000));

parameters.setFocusAreas(focusAreas);

}

if (parameters.getMaxNumMeteringAreas() > 0) {

List meteringAreas = new ArrayList();

meteringAreas.add(new Camera.Area(meteringRect, 1000));

parameters.setMeteringAreas(meteringAreas);

}

mCamera.setParameters(parameters);

mCamera.autoFocus(this);

}

/**

* Convert touch position x:y to {@link Camera.Area} position -1000:-1000 to 1000:1000.

*/

private Rect calculateTapArea(float x, float y, float coefficient) {

float focusAreaSize = 300;

int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();

int centerX = (int) (x / getResolution().width * 2000 - 1000);

int centerY = (int) (y / getResolution().height * 2000 - 1000);

int left = clamp(centerX - areaSize / 2, -1000, 1000);

int right = clamp(left + areaSize, -1000, 1000);

int top = clamp(centerY - areaSize / 2, -1000, 1000);

int bottom = clamp(top + areaSize, -1000, 1000);

return new Rect(left, top, right, bottom);

}

private int clamp(int x, int min, int max) {

if (x > max) {

return max;

}

if (x < min) {

return min;

}

return x;

}

public void setFocusMode (Context item, int type){

Camera.Parameters params = mCamera.getParameters();

List FocusModes = params.getSupportedFocusModes();

switch (type){

case 0:

if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))

params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

else

Toast.makeText(item, "Auto Mode not supported", Toast.LENGTH_SHORT).show();

break;

case 1:

if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))

params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

else

Toast.makeText(item, "Continuous Mode not supported", Toast.LENGTH_SHORT).show();

break;

case 2:

if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_EDOF))

params.setFocusMode(Camera.Parameters.FOCUS_MODE_EDOF);

else

Toast.makeText(item, "EDOF Mode not supported", Toast.LENGTH_SHORT).show();

break;

case 3:

if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_FIXED))

params.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED);

else

Toast.makeText(item, "Fixed Mode not supported", Toast.LENGTH_SHORT).show();

break;

case 4:

if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY))

params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);

else

Toast.makeText(item, "Infinity Mode not supported", Toast.LENGTH_SHORT).show();

break;

case 5:

if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_MACRO))

params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);

else

Toast.makeText(item, "Macro Mode not supported", Toast.LENGTH_SHORT).show();

break;

}

mCamera.setParameters(params);

}

public void setFlashMode (Context item, int type){

Camera.Parameters params = mCamera.getParameters();

List FlashModes = params.getSupportedFlashModes();

switch (type){

case 0:

if (FlashModes.contains(Camera.Parameters.FLASH_MODE_AUTO))

params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);

else

Toast.makeText(item, "Auto Mode not supported", Toast.LENGTH_SHORT).show();

break;

case 1:

if (FlashModes.contains(Camera.Parameters.FLASH_MODE_OFF))

params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);

else

Toast.makeText(item, "Off Mode not supported", Toast.LENGTH_SHORT).show();

break;

case 2:

if (FlashModes.contains(Camera.Parameters.FLASH_MODE_ON))

params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);

else

Toast.makeText(item, "On Mode not supported", Toast.LENGTH_SHORT).show();

break;

case 3:

if (FlashModes.contains(Camera.Parameters.FLASH_MODE_RED_EYE))

params.setFlashMode(Camera.Parameters.FLASH_MODE_RED_EYE);

else

Toast.makeText(item, "Red Eye Mode not supported", Toast.LENGTH_SHORT).show();

break;

case 4:

if (FlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH))

params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);

else

Toast.makeText(item, "Torch Mode not supported", Toast.LENGTH_SHORT).show();

break;

}

mCamera.setParameters(params);

}

@Override

public void onAutoFocus(boolean arg0, Camera arg1) {

}

}

在MainActivity中需要初始化MTCamera,并且实现OnTouchListener接口,以便在触摸屏幕时可以调用onTouch函数。其中主要代码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值