2014-10-19 5 views
1

Android 애플리케이션을 개발 중이며 OpenCV4Android를 개발에 사용하고 있습니다 (버전 2.4.9).OpenCV를 사용하여 Android에서 카메라 화면 방향 발행

JavaCameraView 클래스를 사용하여 비디오 스트림을 열었습니다. 내 문제는 장치의 위치에 비해 카메라의 잘못된 방향입니다. 저는 삼성 갤럭시 S4를 사용하고 있으며 OpenCV 카메라의 기본 방향은 왼쪽으로 보이는 것 같습니다.

이 문제를 해결하기 위해이 솔루션을 사용했습니다.

   if(isTablet(getContext()) == Boolean.FALSE){ 
        this.getScreenRotationOnPhone(); 
       }else{ 
        this.getScreenRotationOnTablet(); 
       } 
다음 mCamera.startPreview()하기 전에, 나는 다음과 같은 코드를 추가 한의 initializeCamera 방법에

private void getScreenRotationOnPhone() { 

    final Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

    switch (display.getRotation()) { 
     case Surface.ROTATION_0: 
      System.out.println("SCREEN_ORIENTATION_PORTRAIT"); 
      setDisplayOrientation(mCamera, 90); 
      try { 
       mCamera.setPreviewDisplay(getHolder()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      break; 

     case Surface.ROTATION_90: 
      System.out.println("SCREEN_ORIENTATION_LANDSCAPE"); 
      break; 

     case Surface.ROTATION_180: 
      System.out.println("SCREEN_ORIENTATION_REVERSE_PORTRAIT"); 
      break; 

     case Surface.ROTATION_270: 
      System.out.println("SCREEN_ORIENTATION_REVERSE_LANDSCAPE"); 
      setDisplayOrientation(mCamera, 180); 
      try { 
       mCamera.setPreviewDisplay(getHolder()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      break; 
    } 
} 

private void getScreenRotationOnTablet() { 

    final Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

    switch (display.getRotation()) { 
     case Surface.ROTATION_0: 
      System.out.println("SCREEN_ORIENTATION_LANDSCAPE"); 
      break; 

     case Surface.ROTATION_90: 
      System.out.println("SCREEN_ORIENTATION_REVERSE_PORTRAIT"); 
      break; 

     case Surface.ROTATION_180: 
      System.out.println("SCREEN_ORIENTATION_REVERSE_LANDSCAPE"); 
      break; 

     case Surface.ROTATION_270: 
      System.out.println("SCREEN_ORIENTATION_PORTRAIT"); 
      break; 
    } 
} 

public static boolean isTablet(Context ctx){ 
    return (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
} 

그래서 :이 방법 새 클래스에 추가하는 JavaCameraView 클래스를 확장 한

이 코드는 작동하며 응용 프로그램이 느려지지 않습니다 (플립 메서드 또는 회전 행렬을 내 활동의 onCameraFrame 메서드에서 사용할 수 있습니다. 이렇게하면 성능이 떨어집니다).

내 방향이 가로 방향에서 가로 방향으로 바뀌거나 세로 방향에서 가로 방향으로 바뀌는 유일한 문제가 있습니다. 이 변경 후 내 카메라는 자연 위치와 관련하여 180도 회전합니다.

여기에는 문제를 보여주는 두 개의 이미지가 있습니다. first step second step

답변

0

이 180 ° 회전 문제는 Android 플랫폼의 버그 또는 기능입니다. 한 가지 확실한 해결 방법은 액티비티를 하나의 가로 및 세로 방향 (전체 센서가 아님) 만 사용하도록 선언하는 것입니다.

다른 방법은 OrientationEventListener을 사용하는 것입니다 참조 Rotating phone quickly 180 degrees, camera preview turns upside down