Articles of android camera2

访问被拒绝查找属性“camera.hal1.packagelist”

在服务中使用相机时,移动屏幕变得不可触摸(由透明窗口锁定)并且仅在出现错误之下 Access denied finding property “camera.hal1.packagelist” 将是什么原因及其解决方案? 请帮忙..

Camera2basic应用程序,在Android 6.0 LGG3中有非常黑暗的预览

新的API,也许只在LG G3上,似乎有些变化。 我正在使用示例代码 。 在我的nexus 4上,代码运行完美,但在LGG3上更新到Android 6.0却没有。 有任何想法吗? 我玩了设置,但没有运气,这仍然适用于Nexus 4: mPreviewRequestBuilder.set(CaptureRequest.BLACK_LEVEL_LOCK, false); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, false); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CaptureRequest.CONTROL_AE_ANTIBANDING_MODE_AUTO); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0); //mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range.create(1000,1000)); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, 0); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO); mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CaptureRequest.CONTROL_MODE_AUTO); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

YUV_420_888解读三星Galaxy S7(Camera2)

我写了一个从YUV_420_888到Bitmap的转换,考虑到以下逻辑(据我所知): 总结该方法:内核的坐标x和y与Y平面(2d分配)的非填充部分的x和y以及输出Bitmap的x和y都是一致的。 然而,U平面和V平面具有与Y平面不同的结构,因为它们使用1个字节覆盖4个像素,此外,可能具有多于一个的PixelStride,此外它们可能也有一个可以与Y平面不同的填充。 因此,为了通过内核有效地访问U和V,我将它们放入1-d分配并创建索引“uvIndex”,该索引给出了在给定的1-d分配中相应的U-和V的位置( (非填充)Y平面中的x,y)坐标(以及输出位图)。 为了保持rs-Kernel的精简,我通过LaunchOptions限制x范围来排除yPlane中的填充区域(这反映了y平面的RowStride,因此可以在内核中忽略)。 所以我们只需要考虑uvIndex中的uvPixelStride和uvRowStride,即用于访问u值和v值的索引。 这是我的代码: Renderscript内核,名为yuv420888.rs #pragma version(1) #pragma rs java_package_name(com.xxxyyy.testcamera2); #pragma rs_fp_relaxed int32_t width; int32_t height; uint picWidth, uvPixelStride, uvRowStride ; rs_allocation ypsIn,uIn,vIn; // The LaunchOptions ensure that the Kernel does not enter the padding zone of Y, so yRowStride can be ignored WITHIN the Kernel. uchar4 __attribute__((kernel)) doConvert(uint32_t x, uint32_t […]

Camera2中的预览回调明显慢于Camera1中的回调

