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<Camera.Size> 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<Camera.Area> focusAreas = new ArrayList<Camera.Area>(); focusAreas.add(new Camera.Area(focusRect, 1000)); parameters.setFocusAreas(focusAreas); } if (parameters.getMaxNumMeteringAreas() > 0) { List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>(); 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 - 1000); int centerY = (int) (y / getResolution().height - 1000); int left = clamp(centerX - areaSize / 2, -1000, 1000); int top = clamp(centerY - areaSize / 2, -1000, 1000); RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); return new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.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<String> 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<String> 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) { } }
private MTCameraView mOpenCvCameraView; public void init() { mOpenCvCameraView = new MTCameraView(this, -1); mOpenCvCameraView.setCvCameraViewListener(this); mOpenCvCameraView.setFocusable(true); mOpenCvCameraView.setOnTouchListener(MainActivity.this); mOpenCvCameraView.enableView(); FrameLayout frame = new FrameLayout(this); frame.addView(mOpenCvCameraView); setContentView(frame); } @Override public boolean onTouch(View arg0, MotionEvent arg1) { // TODO Auto-generated method stub mOpenCvCameraView.focusOnTouch(arg1); return true; }
private List<Camera.Size> mResolutionList; private MenuItem[] mResolutionMenuItems; private MenuItem[] mFocusListItems; private MenuItem[] mFlashListItems; private SubMenu mResolutionMenu; private SubMenu mFocusMenu; private SubMenu mFlashMenu; @Override public boolean onCreateOptionsMenu(Menu menu) { Log.i(TAG, "called onCreateOptionsMenu"); List<String> mFocusList = new LinkedList<String>(); int idx =0; mFocusMenu = menu.addSubMenu("Focus"); mFocusList.add("Auto"); mFocusList.add("Continuous Video"); mFocusList.add("EDOF"); mFocusList.add("Fixed"); mFocusList.add("Infinity"); mFocusList.add("Makro"); mFocusList.add("Continuous Picture"); mFocusListItems = new MenuItem[mFocusList.size()]; ListIterator<String> FocusItr = mFocusList.listIterator(); while(FocusItr.hasNext()){ // add the element to the mDetectorMenu submenu String element = FocusItr.next(); mFocusListItems[idx] = mFocusMenu.add(2,idx,Menu.NONE,element); idx++; } List<String> mFlashList = new LinkedList<String>(); idx = 0; mFlashMenu = menu.addSubMenu("Flash"); mFlashList.add("Auto"); mFlashList.add("Off"); mFlashList.add("On"); mFlashList.add("Red-Eye"); mFlashList.add("Torch"); mFlashListItems = new MenuItem[mFlashList.size()]; ListIterator<String> FlashItr = mFlashList.listIterator(); while(FlashItr.hasNext()){ // add the element to the mDetectorMenu submenu String element = FlashItr.next(); mFlashListItems[idx] = mFlashMenu.add(3,idx,Menu.NONE,element); idx++; } mResolutionMenu = menu.addSubMenu("Resolution"); mResolutionList = mOpenCvCameraView.getResolutionList(); mResolutionMenuItems = new MenuItem[mResolutionList.size()]; ListIterator<Camera.Size> resolutionItr = mResolutionList.listIterator(); idx = 0; while(resolutionItr.hasNext()) { Camera.Size element = resolutionItr.next(); mResolutionMenuItems[idx] = mResolutionMenu.add(1, idx, Menu.NONE, Integer.valueOf((int) element.width).toString() + "x" + Integer.valueOf((int) element.height).toString()); idx++; } return true; } public boolean onOptionsItemSelected(MenuItem item) { Log.i(TAG, "called onOptionsItemSelected; selected item: " + item); if (item.getGroupId() == 1) { int id = item.getItemId(); Camera.Size resolution = mResolutionList.get(id); mOpenCvCameraView.setResolution(resolution); resolution = mOpenCvCameraView.getResolution(); String caption = Integer.valueOf((int) resolution.width).toString() + "x" + Integer.valueOf((int) resolution.height).toString(); Toast.makeText(this, caption, Toast.LENGTH_SHORT).show(); } else if (item.getGroupId()==2){ int focusType = item.getItemId(); mOpenCvCameraView.setFocusMode(this, focusType); } else if (item.getGroupId()==3){ int flashType = item.getItemId(); mOpenCvCameraView.setFlashMode(this, flashType); } return true; }
[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现,布布扣,bubuko.com
[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现
原文:http://blog.csdn.net/candycat1992/article/details/21617741