小编Ste*_* G.的帖子

来自Android camera2 API的图像数据在Galaxy S5上翻转并压缩

我正在实现一个应用程序,它使用来自相机的实时图像进行实时图像处理.使用现已弃用的android.hardware.Camera,它有限制地工作; 为了提高灵活性和性能,我想使用新的android.hardware.camera2 API.然而,我无法获取原始图像数据进行处理.这是三星Galaxy S5.(不幸的是,我没有其他Lollipop设备可以方便地在其他硬件上进行测试).

我得到了整体框架(灵感来自'HdrViewFinder'和'Camera2Basic'样本),并通过SurfaceTexture和GLSurfaceView在屏幕上绘制实时图像.但是,我还需要访问图像数据(灰度级很好,至少目前为止),以进行自定义图像处理.根据StreamConfigurationMap.isOutputSupportedFor(类)的文档,直接获取图像数据的推荐表面是ImageReader(正确吗?).

所以我将捕获请求设置为:

mSurfaceTexture.setDefaultBufferSize(640, 480);
mSurface = new Surface(surfaceTexture);
...
mImageReader = ImageReader.newInstance(640, 480, format, 2);
...
List<Surface> surfaces = new ArrayList<Surface>();
surfaces.add(mSurface);
surfaces.add(mImageReader.getSurface());
...
mCameraDevice.createCaptureSession(surfaces, mCameraSessionListener, mCameraHandler);
Run Code Online (Sandbox Code Playgroud)

在ImageReader的onImageAvailable回调中,我按如下方式访问数据:

Image img = reader.acquireLatestImage();
ByteBuffer grayscalePixelsDirectByteBuffer = img.getPlanes()[0].getBuffer();
Run Code Online (Sandbox Code Playgroud)

...虽然(如上所述)实时图像预览正在运行,但我得到的数据(或者我得到它的方式)有问题.根据

mCameraInfo.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputFormats();
Run Code Online (Sandbox Code Playgroud)

...应支持以下ImageFormats:NV21,JPEG,YV12,YUV_420_888.我已经尝试了所有(插入上面的"格式"),所有都支持设置的分辨率getOutputSizes(format),但没有一个给出所需的结果:

  • NV21:ImageReader.newInstance抛出java.lang.IllegalArgumentException:不支持NV21格式
  • JPEG:这确实有效,但对于实时应用程序来说,对每个帧进行JPEG编码和解码似乎没有意义......
  • YV12和YUV_420_888:这是最奇怪的结果 - 我可以看到获得灰度图像,但是它是垂直翻转的(是的,翻转,没有旋转!)并且显着地被压扁(水平缩放,但不是垂直缩放).

我在这里错过了什么?是什么导致图像被翻转和压扁?如何获得几何正确的灰度缓冲区?我应该使用不同类型的表面(而不是ImageReader)吗?

任何提示赞赏.

android android-camera galaxy android-5.0-lollipop

8
推荐指数
1
解决办法
3856
查看次数

如何返回null tr​​1 :: shared_ptr并测试它是否为null

我有一个getA()具有以下签名的函数:

class A {  
public:
 typedef std::tr1::shared_ptr <A> Ptr;
 //other member functions.... 
};

class B {
public:
 A::Ptr getA();
};
Run Code Online (Sandbox Code Playgroud)

并且,我希望getA()在相同的情况下返回一个空指针; 另外,作为用户Class B,我需要getA()在使用之前测试返回值是否为null.我该怎么办?

c++ smart-pointers

2
推荐指数
1
解决办法
5548
查看次数