写真を撮るときに、Androidの電話からAutoExposureCompensationレベル(明るさ)を取得する方法?露出を取得するにはどのように写真を撮るときに、Java経由で、Androidの電話カメラからの補償レベル?
写真を撮ることができます。私は露出補正(常にチェックするとゼロ)を含むカメラのパラメータにアクセスできますが、撮影前と後ではなく、撮影時にAE補正レベルを取得する必要があります。
背景:特定の時刻に撮影されたすべての画像に、同じAE補正レベルを使用して撮影します。私はAndroidカメラが一般的にやっている露光レベルやホワイトバランスに何百という調整を加えることを望んでいません。私は一度取得し、すべての後続の写真、同じ設定を設定します。
写真、OpenCV、フラグメントなどに "インテント"を使用しようとしましたが、これらのいずれかでAE補正設定を取得できないようです。ここで私が試した最新のコードがJavaCameraViewの拡張版で始まる、だ:
import org.opencv.android.JavaCameraView;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.util.AttributeSet;
import android.util.Log;
@SuppressWarnings("deprecation")
public class NewJavaCameraView extends JavaCameraView implements PictureCallback {
public int getExposureCompensation(){
return mCamera.getParameters().getExposureCompensation();
}
@SuppressWarnings("deprecation")
public void takePicture(final String fileName) {
Log.i(TAG, "Taking picture");
this.mPictureFileName = fileName;
Camera.Parameters params = mCamera.getParameters();
int exposureComp = params.getExposureCompensation();
mCamera.setPreviewCallback(null);
// PictureCallback is implemented by the current class
int otherexposureComp =this.getExposureCompensation();
mCamera.takePicture(null, null, this);
}
@SuppressWarnings("deprecation")
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Camera.Parameters params = mCamera.getParameters();
int exposureComp = params.getExposureCompensation();
int otherexposureComp =this.getExposureCompensation();
mCamera.startPreview();
mCamera.setPreviewCallback(this);
// Write the image in a file (in jpeg format)
try {
FileOutputStream fos = new FileOutputStream(mPictureFileName);
fos.write(data);
fos.close();
} catch (java.io.IOException e) {
Log.e("Picture", "photoCallback", e);
}
}
ここでは、上記のクラスを使っているAndroidのビューからのコードの一部です:
public class DiscPhoto extends Activity implements CvCameraViewListener2, OnTouchListener {
private static final String TAG = "OCVSample::Activity";
private NewJavaCameraView mOpenCvCameraView;
private List<Size> mResolutionList;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
mOpenCvCameraView.setOnTouchListener(DiscPhoto.this);
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
public DiscPhoto() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_disc_photo);
mOpenCvCameraView = (NewJavaCameraView) findViewById(R.id.discPhotoPage);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
}
@SuppressLint("SimpleDateFormat")
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(TAG,"onTouch event");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
String currentDateandTime = sdf.format(new Date());
String fileName = Environment.getExternalStorageDirectory().getPath() +
"/sample_picture_" + currentDateandTime + ".jpg";
mOpenCvCameraView.takePicture(fileName);
Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT).show();
return false;
}
あなたはAE [ShutterCallback](https://developer.android.com/reference/android/hardware/を取得しようとしたことがありvoid関数と呼ばれるcreatePreviewSessions()を呼び出しCamera.ShutterCallback.html)が起動されますか? – NAmorim
NAmorim ええ、私はそれのようなものを試しました。私はセンサー露出時間とセンサー感度を調べて、どこに行くか教えてください。それがうまくいくかどうかはわかりません。しかし、これを見ていただきありがとうございます。 – Brian
android.hardware.camera2 APIをオプションとして使用していますか? https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#getAvailableCaptureResultKeys() – Fildor