2014-09-29 5 views
1

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

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

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; 
} 

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

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

Заранее благодарен!

ответ

2

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

struct v4l2_streamparm 

вместо

struct v4l2_captureparm 

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

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; 
} 
1

быть также уверен, чтобы проверить вас Арент возникли проблемы, питающие эти веб-камеры. Pi cant обеспечивает большую мощность от своих USB-портов и что-то вроде wifi-ключа (бог, я ненавижу это слово), может конкурировать за власть, и я видел плохие фотографии в результате до ... Возможно, мощный концентратор, совместимый с RPi , т.е. тот, у которого нет 5v-соединения с Pi. Покупайте рекомендованный rpi концентратор.