Подтвердить что ты не робот

OpenCV (через python) в Linux: установить ширину/высоту кадра?

Я использую openCV через python на linux (ubuntu 12.04), и у меня есть logitech c920, из которого я хотел бы захватить изображения. Сыр способен захватывать рамки до действительно высокого разрешения, но всякий раз, когда я пытаюсь использовать openCV, я получаю только изображения 640x480. Я пробовал:

import cv
cam = cv.CaptureFromCAM(-1)
cv.SetCaptureProperty(cam,cv.CV_CAP_PROP_FRAME_WIDTH,1920)
cv.SetCaptureProperty(cam,cv.CV_CAP_PROP_FRAME_WIDTH,1080)

но это дает результат "0" после каждой из двух последних строк, и когда я впоследствии захвачу кадр через:

image = cv.QueryFrame(cam)

Результирующее изображение остается 640x480.

Я попытался установить, что похоже на связанные инструменты через (за пределами python):

sudo apt-get install libv4l-dev v4l-utils qv4l2 v4l2ucp

и я действительно могу манипулировать настройками камеры (опять же, вне python) с помощью:

v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1
v4l2-ctl --set-parm=30

и заметим, что:

v4l2-ctl -V

действительно предполагает, что что-то изменилось:

Format Video Capture:
    Width/Height   : 1920/1080
    Pixel Format   : 'H264'
    Field          : None
    Bytes per Line : 3840
    Size Image     : 4147200
    Colorspace     : sRGB

Но когда я вхожу в оболочку python, приведенный выше код ведет себя точно так же, как и раньше (нули печати при попытке установить свойства и получить изображение размером 640x480).

Возможность поднять разрешение захвата довольно важна для меня, поэтому я бы очень признателен за любые указатели, которые любой может предоставить.

4b9b3361

Ответ 1

Из документы,

Функция cvSetCaptureProperty устанавливает указанное свойство захвата видео. В настоящее время функция поддерживает только видео файлы: CV_CAP_PROP_POS_MSEC, CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIO.

NB Эта функция в настоящее время ничего не делает при использовании последней загрузки CVS на Linux с FFMPEG (содержимое функции скрыто, если используется и возвращается 0).

Ответ 2

У меня была такая же проблема, как и вы. Закончился переход в исходный код OpenCV и изменение параметров по умолчанию в modules/highgui/src/cap_v4l.cpp, строках 245-246 и перестройке проекта.

#define DEFAULT_V4L_WIDTH  1920
#define DEFAULT_V4L_HEIGHT 1080

Это для OpenCV 2.4.8

Ответ 3

Кажется, он изменен кеммерой.

AFIK, камеры Logitech имеют особенно плохую поддержку linux (хотя это стало лучше). Большинство их проблем связаны с расширенными функциями, такими как управление фокусом. я бы посоветовал придерживаться основных камер (IE ручной фокус Logitech камеры), чтобы играть в нее безопасно.

У моей встроенной камеры для ноутбука нет проблем и отображается при нормальном разрешении.
У моего внешнего пользователя logitech есть проблемы с активацией.

Однако я могу преодолеть проблему разрешения с этими двумя строками.

Да, они такие же, как и вы.

cv.SetCaptureProperty(self.capture,cv.CV_CAP_PROP_FRAME_WIDTH, 1280)
cv.SetCaptureProperty(self.capture,cv.CV_CAP_PROP_FRAME_HEIGHT, 720)

Мой Logitech по-прежнему вызывает ошибки, но разрешение в порядке.

Пожалуйста, убедитесь, что установленное вами разрешение поддерживается вашей камерой, или v4l будет кричать на вас. Если я установил неподдерживаемое собственное разрешение, у меня нулевой успех.

Ответ 4

Не уверен, что он работает, но вы можете попытаться заставить параметры к своим значениям после создания объекта камеры:

import cv
cam = cv.CaptureFromCAM(-1)

os.system("v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1") 
os.system("v4l2-ctl --set-parm=30")

image = cv.QueryFrame(cam)

Это немного взломано, поэтому ожидайте сбой.

Ответ 5

    ## Sets up the camera to capture video
cap = cv2.VideoCapture(device)

width = 1280, height = 720

#set the width and height
cap.set(3,width)
cap.set(4,height)

Ответ 6

OpenCV автоматически выбирает первый доступный бэкэнд захвата (см. Здесь). Может случиться так, что он не использует V4L2 автоматически.

Также установите -D WITH_V4L=ON и -D WITH_LIBV4L=ON при сборке.

Чтобы установить используемый формат пикселя, установите свойство CAP_PROP_FOURCC захвата:

  capture = cv2.VideoCapture(self.cam_id, cv2.CAP_V4L2)
  scapture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
  width = 1920
  height = 1080
  capture.set(cv2.CAP_PROP_FRAME_WIDTH, width)
  capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height)