2016-09-23 65 views
0

我試圖顯示在imageview上從onPreviewCallback收到的幀。首先,幀的方向與實時預覽不同,其次它看起來小於實際的實時預覽,這裏是我的代碼。預覽尺寸爲1024 x 768:onPreviewCallback幀比實際幀小

cameraConfigUtil.cameraInstance.setOneShotPreviewCallback(new Camera.PreviewCallback() { 
         @Override 
         public void onPreviewFrame(byte[] originalData, Camera camera) { 
          Mat srcMat = new Mat(camera.getParameters().getPreviewSize().height, camera.getParameters().getPreviewSize().width, CvType.CV_8UC1); 
          srcMat.put(0, 0, originalData); 
          Bitmap bitmap = Bitmap.createBitmap(camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, Bitmap.Config.ARGB_8888); 
          Utils.matToBitmap(srcMat, bitmap); 
          cameraPreviewImage.setVisibility(View.VISIBLE); 
          cameraPreviewImage.setImageBitmap(bitmap); 
         } 
        }); 

設置的攝像機參數:

if (!isCameraParametersSet) { 
      MIN_FRAME_WIDTH = 1024; 
      MIN_FRAME_HEIGHT = 768; 
      if (android.os.Build.VERSION.SDK_INT >= 14) { 
       setFocus(cameraParameters, false); 
      } else { 
       setFocus(cameraParameters, true); 
      } 
      WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
      Display display = manager.getDefaultDisplay(); 
      Point theScreenResolution = new Point(); 
      theScreenResolution.set(display.getHeight(), display.getWidth()); 
      SizePair picturePreviewSizePair = selectSizePair(cameraInstance, MIN_FRAME_WIDTH, MIN_FRAME_HEIGHT); 
      cameraParameters.setPreviewSize(picturePreviewSizePair.mPreview.getWidth(), picturePreviewSizePair.mPreview.getHeight()); 
      cameraParameters.setPictureSize(picturePreviewSizePair.mPicture.getWidth(), picturePreviewSizePair.mPicture.getHeight()); 
      getTargetPictureSize(); 
      if (cameraParameters.getSupportedPictureFormats().contains(ImageFormat.JPEG)) { 
       cameraParameters.setPictureFormat(ImageFormat.JPEG); 
      } 
      cameraParameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO); 
      isCameraParametersSet = true; 
     } 
     return cameraParameters; 

這裏是我的解決代碼:

private static SizePair selectSizePair(Camera camera, int desiredWidth, int desiredHeight) { 
    List<SizePair> validPreviewSizes = generateValidPreviewSizeList(camera); 
    SizePair selectedPair = null; 
    int minDiff = Integer.MAX_VALUE; 
    for (SizePair sizePair : validPreviewSizes) { 
     Size size = sizePair.previewSize(); 
     int diff = Math.abs(size.getWidth() - desiredWidth) + 
       Math.abs(size.getHeight() - desiredHeight); 
     if (diff < minDiff) { 
      selectedPair = sizePair; 
      minDiff = diff; 
     } 
    } 

    return selectedPair; 
} 


private static List<SizePair> generateValidPreviewSizeList(Camera camera) { 
    Camera.Parameters parameters = camera.getParameters(); 
    List<android.hardware.Camera.Size> supportedPreviewSizes = 
      parameters.getSupportedPreviewSizes(); 
    List<android.hardware.Camera.Size> supportedPictureSizes = 
      parameters.getSupportedPictureSizes(); 
    List<SizePair> validPreviewSizes = new ArrayList<>(); 
    for (android.hardware.Camera.Size previewSize : supportedPreviewSizes) { 
     float previewAspectRatio = (float) previewSize.width/(float) previewSize.height; 
     for (android.hardware.Camera.Size pictureSize : supportedPictureSizes) { 
      float pictureAspectRatio = (float) pictureSize.width/(float) pictureSize.height; 
      if (Math.abs(previewAspectRatio - pictureAspectRatio) < ASPECT_RATIO_TOLERANCE) { 
       validPreviewSizes.add(new SizePair(previewSize, pictureSize)); 
       break; 
      } 
     } 
    } 

enter image description here

+0

如何設置此分辨率? – Vyacheslav

+0

用代碼更新了我的問題 –

回答

0

此代碼對我的作品:

Camera.Parameters cameraParam = mCamera.getParameters(); 
List<Size> sizes = cameraParam.getSupportedPreviewSizes(); 
      Camera.Size previewSize = cameraParam.getPreviewSize(); 
      previewFormat = cameraParam.getPreviewFormat(); 
      int[] sizesForCamera = new int[]{sizes.get(0).width,sizes.get(0).height}; 
      cameraParam.setPreviewSize(sizesForCamera[0], sizesForCamera[1]); 
      mCamera.setParameters(cameraParam); 

我還沒有發現setPreviewSize方法在你的代碼:)

不過,請CAMERA2 API

https://developer.android.com/reference/android/hardware/camera2/package-summary.html https://github.com/googlesamples/android-Camera2Basic

+0

計算後我在做setPreviewSize。我無法使用camera2 API,因爲我支持api14 + –

+0

因此,儘可能地顯示代碼 – Vyacheslav

+0

添加了更多代碼 –

1

你怎麼能告訴我們,如果兩者是不同的分辨率?

用於顯示相機預覽(SurfaceView,TextureView)的標準UI元素都可以向上/向下縮放任何接收到的視圖以適應視圖邊界;例如,如果SurfaceView覆蓋1600x1200像素,並且它提供了640x480的相機預覽幀,則會放大幀以填充1600x1200視圖。

但是,用於顯示預覽回調的ImageView並不一定是相同的 - 它會上採樣,但您確實需要確保其佈局與SurfaceView匹配。這看起來好像很小。

關於旋轉 - 記錄在setDisplayOrientation。只有預覽輸出被旋轉;您必須手動旋轉預覽回調中的任何內容。由於您已經將東西加載到OpenCV矩陣中,所以應用90度旋轉應該很容易。您需要的旋轉量與您傳入setDisplayOrientation的旋轉量相同。

+0

這是一個很好的總結。疊加圖像視圖具有MATCH_PARENT高度和寬度。如果我在onPictureTaken中應用相同的邏輯,則圖像很大。這隻發生在onPreviewFrame上。 –