gpt4 book ai didi

linux - V4L2 帧上的系统偏移

转载 作者:太空狗 更新时间:2023-10-29 12:11:57 26 4
gpt4 key购买 nike

我正在使用 V4L2 API 从 UVC 设备抓取帧。我想通过计算帧的时间戳和当前时钟时间之间的偏移量来测量曝光时间。这是我正在使用的代码:

/* Control code snipped */
struct v4l2_buffer buf = {0}
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
ioctl(fd, VIDIOC_DQBUF, &buf);

switch( buf.flags & V4L2_BUF_FLAG_TIMESTAMP_MASK )
{
case V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC:
{
struct timespec uptime = {0};
clock_gettime(CLOCK_MONOTONIC,&uptime);

float const secs =
(buf.timestamp.tv_sec - uptime.tv_sec) +
(buf.timestamp.tv_usec - uptime.tv_nsec/1000.0f)/1000.0f;

if( V4L2_BUF_FLAG_TSTAMP_SRC_SOE == (buf.flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK) )
printf("%s: frame exposure started %.03f seconds ago\n",__FUNCTION__,-secs);
else if( V4L2_BUF_FLAG_TSTAMP_SRC_EOF == (buf.flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK) )
printf("%s: frame finished capturing %.03f seconds ago\n",__FUNCTION__,-secs);
else printf("%s: unsupported timestamp in frame\n",__FUNCTION__);

break;
}

case V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN:
case V4L2_BUF_FLAG_TIMESTAMP_COPY:
default:
printf("%s: no usable timestamp found in frame\n",__FUNCTION__);
}

使用 VIDIOC_S_CTRL 设置的 1 秒曝光时间返回的示例:

read_frame: frame exposure started 28.892 seconds ago
read_frame: frame exposure started 28.944 seconds ago
read_frame: frame exposure started 28.895 seconds ago
read_frame: frame exposure started 29.037 seconds ago

我在 SRC_SOE 时间戳和单调时钟之间得到了奇怪的 30 秒偏移,焊接了 1 秒曝光。V4L2/UVC 时间戳应该是从ktime_get_ts() 的结果。知道我做错了什么吗?

这在 Linux 4.4 Gentoo 系统上运行。网络摄像头是 DMK21AU04.AS,被认为是标准的 UVC 设备。

最佳答案

事情是...

1 秒 = 1000 毫秒,
1 毫秒 = 1000 微秒,
1 微秒 = 1000 纳秒。

所以...

它应该像...

float const secs =
(buf.timestamp.tv_sec - uptime.tv_sec) +
(buf.timestamp.tv_usec - uptime.tv_nsec/1000.0f)/1000000.0f;

关于linux - V4L2 帧上的系统偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40334608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com