【问题标题】:Opencv Camera megapixels AndroidOpencv 摄像头百万像素 Android
【发布时间】:2014-03-22 20:31:53
【问题描述】:

我是 Opencv 新手。我使用 JavaCameraView, 它使用 1280x 720 相机分辨率。 如何将分辨率提高到 5 兆像素? 请帮帮我:)

【问题讨论】:

    标签: opencv camera resolution


    【解决方案1】:

    您需要选择相机允许的分辨率。在您的 onCameraViewStarted 函数中调用以下代码并设置 listNum 以便它对应于您想要的分辨率:

    Parameters params = mCamera.getParameters();
    List<Size> resList = mCamera.getParameters().getSupportedPictureSizes();
    int listNum = 1;// 0 is the maximum resolution
    int width = resList.get(listNum).width;
    int height = resList.get(listNum).height;
    params.setPictureSize(width, height);
    mCamera.setParameters(params);
    

    mCamera 是您的 org.opencv.android.JavaCameraView 对象。

    布赖恩

    【讨论】:

      【解决方案2】:

      OpenCV Camera (JavaCameraView) 似乎已设置为默认最大分辨率 1280*720。

      我们可以使用以下方法降低分辨率:

      cameraView.setMaxFrameSize(320, 280); 或者

      cameraView.setMaxFrameSize(480, 320);
      

      或者

      cameraView.setMaxFrameSize(640, 480);
      

      或者

      cameraView.setMaxFrameSize(800, 600);
      

      或者

      cameraView.setMaxFrameSize(1280, 720);
      

      现在的问题是,如果我的手机支持更高的分辨率,之后如何提高分辨率。为此,我们必须制作自己定制的 JavaCameraView(比如说 MyCameraView)。

      只需将 JavaCameraView 复制并粘贴到 MyCameraView 并根据您的需要进行更正。

      在我的情况下,我做了以下更正:

      package com.example.opencvcamera;
      
      import org.opencv.android.CameraBridgeViewBase;
      import android.hardware.Camera;
      import java.util.List;
      import android.content.Context;
      import android.graphics.ImageFormat;
      import android.graphics.SurfaceTexture;
      import android.os.Build;
      import android.util.AttributeSet;
      import android.util.Log;
      import android.view.ViewGroup.LayoutParams;
      
      import org.opencv.core.CvType;
      import org.opencv.core.Mat;
      import org.opencv.core.Size;
      import org.opencv.imgproc.Imgproc;
      
      /**
       * Created by Kumar.Vaibhav on 19-04-2017.
       */
      
      public class MyCameraView extends CameraBridgeViewBase implements Camera.PreviewCallback {
          private static final int MAGIC_TEXTURE_ID = 10;
          private static final String TAG = "MyCameraView";
      
          private byte mBuffer[];
          private Mat[] mFrameChain;
          private int mChainIdx = 0;
          private Thread mThread;
          private boolean mStopThread;
      
          protected Camera mCamera;
          protected MyCameraView.JavaCameraFrame[] mCameraFrame;
          private SurfaceTexture mSurfaceTexture;
      
          public static class JavaCameraSizeAccessor implements ListItemAccessor {
      
              @Override
              public int getWidth(Object obj) {
                  Camera.Size size = (Camera.Size) obj;
                  return size.width;
              }
      
              @Override
              public int getHeight(Object obj) {
                  Camera.Size size = (Camera.Size) obj;
                  return size.height;
              }
          }
      
          public MyCameraView(Context context, int cameraId) {
              super(context, cameraId);
          }
      
          public MyCameraView(Context context, AttributeSet attrs) {
              super(context, attrs);
          }
      
          protected boolean initializeCamera(int width, int height) {
              Log.d(TAG, "Initialize java camera");
              boolean result = true;
              synchronized (this) {
                  mCamera = null;
      
                  if (mCameraIndex == CAMERA_ID_ANY) {
                      Log.d(TAG, "Trying to open camera with old open()");
                      try {
                          mCamera = Camera.open();
                      }
                      catch (Exception e){
                          Log.e(TAG, "Camera is not available (in use or does not exist): " + e.getLocalizedMessage());
                      }
      
                      if(mCamera == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
                          boolean connected = false;
                          for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) {
                              Log.d(TAG, "Trying to open camera with new open(" + Integer.valueOf(camIdx) + ")");
                              try {
                                  mCamera = Camera.open(camIdx);
                                  connected = true;
                              } catch (RuntimeException e) {
                                  Log.e(TAG, "Camera #" + camIdx + "failed to open: " + e.getLocalizedMessage());
                              }
                              if (connected) break;
                          }
                      }
                  } else {
                      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
                          int localCameraIndex = mCameraIndex;
                          if (mCameraIndex == CAMERA_ID_BACK) {
                              Log.i(TAG, "Trying to open back camera");
                              Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
                              for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) {
                                  Camera.getCameraInfo( camIdx, cameraInfo );
                                  if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                                      localCameraIndex = camIdx;
                                      break;
                                  }
                              }
                          } else if (mCameraIndex == CAMERA_ID_FRONT) {
                              Log.i(TAG, "Trying to open front camera");
                              Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
                              for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) {
                                  Camera.getCameraInfo( camIdx, cameraInfo );
                                  if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                                      localCameraIndex = camIdx;
                                      break;
                                  }
                              }
                          }
                          if (localCameraIndex == CAMERA_ID_BACK) {
                              Log.e(TAG, "Back camera not found!");
                          } else if (localCameraIndex == CAMERA_ID_FRONT) {
                              Log.e(TAG, "Front camera not found!");
                          } else {
                              Log.d(TAG, "Trying to open camera with new open(" + Integer.valueOf(localCameraIndex) + ")");
                              try {
                                  mCamera = Camera.open(localCameraIndex);
                              } catch (RuntimeException e) {
                                  Log.e(TAG, "Camera #" + localCameraIndex + "failed to open: " + e.getLocalizedMessage());
                              }
                          }
                      }
                  }
      
                  if (mCamera == null)
                      return false;
      
                  /* Now set camera parameters */
                  try {
                      Camera.Parameters params = mCamera.getParameters();
                      Log.d(TAG, "getSupportedPreviewSizes()");
                      List<android.hardware.Camera.Size> sizes = params.getSupportedPreviewSizes();
      
                      if (sizes != null) {
                          /* Select the size that fits surface considering maximum size allowed */
                          //Size frameSize = calculateCameraFrameSize(sizes, new MyCameraView.JavaCameraSizeAccessor(), width, height);
      
                          Camera.Size mSizePicture =sizes.get(0);
                          if(mSizePicture.width<3264 && mSizePicture.height<2448)
                          {
                              int cameraSize= sizes.size();
                              mSizePicture =sizes.get(cameraSize-1);
                          }
                          /*params.setPreviewFormat(ImageFormat.NV21);
                          Log.d(TAG, "Set preview size to " + Integer.valueOf((int)frameSize.width) + "x" + Integer.valueOf((int)frameSize.height));
                          params.setPreviewSize((int)frameSize.width, (int)frameSize.height);
      
                          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && !android.os.Build.MODEL.equals("GT-I9100"))
                              params.setRecordingHint(true);*/
      
                          List<String> FocusModes = params.getSupportedFocusModes();
                          if (FocusModes != null && FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
                          {
                              params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
                          }
      
                          mCamera.setParameters(params);
                          params = mCamera.getParameters();
      
                          mFrameWidth = params.getPreviewSize().width;
                          mFrameHeight = params.getPreviewSize().height;
      
                          if ((getLayoutParams().width == LayoutParams.MATCH_PARENT) && (getLayoutParams().height == LayoutParams.MATCH_PARENT))
                              mScale = Math.min(((float)height)/mFrameHeight, ((float)width)/mFrameWidth);
                          else
                              mScale = 0;
      
                          if (mFpsMeter != null) {
                              mFpsMeter.setResolution(mFrameWidth, mFrameHeight);
                          }
      
                          int size = mFrameWidth * mFrameHeight;
                          size  = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8;
                          mBuffer = new byte[size];
      
                          mCamera.addCallbackBuffer(mBuffer);
                          mCamera.setPreviewCallbackWithBuffer(this);
      
                          mFrameChain = new Mat[2];
                          mFrameChain[0] = new Mat(mFrameHeight + (mFrameHeight/2), mFrameWidth, CvType.CV_8UC1);
                          mFrameChain[1] = new Mat(mFrameHeight + (mFrameHeight/2), mFrameWidth, CvType.CV_8UC1);
      
                          AllocateCache();
      
                          mCameraFrame = new MyCameraView.JavaCameraFrame[2];
                          mCameraFrame[0] = new MyCameraView.JavaCameraFrame(mFrameChain[0], mFrameWidth, mFrameHeight);
                          mCameraFrame[1] = new MyCameraView.JavaCameraFrame(mFrameChain[1], mFrameWidth, mFrameHeight);
      
                          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                              mSurfaceTexture = new SurfaceTexture(MAGIC_TEXTURE_ID);
                              mCamera.setPreviewTexture(mSurfaceTexture);
                          } else
                              mCamera.setPreviewDisplay(null);
      
                          /* Finally we are ready to start the preview */
                          Log.d(TAG, "startPreview");
                          mCamera.startPreview();
                      }
                      else
                          result = false;
                  } catch (Exception e) {
                      result = false;
                      e.printStackTrace();
                  }
              }
      
              return result;
          }
      
          protected void releaseCamera() {
              synchronized (this) {
                  if (mCamera != null) {
                      mCamera.stopPreview();
                      mCamera.setPreviewCallback(null);
      
                      mCamera.release();
                  }
                  mCamera = null;
                  if (mFrameChain != null) {
                      mFrameChain[0].release();
                      mFrameChain[1].release();
                  }
                  if (mCameraFrame != null) {
                      mCameraFrame[0].release();
                      mCameraFrame[1].release();
                  }
              }
          }
      
          private boolean mCameraFrameReady = false;
      
          @Override
          protected boolean connectCamera(int width, int height) {
      
              /* 1. We need to instantiate camera
               * 2. We need to start thread which will be getting frames
               */
              /* First step - initialize camera connection */
              Log.d(TAG, "Connecting to camera");
              if (!initializeCamera(width, height))
                  return false;
      
              mCameraFrameReady = false;
      
              /* now we can start update thread */
              Log.d(TAG, "Starting processing thread");
              mStopThread = false;
              mThread = new Thread(new CameraWorker());
              mThread.start();
      
              return true;
          }
      
          @Override
          protected void disconnectCamera() {
              /* 1. We need to stop thread which updating the frames
               * 2. Stop camera and release it
               */
              Log.d(TAG, "Disconnecting from camera");
              try {
                  mStopThread = true;
                  Log.d(TAG, "Notify thread");
                  synchronized (this) {
                      this.notify();
                  }
                  Log.d(TAG, "Wating for thread");
                  if (mThread != null)
                      mThread.join();
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } finally {
                  mThread =  null;
              }
      
              /* Now release camera */
              releaseCamera();
      
              mCameraFrameReady = false;
          }
      
          @Override
          public void onPreviewFrame(byte[] frame, Camera arg1) {
              Log.d(TAG, "Preview Frame received. Frame size: " + frame.length);
              synchronized (this) {
                  mFrameChain[mChainIdx].put(0, 0, frame);
                  mCameraFrameReady = true;
                  this.notify();
              }
              if (mCamera != null)
                  mCamera.addCallbackBuffer(mBuffer);
          }
      
          private class JavaCameraFrame implements CvCameraViewFrame {
              @Override
              public Mat gray() {
                  return mYuvFrameData.submat(0, mHeight, 0, mWidth);
              }
      
              @Override
              public Mat rgba() {
                  Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4);
                  return mRgba;
              }
      
              public JavaCameraFrame(Mat Yuv420sp, int width, int height) {
                  super();
                  mWidth = width;
                  mHeight = height;
                  mYuvFrameData = Yuv420sp;
                  mRgba = new Mat();
              }
      
              public void release() {
                  mRgba.release();
              }
      
              private Mat mYuvFrameData;
              private Mat mRgba;
              private int mWidth;
              private int mHeight;
          };
      
          private class CameraWorker implements Runnable {
      
              @Override
              public void run() {
                  do {
                      boolean hasFrame = false;
                      synchronized (MyCameraView.this) {
                          try {
                              while (!mCameraFrameReady && !mStopThread) {
                                  MyCameraView.this.wait();
                              }
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                          if (mCameraFrameReady)
                          {
                              mChainIdx = 1 - mChainIdx;
                              mCameraFrameReady = false;
                              hasFrame = true;
                          }
                      }
      
                      if (!mStopThread && hasFrame) {
                          if (!mFrameChain[1 - mChainIdx].empty())
                              deliverAndDrawFrame(mCameraFrame[1 - mChainIdx]);
                      }
                  } while (!mStopThread);
                  Log.d(TAG, "Finish processing thread");
              }
          }
      }
      

      同样将activity_main.xml改成如下:

         <com.example.opencvcamera.MyCameraView
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:id="@+id/java_camera_view"
          android:visibility="visible"/>
      

      【讨论】:

      • 如何在我的活动中启动它?
      猜你喜欢
      • 2022-06-10
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2018-03-31
      • 2021-03-02
      • 1970-01-01
      • 2012-10-17
      相关资源
      最近更新 更多