Использование привязки 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. Итак, нам нужно как-то обновить этот файл.

Другие вопросы по тегам