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