首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何消除相机预览中的滚动快门效应?

如何消除相机预览中的滚动快门效应?
EN

Stack Overflow用户
提问于 2019-10-09 13:17:47
回答 1查看 857关注 0票数 0

我正试图通过拍摄一个闪烁的LED将数据发送到我的手机。这在大多数情况下都很好,但是对于某些帧,我在相机预览中得到了一个滚动的快门效果,这会扰乱我的数据传输。有办法消除这种卷动快门效应吗?

我正在与谷歌的cameraAPI2和Nexus 6合作(但我在三星S7上看到了同样的效果)。我记录在20 fps和发光二极管闪烁频率为20赫兹。使用YUV_420_888,我的图像格式为320x240。下面是我当前的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有摄像头vsync吗?

编辑:我把频率改成了20 to。

编辑2:我使用opencv对图像执行Canny边缘检测,然后对图像进行标准Hough线转换。在从Hough线转换中得到线坐标之后,我检查了这条线是否是水平的。然后,我沿着这条线分割图像,只使用较大的面积进行计算。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-09 13:51:39

滚动快门效应产生于这样一个事实,即带有CMOS图像传感器的相机最常顺序地、逐行(或逐列)读出像素数据,因此组成一个图像帧的单独行/列不能在同一时间点被捕获。

没有“相机vsync”,因为滚动快门是如何构建图像传感器的物理属性。

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

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

更新:您可以尝试的是将相机的快门速度设置为最快的设置,然后将您的LED闪烁频率与您的相机帧速率(1/30)相匹配。这样,LED的闪烁应该总是在同一时间点的图像采集,你不应该得到任何问题的滚动快门效果了。

Update2:,如注释中所讨论的,您的设置现在似乎是这样工作的。你有一个LED,可以改变它的状态(打开或关闭)每50毫秒。你有一个相机,在50毫秒的过程中捕捉一个场景,以产生一幅图像。最左边的列在这50毫秒的开头,最右边的列在这50毫秒的末尾(反之亦然,你需要弄清楚)。由于LED的50毫秒周期与相机的50毫秒捕获时间不同步,所以在所产生的相机图像的中间可能会发生发光二极管的状态变化,这在黑暗和明亮的一半中将图像分割开来。

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

代码语言:javascript
复制
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。

我希望这能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58305079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档