我正试图通过拍摄一个闪烁的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线转换中得到线坐标之后,我检查了这条线是否是水平的。然后,我沿着这条线分割图像,只使用较大的面积进行计算。
发布于 2019-10-09 13:51:39
滚动快门效应产生于这样一个事实,即带有CMOS图像传感器的相机最常顺序地、逐行(或逐列)读出像素数据,因此组成一个图像帧的单独行/列不能在同一时间点被捕获。
没有“相机vsync”,因为滚动快门是如何构建图像传感器的物理属性。
除了切换到全局快门图像传感器(如CCD或一些较新的CMOS传感器)之外,您还可以尝试增加快门速度/减少相机的曝光时间,以尽量减少问题。
您可以参考这个问题作为一个具体的方向,如何找到可用的快门速度为您的相机。
更新:您可以尝试的是将相机的快门速度设置为最快的设置,然后将您的LED闪烁频率与您的相机帧速率(1/30)相匹配。这样,LED的闪烁应该总是在同一时间点的图像采集,你不应该得到任何问题的滚动快门效果了。
Update2:,如注释中所讨论的,您的设置现在似乎是这样工作的。你有一个LED,可以改变它的状态(打开或关闭)每50毫秒。你有一个相机,在50毫秒的过程中捕捉一个场景,以产生一幅图像。最左边的列在这50毫秒的开头,最右边的列在这50毫秒的末尾(反之亦然,你需要弄清楚)。由于LED的50毫秒周期与相机的50毫秒捕获时间不同步,所以在所产生的相机图像的中间可能会发生发光二极管的状态变化,这在黑暗和明亮的一半中将图像分割开来。
以下是随机的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。
我希望这能帮上忙。
https://stackoverflow.com/questions/58305079
复制相似问题