这是2017年,我终于开始从Camera1切换到Camera2。 在Camera1中,我非常依赖setPreviewCallbackWithBuffer()来执行实时帧处理,但是在Camera2中,它的工作速度要慢得多,几乎无法使用。 相比之下,在Moto G3上Camera1可以很容易地产生30-40 FPS而在Camera2上我的速度不能超过10-15 FPS。 以下是我创建ImageReader imageReader = ImageReader .newInstance( previewSize.width, // size is around 1280×720 previewSize.height, ImageFormat.YUV_420_888, // note, it is not JPEG 2 // max number of images, does not really affect performance ); imageReader.setOnImageAvailableListener( callback, CameraThread.getInstance().createHandler() ); 回调本身可以完成最小的工作: Image image = reader.acquireNextImage(); image.close(); 我已经检查了类似的答案,比如这个 。 然而他们的问题是他们使用JPEG图像格式而不是YUV_420_888 。 如何实现类似于Camera1的性能?

android应用程序的内存分配问题

我有一个执行图像分析的Android应用程序,它使用IntentService管理 – 该过程每次都需要几秒钟,并且准确,快速地工作。 但是当应用程序在应用程序中重复大约50次时(如图所示),它开始变得非常缓慢,直到应用程序和设备变得无法使用。 当设备重新启动并且应用程序再次打开时,它会照常运行。 使用Android Studio进行检查我可以看到,每次运行分析时,应用程序的内存分配每次都会上升大约1MB 。 因此崩溃时显然内存不足。 我已经使用此标志完成分析并转到结果以尝试修复后台活动; intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 效果极小,我理解IntentService管理自己关闭。 所以不知道我还能做些什么来尝试减少内存分配或者至少清除分配并停止添加它? 更多细节: 该应用程序正在使用基于Google Camera2的相机实现 通过IntentService使用C ++库完成分析

在Android上零拷贝相机处理和渲染stream水线

我需要在实时摄像机数据(仅来自Y平面)上执行CPU端只读过程,然后在GPU上进行渲染。 在处理完成之前不应该渲染帧(所以我不总是想渲染摄像机的最新帧,只是CPU端已经完成处理的最新帧)。 渲染与摄像机处理是分离的,即使摄像机帧的速率低于60帧,其目标也是60帧/秒。 有一个相关的,但更高层次的问题在: 最低的开销摄像头CPU到GPU的方法在Android上 要更详细地描述当前的设置:我们有一个应用程序端的缓冲池用于摄像机数据,其中缓冲区是“空闲”,“正在显示”或“正在显示”。 当来自摄像机的新帧到达时,我们抓取一个空闲的缓冲区,在那里存储帧(或者如果实际数据在系统提供的缓冲池中的引用),执行处理并将结果存入缓冲区,然后设置缓冲区“等待显示”。 在渲染器线程中,如果在渲染循环的开始处有任何缓冲区“暂挂显示”,我们将其locking为“正在显示”中的一个,渲染相机,并使用从相同的计算得到的已处理信息渲染其他内容相机框架。 感谢@ fadden对上面提到的问题的回应我现在明白android camera2 API的“并行输出”function可以在各种输出队列之间共享缓冲区,所以不应该涉及数据上的任何副本,至less在现代的android上。 在评论中有一个build议,我可以同时lockingSurfaceTexture和ImageReader输出,只是“坐在缓冲区”,直到处理完成。 不幸的是,我不认为这适用于我的情况,因为我们仍然希望以60 FPS的速度进行分离渲染,并且仍然需要访问前一帧,而新的一个正在处理,以确保事情不会得到不同步。 想到的一个解决scheme是拥有多个SurfaceTextures – 每个应用程序端缓冲区都有一个(我们目前使用3个)。 有了这个scheme,当我们得到一个新的相机帧,我们将从我们的应用程序池获得一个免费的缓冲区。 然后我们调用ImageReader的acquireLatestImage()来获取数据进行处理,并在空闲缓冲区的SurfaceTexture上调用updateTexImage() 。 在呈现的时候,我们只需要确保“显示”缓冲区中的SufaceTexture是绑定到GL的那个,并且大部分时间应该是同步的(@fadden评论说在调用updateTexImage()和acquireLatestImage()但那个时间窗口应该足够小,使得它很less见,也许使用缓冲区中的时间戳是可以解决的。 我在文档中注意到updateTexImage()只能在SurfaceTexture绑定到GL上下文时调用,这意味着我需要在相机处理线程中使用GL上下文,因此相机线程可以在SurfaceTexture上执行updateTexImage()在“空闲”缓冲区中,而渲染线程仍然能够从“显示”缓冲区中的SurfaceTexture渲染。 所以,对于这个问题: 这似乎是一个明智的做法? SurfaceTextures基本上是共享缓冲池的简单包装,还是消耗一些有限的硬件资源,应该谨慎使用? SurfaceTexture的调用是否足够便宜,以至于复制数据仍然是一个巨大的胜利? 是计划有两个不同的GL上下文线程与不同的SurfaceTexture绑定在每个可能的工作,或者我要求一个痛苦和越野车司机的世界? 这听起来很有希望,我会去给它一个去; 但是如果有人(基本上@fadden!)知道我忽视了哪些内部细节,这会让这个主意变得糟糕,那么在这里值得问一下。

相机2 APIvideo录制 – 自动闪光灯不工作

我已经实现了一个使用camera2 APIloggingvideo的自定义相机。 有一个选项可以将闪光灯设置为“开”,“关”和“自动”。 设置闪光灯“自动”不工作,而其他选项工作正常。 这里是代码: private void updateFlash() { Log.e(TAG, "Flash = " + currentFlash); switch (currentFlash) { case Constants.FLASH_OFF: previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); break; case Constants.FLASH_ON: previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); break; case Constants.FLASH_TORCH: previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); break; case Constants.FLASH_AUTO: previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); break; } cameraCaptureSession.setRepeatingRequest(previewRequestBuilder.build(), null, null); } 我GOOGLE了很多,并尝试几乎所有的自动闪存的stackoverflow答案,但没有工作。 请帮忙。 我不明白是什么问题。

使用Android Camera2设置video拍摄的亮度/对比度

按照本指南,我使用Camera2 API制作了一个video捕获应用程序, 是否有条款以编程方式更改video的亮度/对比度/曝光设置? 我试图捕捉一些低光照的录像,我希望增加曝光度。 这里的文档似乎只适用于静态图片。 任何这样的video采集方式,使用Camera2 API?

ActivityCompat和ContextCompat有什么区别?

我试图使用Android相机,API 23或以上,它需要在运行时请求权限。 根据文档 ,我可以使用ActivityCompat或ContextCompat来完成。 我不明白这两者之间的区别和它们的权衡。 谢谢你的时间。

如何从色彩校正增益中获得色温

我正在试图找出相机拍摄的照片的色温。 final CameraCaptureSession.CaptureCallback previewSSession = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureStarted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frameNumber) { super.onCaptureStarted(session, request, timestamp, frameNumber); } @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); RggbChannelVector rggbChannelVector = result.get(CaptureResult.COLOR_CORRECTION_GAINS); getColorTemperature(rggbChannelVector); startCamera(); } }; private void getColorTemperature(RggbChannelVector rggbChannelVector) { […]