linux — Установка частоты кадров на веб-камере Logitech C210 в C ++ на Raspberry pi с использованием v4l2

У меня есть несколько веб-камер, подключенных к моей Raspberry Pi, и я снимаю изображения с помощью OpenCV. Однако, даже если камеры не движутся, изображения выглядят довольно шатко. Когда я запускаю только одну камеру, этого не происходит, поэтому я думаю, что это проблема пропускной способности USB. Чтобы уменьшить пропускную способность, я начинаю с попытки уменьшить частоту кадров. Logitech C210 должен поддерживать частоту кадров 5,10,15,20,25 и 30 кадров в секунду.

Так что я просматривал документацию по v4l2, так как кажется, что OpenCV использует эту библиотеку в любом случае (хотя и не очень хорошо). Я использую v4l2_ioctl() без проблем установить управление камерой. По некоторым причинам я не смог установить частоту кадров подобным образом. Вот что я делаю, следуя документации Вот:.

int descriptor = v4l2_open("/dev/video0", O_RDWR);
v4l2_captureparm s;
s.capability = V4L2_CAP_TIMEPERFRAME;
s.timeperframe.numerator = 1;
s.timeperframe.denominator = 5;
if( v4l2_ioctl(descriptor, VIDIOC_S_PARM, &s) !=0 )
{
cout<< "Failed to set frame rate "<<endl;
}

У меня нет проблем с компиляцией, но я получаю скрытое сообщение об ошибке, указывающее, что значение не было успешно установлено.

У кого-нибудь есть идеи, что я делаю не так?

Заранее спасибо!

1

Решение

Вы используете неправильную структуру. Y0u следует использовать

struct v4l2_streamparm

вместо

struct v4l2_captureparm

Сначала проверьте, поддерживает ли ваша камера эти частоты кадров для желаемого разрешения и формата пикселей:

v4l2-ctl --list-formats-ext

Затем вам нужно установить разрешение и формат пикселя. Например:

struct v4l2_format fmt;
meset(&fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width       = 1280;
fmt.fmt.pix.height      = 720;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
fmt.fmt.pix.field       = V4L2_FIELD_NONE;

if (v4l2_ioctl(m_fd, VIDIOC_S_FMT, &fmt) != 0)
{
// Error
}

В идеале номинатор и знаменатель следует выбирать из перечисленных в устройстве. Также вы должны получить структуру v4l2_streamparm:

struct v4l2_streamparm streamparm;
memset(&streamparm, 0, sizeof(streamparm));
streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (v4l2_ioctl(m_fd, VIDIOC_G_PARM, &streamparm) != 0)
{
// Error
}

streamparm.parm.capture.capturemode |= V4L2_CAP_TIMEPERFRAME;
streamparm.timeperframe.numerator = X;
streamparm.timeperframe.denominator = y;
if(v4l2_ioctl(descriptor,VIDEO_S_PARM, &s) !=0)
{
cout<< "Failed to set frame rate "<<endl;
}
2

Другие решения

Также убедитесь, что у вас нет проблем с питанием этих веб-камер. Пи не может обеспечить большую мощность от своих портов USB, и что-то вроде ключа Wi-Fi (боже, я ненавижу это слово) может конкурировать за мощность, и я видел плохие картинки в результате раньше … Может быть, концентратор с питанием, совместимый с RPi то есть тот, который не имеет подключения 5v к Pi. Купите рекомендованный RPI концентратор.

1

По вопросам рекламы [email protected]