使用python绑定flycapture来检索彩色图像

时间:2015-09-29 21:09:39

标签: python opencv flycapture

我正在使用PointGrey Systems的CMLN-13S2C-CS CCD相机。它使用FlyCapture API来抓取图像。我想抓住这些图像并使用python在OpenCV中做一些事情。

我知道以下python绑定:pyflycapture2。通过这种绑定,我可以检索图像。但是,我无法检索彩色图像,这是相机应该能够做到的。

相机能够处理的视频模式和帧速率分别为VIDEOMODE_1280x960Y8FRAMERATE_15。我认为它与pixel_format有关,我认为应该是raw8

有人能够使用这个或任何现有的python绑定来检索彩色图像吗?请注意,我正在使用Linux。

2 个答案:

答案 0 :(得分:0)

您无需使用预定义模式。 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安装脚本)。

答案 1 :(得分:-1)

我正在使用与Matlab相同的相机,并且还遇到了“raw8”格式的问题。所以,我选择了“rgb8”,特别是“F7_RGB_644x482_Mode1”,所有东西都开始工作了(不确定,它应该如何看待Python)。

P.S。目前我正在努力开始使用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。所以,我们需要以某种方式更新该文件。