2014-10-19 301 views
1

我正在開發Android應用程序,並且在開發中使用OpenCV4Android,版本爲2.4.9。在Android中使用OpenCV發佈相機屏幕方向

我用JavaCameraView類打開了一個視頻流。我的問題是相機與設備的位置相比的方向不正確。我使用的是三星Galaxy S4,而OpenCV相機的默認方向似乎是左側風景。

爲了解決這個問題,我使用了這個解決方案。我已經擴展了JavaCameraView類,增加了新的類此方法:

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; 
} 

所以,在initializeCamera法,mCamera.startPreview()之前,我已經添加以下代碼:

   if(isTablet(getContext()) == Boolean.FALSE){ 
        this.getScreenRotationOnPhone(); 
       }else{ 
        this.getScreenRotationOnTablet(); 
       } 

此代碼有效,應用程序不會變慢(我也可以在我的活動的onCameraFrame方法中使用翻轉方法或旋轉矩陣,這樣我的表演會變得更糟)。

唯一的問題是當我的設備的方向從橫向改變到橫向時,反之亦然,而不經過縱向模式。在此更改後,我的相機相對於自然位置旋轉了180度。

這裏有兩個圖像顯示問題。 first step second step

回答