Использование привязки python для flycapture для получения цветного изображения
Я работаю с CMLN-13S2C-CS CCD
камера от PointGrey Systems. Он использует FlyCapture API для захвата изображений. Я хотел бы получить эти изображения и сделать с ними что-то в OpenCV, используя python.
Мне известно о следующей привязке Python: pyflycapture2. С помощью этой привязки я могу получить изображения. Однако я не могу получить изображения в цвете, что должна делать камера.
Видеомод и частота кадров, с которыми может справиться камера, VIDEOMODE_1280x960Y8
, а также FRAMERATE_15
соответственно. Я думаю, что это как-то связано с pixel_format
что я думаю должно быть raw8
,
Может ли кто-нибудь получить цветное изображение, используя эту или любую существующую привязку Python для flycapture? Обратите внимание, что я работаю над Linux.
2 ответа
Вам не нужно использовать предопределенные режимы. Context
класс имеет set_format7_configuration(mode, x_offset, y_offset, width, height, pixel_format)
метод, с помощью которого вы можете использовать свои пользовательские настройки. Используя это, вы можете, по крайней мере, изменить разрешение захваченного изображения. Пример использования:
c.set_format7_configuration(fc2.MODE_0, 320, 240, 1280, 720, fc2.PIXEL_FORMAT_MONO8)
Что касается вопроса окраски. Мне до сих пор удалось получить цветное изображение, используя PIXEL_FORMAT_RGB8
и модифицирование Image
класс в flycapture2.pyx
следующее:
def __array__(self):
cdef np.ndarray r
cdef np.npy_intp shape[3] # From 2 to 3
cdef np.dtype dtype
numberofdimensions = 2 # New variable
if self.img.format == PIXEL_FORMAT_MONO8:
dtype = np.dtype("uint8")
elif self.img.format == PIXEL_FORMAT_MONO16:
dtype = np.dtype("uint16")
elif self.img.format == PIXEL_FORMAT_RGB8: # New condition
dtype = np.dtype("uint8")
numberofdimensions = 3
shape[2] = 3
else:
dtype = np.dtype("uint8")
Py_INCREF(dtype)
shape[0] = self.img.rows
shape[1] = self.img.cols
# nd value (numberofdimensions) was always 2; stride set to NULL
r = PyArray_NewFromDescr(np.ndarray, dtype,
numberofdimensions, shape, NULL,
self.img.pData, np.NPY_DEFAULT, None)
r.base = <PyObject *>self
Py_INCREF(self)
return r
Этот код, скорее всего, не безупречен (т.е. я удалил stride
материал) по той простой причине, что у меня почти нет опыта работы с C и Cython, но таким образом мне по крайней мере удалось получить цветную рамку (сейчас в процессе попытки получить PIXEL_FORMAT_RAW8
за работой).
И просто как напоминание: flycapture2.pyx
это файл Cython, поэтому вам нужно перекомпилировать его, прежде чем вы сможете его использовать (я просто снова запускаю скрипт установки pyflycap2).
Я использую ту же камеру с Matlab, а также получил проблемы с форматом "raw8". Итак, я выбрал "rgb8", а именно "F7_RGB_644x482_Mode1", и все начинает работать (не уверен, как это должно выглядеть на Python).
PS На данный момент я пытаюсь начать работу с Python и pyflycapture2, давайте посмотрим, смогу ли я найти обходной путь.
UPD: Хорошо, теперь я все знаю.:) Ваши (и мои) причины проблемы скрыты внутри самого pyflycapture2, особенно в определении класса "Image". Вы можете посмотреть здесь: https://github.com/jordens/pyflycapture2/blob/eec14acd761e89d8e63a0961174e7f5900180d54/src/flycapture2.pyx
if self.img.format == PIXEL_FORMAT_MONO8:
dtype = np.dtype("uint8")
stride[1] = 1
elif self.img.format == PIXEL_FORMAT_MONO16:
dtype = np.dtype("uint16")
stride[1] = 2
else:
dtype = np.dtype("uint8")
stride[1] = self.img.stride/self.img.cols
ЛЮБОЕ изображение будет преобразовано в оттенки серого, даже если изначально оно было RGB. Итак, нам нужно как-то обновить этот файл.