1
V4L2 API를 사용하여 UVC 장치에서 프레임을 잡아냅니다. 프레임의 타임 스탬프와 현재 시계 시간 사이의 오프셋을 계산하여 노출 시간을 측정하고 싶습니다.V4L2 프레임의 체계적인 오프셋
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
내가 이상한 30 초 사이에 오프셋 받고 있어요 :이 VIDIOC_S_CTRL
1 개 번째 세트의 노출 시간에 대한 반환 무엇
/* 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__);
}
예 : 이것은 내가 사용하고 코드입니다 SRC_SOE
시간 소인 및 단조로운 시계, 1 초 노출 용접. V4L2/UVC 시간 소인은 ktime_get_ts()
의 결과로 계산됩니다. 내가 뭘 잘못하고 있는거야?
이것은 Linux 4.4 Gentoo 시스템에서 실행됩니다. 웹캠은 표준 UVC 장치로 인식되는 DMK21AU04.AS입니다.
과 실제로 코드가 –
이 ... 나에게 매우 도움이 될 내가 할 수 밝혀, 당신에게 @TallFurryMan 감사합니다 내가 그것을 보지 않고 오랫동안 대답을 꼼짝 않고 바라 보았다고 생각하지 않는다. :) – TallFurryMan