我正在使用ctypes访问National Instruments(NI-IMAQ)的图像获取API。在其中,有一个imgBayerColorDecode()我正在使用的imgSnap()函数,该函数用于从该函数返回的Bayer编码图像上。我想将解码后的输出(即RGB图像)与我将基于原始数据创建的一些numpy ndarray进行比较,这是imgSnap返回的内容。但是,有两个问题。第一个很简单:将imgSnap返回的imgbuffer传递到numpy数组中。现在首先要注意一个问题:如果您的计算机是64位的,并且具有超过3GB的RAM,则无法使用numpy创建数组并将其作为指向imgSnap的指针传递。这就是为什么您必须实施一种解决方法,在NI的论坛上进行了介绍(NI ref-前2个帖子):禁用错误消息(以下代码中的第125行:),imaq.niimaquDisable32bitPhysMemLimitEnforcement并确保创建内存的是IMAQ库图片(imaq.imgCreateBuffer)必需。在那之后,这样的食谱应该能够再次将缓冲区转换为numpy数组。但是我不确定是否对数据类型进行了正确的更改:相机具有1020x1368像素,每个像素强度的记录精度均为10位。它通过CameraLink返回图像,我假设它以每个像素2个字节的方式进行处理,以便于数据传输。这是否意味着我必须调整另一个SO问题中给出的配方:buffer = numpy.core.multiarray.int_asbuffer(ctypes.addressof(y.contents), 8*array_length)a = numpy.frombuffer(buffer, float)对此:bufsize = 1020*1368*2buffer = numpy.core.multiarray.int_asbuffer(ctypes.addressof(y.contents), bufsize)a = numpy.frombuffer(buffer, numpy.int16)第二个问题是imgBayerColorDecode()没有给我期望的输出。以下是2张图片,第一张是imgSnap的输出,保存为imgSessionSaveBufferEx()。第二个是imgSnap的去马赛克化imgBayerColorDecode()之后的输出。原始数据:i42.tinypic.com/znpr38.jpg拜耳解码:i39.tinypic.com/n12nmq.jpg如您所见,拜耳解码后的图像仍然是灰度图像,而且它与原始图像不一样(这里的小注释,图像已缩放以使用imagemagick上传)。原始图像是在某个蒙版之前使用红色滤色镜拍摄的。从它(和其他2个滤色器)中,我知道Bayer滤色器在左上角看起来像这样:BGBGGRGR我相信我在将正确类型的指针传递给imgBayerDecode时做错了
2 回答

慕村225694
TA贡献1880条经验 获得超4个赞
经过一番摸索之后,事实证明,提到的RGBbuffer必须保存正确的数据,但是imgSessionSaveBufferEx
在这一点上做得有些奇怪。
当我将数据从RGBbuffer传递回numpy时,将此1D数组重塑为图像的尺寸,然后通过遮罩和使用bitshift操作(例如red_channel = (np_RGB & 0XFF000000)>>16
)将其分成彩色通道,然后可以将其保存为一个漂亮的彩色图像PIL或pypng的png格式。
我还没有找到为什么imgSessionSaveBufferEx表现奇怪的原因,但是上述解决方案有效(即使在速度方面它确实效率不高)。
添加回答
举报
0/150
提交
取消