繁体   English   中英

如何在相机预览中消除滚动快门效果?

[英]How to remove rolling shutter effect in camera preview?

我正在尝试通过拍摄闪烁的 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 近景,即可观察到相同的效果。 例子

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

有没有办法来解决这个问题? Android 有摄像头垂直同步吗?

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

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

卷帘快门效应源于具有 CMOS 图像传感器的相机通常逐行(或逐列)顺序读取像素数据,因此构成一个图像帧的单独行/列不会在同一点捕获及时。

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

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

您可以参考这个问题作为如何找出相机可用快门速度的具体方向。

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

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

以下是随机 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 何时可能更改 state 以及图像何时完成一帧捕获。

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

我希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM