【问题标题】:How to remove rolling shutter effect in camera preview?如何在相机预览中消除滚动快门效果?
【发布时间】:2019-10-09 13:17:47
【问题描述】:

我正在尝试通过拍摄闪烁的 LED 来向手机发送数据。这在大多数情况下都可以正常工作,但是对于某些帧,我的相机预览中会出现滚动快门效果,这会扰乱我的数据传输。有没有办法消除这种卷帘效应?

我正在使用 Google 的 cameraAPI2 和 Nexus 6(但我在三星 S7 上看到了同样的效果)。我以 20 fps 的速度录制,LED 以 20 Hz 的频率闪烁。我的图像格式为 320x240,带有 YUV_420_888。 这是我当前的 CaptureRequest 设置:

CONTROL_AE_MODE CONTROL_AE_MODE_OFF

CONTROL_AWB_MODE CONTROL_AWB_MODE_OFF

EDGE_MODE EDGE_MODE_OFF

CONTROL_MODE CONTROL_MODE_OFF

SENSOR_EXPOSURE_TIME 500000

SENSOR_FRAME_DURATION 50000000

我已经尝试过使用曝光时间和帧持续时间,但没有效果。 只需打开相机应用程序并近距离拍摄 LED 即可观察到相同的效果。 Example

图片右半部分为旧框架,左半部分为新框架。

有没有办法解决这个问题? Android 有摄像头 vsync 吗?

编辑:我将频率更改为 20Hz。

编辑 2:我通过使用 opencv 对图像执行 Canny 边缘检测和标准霍夫线变换使其工作。从霍夫线变换中得到线坐标后,我检查了线是否水平。然后我沿着这条线分割图像,只使用较大的区域进行计算。

【问题讨论】:

  • 从表面上看,您的 LED 比您的录音快两倍。应该反过来。将录制频率设置为 120 FPS。

标签: java android android-camera


【解决方案1】:

卷帘快门效果源于这样一个事实,即配备 CMOS 图像传感器的相机通常会逐行(或逐列)顺序读取像素数据,因此构成一个图像帧的单独行/列不会被捕获同一时间点。

没有“相机垂直同步”,因为卷帘快门是图像传感器构建方式的物理属性。

除了切换到全局快门图像传感器(如 CCD 或一些较新的 CMOS 传感器)之外,您还可以尝试提高相机的快门速度/减少曝光时间以尽量减少问题。

您可以咨询this question,具体了解如何了解相机的可用快门速度。

更新:您可以尝试将相机的快门速度设置为最快设置,然后将 LED 闪烁频率与相机帧速率(1/30 秒)相匹配。这样,LED 的闪烁应该始终在图像采集的同一时间点,并且您应该不会再遇到卷帘快门效果的任何问题。

Update2: 正如 cmets 中所讨论的,您的设置现在看起来像这样工作。您有一个 LED 可以每 50 毫秒更改一次状态(开或关)。您有一台相机,它可以在 50 毫秒的时间内捕获一个场景以生成一张图像。最左边的列是这 50 毫秒的开始,最右边的列是这 50 毫秒的结束(反之亦然,你需要弄清楚)。由于 LED 的 50 ms 周期与相机的 50 ms 捕获时间不同步,因此 LED 的状态变化可能会发生在产生的相机图像的中间,这会将图像在黑暗中分开,并且明亮的一半。

这是随机 LED 序列在图像上的样子:

LED sequence:   ... 0  |  1  |  1  |  0  |  1  |  0  |  0  |  0 ...

Image sequence: ... | 0 1 | 1 1 | 1 0 | 0 1 | 1 0 | 0 0 | 0 0 | ...

管道表示 LED 何时可能改变状态以及图像何时完成一帧捕获。

如图所示,假设频率相同,图像中新旧状态之间的分界将始终保持在同一图像列。您所要做的就是检测线在哪里分割图像(应该可以通过一些计算机视觉实现),然后只查看图像的一半以查看那一半是否发生变化。理想情况下,您应该查看稍后记录的那一半,因为那会为您提供来自 LED 的最新信息。

希望对你有帮助。

【讨论】:

  • 有没有办法告诉 Android 等到传感器读完一帧?或者我是否必须根据智能手机中图像传感器的规格调整快门速度和曝光时间?
  • 再次强调,卷帘快门不是软件设置,而是相机捕捉图像的物理方式。这意味着即使图像以单帧形式呈现,记录单独图像行/列的时间点也不相同。相反,时间分布在整个曝光时间中。
  • 我已经更新了我的答案,建议您如何解决这个问题。
  • 我已经尝试过您的建议,但无济于事。我将帧持续时间设置为 20 Hz,将曝光时间设置为最低设置,并相应地调整了我的 LED 速度。我仍然有同样的效果。两帧相交的线在预览图像中保持在同一位置。每当我重新开始预览时,这条线就在不同的位置。只有有时我没有滚动快门效果。
  • 我不确定我是否完全理解您的设置。我认为它是这样工作的:你有一个以 20hz 闪烁的 LED,所以每 50ms 你的 LED 在接下来的 50ms 内打开或关闭。你的相机有 20hz 的速率,所以它总是捕捉它在 50ms 内看到的任何东西。它与 LED 不同步,并且由于滚动快门,LED 状态变化可能发生在图像中的任意行。如果这是正确的设置,则该线应位于任意位置,具体取决于相机何时打开,但在一个测试用例中保持一致,只要 LED 以开、关模式定期闪烁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多