3.6. 场序¶
我们必须区分逐行扫描视频和隔行扫描视频。逐行扫描视频按顺序传输视频图像的所有行。隔行扫描视频将图像分成两个场,分别仅包含图像的奇数行和偶数行。交替传输所谓的奇数场和偶数场,并且由于场之间存在 небольшая задержка,阴极射线电视会交错显示这些行,从而产生原始帧。发明这种奇特的技术是因为在类似于胶片的刷新率下,图像会消失得太快。传输场可以减少闪烁,而无需将帧速率加倍,从而减少每个通道所需的带宽。
重要的是要理解,摄像机不是一次曝光一个帧,而只是将帧分成场进行传输。实际上,这些场是在两个不同的时间点捕获的。屏幕上的物体很可能在一个场和下一个场之间移动。对于分析运动的应用,至关重要的是要识别帧的哪个场较旧,即时间顺序。
当驱动程序逐场而不是隔行提供或接受图像时,应用程序也必须了解这些场如何组合成帧。我们区分顶场(也称为奇数场)和底场(也称为偶数场),即空间顺序:顶场的第一行是隔行扫描帧的第一行,底场的第一行是该帧的第二行。
但是,由于场是一个接一个捕获的,因此争论帧是以顶场还是底场开始是没有意义的。任意两个连续的顶场和底场或底场和顶场都会产生有效的帧。只有当源最初是逐行扫描的,例如,当将胶片传输到视频时,两个场可能来自同一帧,从而创建自然顺序。
与直觉相反,顶场不一定是较旧的场。较旧的场包含顶行还是底行是由视频标准决定的惯例。因此区分场的时序和空间顺序。下面的图表应该可以更清楚地说明这一点。
在V4L中,假设所有摄像机都按照捕获的顺序在媒体总线上发送场,因此,如果首先捕获顶场(是较旧的场),则顶场也首先在总线上发送。
所有视频捕获和输出设备都必须报告当前的场序。某些驱动程序可能允许选择不同的顺序,为此,应用程序在调用 VIDIOC_S_FMT ioctl之前初始化结构体 v4l2_pix_format
的field
字段。如果不需要此操作,则应将其值设为 V4L2_FIELD_ANY
(0)。
3.6.1. enum v4l2_field¶
-
type v4l2_field¶
|
0 |
当任何场格式都可以接受时,应用程序会请求此场序。驱动程序根据硬件功能或例如请求的图像大小进行选择,并返回实际的场序。驱动程序绝不能返回 |
|
1 |
图像采用逐行扫描(基于帧)格式,而不是隔行扫描(基于场)格式。 |
|
2 |
图像仅由顶场(也称为奇数场)组成。 |
|
3 |
图像仅由底场(也称为偶数场)组成。应用程序可能希望阻止设备捕获隔行扫描图像,因为它们在移动物体周围会出现“梳状”或“羽化”伪影。 |
|
4 |
图像包含两个场,逐行交错。场的时序(顶场还是底场较旧)取决于当前的视频标准。在M/NTSC中,底场是较旧的场。在所有其他标准中,顶场是较旧的场。 |
|
5 |
图像包含两个场,顶场线首先存储在内存中,紧随其后的是底场线。场始终按时序顺序存储,较旧的场先存储在内存中。图像大小指的是帧,而不是场。 |
|
6 |
图像包含两个场,底场线首先存储在内存中,紧随其后的是顶场线。场始终按时序顺序存储,较旧的场先存储在内存中。图像大小指的是帧,而不是场。 |
|
7 |
帧的两个场以时间顺序在单独的缓冲区中传递,即较旧的场先传递。为了指示场的奇偶性(当前场是顶场还是底场),驱动程序或应用程序(取决于数据方向)必须将结构体 |
|
8 |
图像包含两个场,逐行交错,顶场在前。顶场是较旧的场。 |
|
9 |
图像包含两个场,逐行交错,顶场在前。底场是较旧的场。 |