我正在使用PointGrey Systems的CMLN-13S2C-CS CCD
相机。它使用FlyCapture API来抓取图像。我想抓住这些图像并使用python在OpenCV中做一些事情。
我知道以下python绑定:pyflycapture2。通过这种绑定,我可以检索图像。但是,我无法检索彩色图像,这是相机应该能够做到的。
相机能够处理的视频模式和帧速率分别为VIDEOMODE_1280x960Y8
和FRAMERATE_15
。我认为它与pixel_format
有关,我认为应该是raw8
。
有人能够使用这个或任何现有的python绑定来检索彩色图像吗?请注意,我正在使用Linux。
答案 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。所以,我们需要以某种方式更新该文件。