2013-02-23 2 views

ответ

9

Это старый вопрос, но я хочу добавить к нему решение.

opencv вызывает базовые методы v4l для запроса кадров, установки/получения свойств камеры и т. Д. И проблема в том, что вызовы не завершены. Также по какой-то причине библиотека вызывает v4l-методы вместо v4l2. Аналогичная проблема here. Кажется, он решается путем модификации кода opencv.

Я также проверил, может ли opencv установить свойство, поддерживаемое в «v4l2», например «ручной экспозиции» или «автоприоритет экспозиции». Это не могло. Я играл вокруг v4l2, чтобы решить эту проблему:

#include <libv4l2.h> 
#include <linux/videodev2.h> 
#include <sys/ioctl.h> 
#include <fcntl.h> 

// open capture 
int descriptor = v4l2_open("/dev/video0", O_RDWR); 

// manual exposure control 
v4l2_control c; 
c.id = V4L2_CID_EXPOSURE_AUTO; 
c.value = V4L2_EXPOSURE_MANUAL; 
if(v4l2_ioctl(descriptor, VIDIOC_S_CTRL, &c) == 0) 
    cout << "success"; 

// auto priority control 
c.id = V4L2_CID_EXPOSURE_AUTO_PRIORITY; 
c.value = 0; 
if(v4l2_ioctl(descriptor, VIDIOC_S_CTRL, &c) == 0) 
    cout << "success"; 

Затем вы можете работать с opencv.

Полный список элементов управления камерой - here.

+0

просто любопытно, эти настройки устойчивы? – berak

+1

Да, пока вы не перезагрузите компьютер или не подключите веб-камеру – baci

+0

ah, ok. Спасибо за разъяснения. – berak

2

так, есть ваш VideoCapture:

VideoCapture cap(0); 

теперь вы можете попробовать установить или получить свойства:

//may work or not, highly driver/impl specific. 
cap.set(CV_CAP_PROP_AUTO_EXPOSURE, 0); 
double exposure = cap.get(CV_CAP_PROP_AUTO_EXPOSURE); 

иногда вы даже можете Acces драйверов таким образом CONFIG диалог:

cap.set(CV_CAP_PROP_SETTINGS , 1); 

Эти константы находятся в highgui_c.h, вокруг l 333

+0

Таким образом, если функция не возвращает никаких ошибок, но dosn't работу, это значит операция не поддерживается на веб-камеры? Есть ли какое-то возвращаемое значение, чем может сообщить мне, что операция не удалась? –

+0

это, вероятно, просто не реализовано. и, к сожалению, никоим образом не выяснять, кроме «сработанных» или нет. но, поскольку эти настройки хранятся в драйвере в большинстве случаев, вы можете попытаться использовать другие программы для доступа к своей кулачке (vlc !!) и попытаться установить ее там – berak

+0

У меня также возникла идея использовать другие приложения для настройки камеры , но я делаю программу для компании, которая не хочет использовать стороннее (загруженное) программное обеспечение. Поэтому мое приложение должно интегрировать все функции. –

0

Вы можете использовать API OpenCV для этого, используя VideoCapture::Set(). Вот пример того, как установить экспозицию вручную в Python:

import cv2 

cap = cv2.VideoCapture(0) 
cap.set(cv2.CAP_PROP_EXPOSURE,-4) 

while(True): 
    ret, frame = cap.read() 

    cv2.imshow('frame',frame) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

cap.release() 
cv2.destroyAllWindows() 

Вот ноты у меня о времени экспозиции для каждого кадра. Хотя я считаю, что они специфичны для камеры, они дают вам хорошую идею.

 
-1 640 ms 
-2 320 ms 
-3 160 ms 
-4 80 ms 
-5 40 ms 
-6 20 ms 
-7 10 ms 
-8 5 ms 
-9 2.5 ms 
-10 1.25 ms 
-11 650 µs 
-12 312 µs 
-13 150 µs 

У этой функции есть настройки для GAIN и многих других значений, хотя я их не пробовал.

Немного более подробное обсуждение в
Setting Manual Exposure in OpenCV

Смежные вопросы