में एंड्रॉइड 5.0 में कैमरा 2 एपीआई का उपयोग करके प्रत्येक फ्रेम डेटा कैसे प्राप्त करें मैं अब camera2Basic के साथ काम कर रहा हूं और प्रत्येक फ्रेम डेटा को कुछ छवि प्रसंस्करण करने की कोशिश कर रहा हूं। मैं एंड्रॉइड 5.0 में कैमरा 2 एपीआई का उपयोग कर रहा हूं, कैमरा पूर्वावलोकन करने पर यह सब कुछ ठीक है और यह द्रव है। लेकिन पूर्वावलोकन जब मैं प्रत्येक फ्रेम डेटा प्राप्त करने के लिए ImageReader.OnImageAvailableListener
कॉलबैक का उपयोग करता हूं, तो यह खराब उपयोगकर्ता अनुभव का कारण बनता है। पीछा कर रहा है मेरी संबंधित कोड:रीयलटाइम
इस कैमरे और ImageReader के लिए सेटअप है, मैं सेट छवि के प्रारूप YUV_420_888
public<T> Size setUpCameraOutputs(CameraManager cameraManager,Class<T> kClass, int width, int height) {
boolean flagSuccess = true;
try {
for (String cameraId : cameraManager.getCameraIdList()) {
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
// choose the front or back camera
if (FLAG_CAMERA.BACK_CAMERA == mChosenCamera &&
CameraCharacteristics.LENS_FACING_BACK != characteristics.get(CameraCharacteristics.LENS_FACING)) {
continue;
}
if (FLAG_CAMERA.FRONT_CAMERA == mChosenCamera &&
CameraCharacteristics.LENS_FACING_FRONT != characteristics.get(CameraCharacteristics.LENS_FACING)) {
continue;
}
StreamConfigurationMap map = characteristics.get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size largestSize = Collections.max(
Arrays.asList(map.getOutputSizes(ImageFormat.YUV_420_888)),
new CompareSizesByArea());
mImageReader = ImageReader.newInstance(largestSize.getWidth(), largestSize.getHeight(),
ImageFormat.YUV_420_888, 3);
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);
...
mCameraId = cameraId;
}
} catch (CameraAccessException e) {
e.printStackTrace();
} catch (NullPointerException e) {
}
......
}
है जब कैमरा सफलतापूर्वक खोला, मैं कैमरा पूर्वावलोकन
के लिए एक CameraCaptureSession बनाएंprivate void createCameraPreviewSession() {
if (null == mTexture) {
return;
}
// We configure the size of default buffer to be the size of camera preview we want.
mTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
// This is the output Surface we need to start preview
Surface surface = new Surface(mTexture);
// We set up a CaptureRequest.Builder with the output Surface.
try {
mPreviewRequestBuilder =
mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
mPreviewRequestBuilder.addTarget(surface);
// We create a CameraCaptureSession for camera preview
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
if (null == mCameraDevice) {
return;
}
// when the session is ready, we start displaying the preview
mCaptureSession = session;
// Finally, we start displaying the camera preview
mPreviewRequest = mPreviewRequestBuilder.build();
try {
mCaptureSession.setRepeatingRequest(mPreviewRequest,
mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
पिछले ImageReader.OnImageAvailableListener
कॉलबैक
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Log.d(TAG, "The onImageAvailable thread id: " + Thread.currentThread().getId());
Image readImage = reader.acquireLatestImage();
readImage.close();
}
};
है 0
शायद मैं गलत सेटअप करता हूं लेकिन मैं कई बार कोशिश करता हूं और यह काम नहीं करता है। शायद ImageReader के बजाय फ्रेम डेटा प्राप्त करने का एक और तरीका है लेकिन मुझे नहीं पता। कोई भी जानता है कि रीयलटाइम में प्रत्येक फ्रेम डेटा कैसे प्राप्त करें?
आप किस प्रकार की प्रसंस्करण करने की कोशिश कर रहे हैं? मुझे लगता है कि अगर आप छवि को सहेजना चाहते हैं, तो एक छवि रीडर का उपयोग करें, लेकिन यदि आप कुशल रीयल-टाइम प्रोसेसिंग करना चाहते हैं, तो आपको इसके बजाय आवंटन से जुड़े भूतल बफर को डेटा भेजना चाहिए। – rcsumner
@ सुमनर, मैं कैमरे से प्रत्येक फ्रेम प्राप्त करना चाहता हूं और छवि को सहेजने के बजाय चेहरे का पता लगाना चाहता हूं। ऐसा लगता है कि आपके द्वारा प्रदान किया जाने वाला समाधान अच्छा है, क्या आप अधिक जानकारी दे सकते हैं? – CJZ
... हाहा वास्तव में नहीं, क्षमा करें। मैं आमतौर पर सिर्फ अपने उद्देश्यों के लिए छवियों को बचाता हूं। मुझे पता है कि इसमें रेंडरस्क्रिप्ट का उपयोग करना शामिल है, हालांकि। आवंटन वर्ग दस्तावेज देखें। – rcsumner