我正在为我的博士学位编写一个程序来处理来自高速相机的数据。项目。该相机在 Linux 上带有一个 .so 文件形式的 SDK,用于与相机通信并获取图像。如前所述,它是一种高速摄像机,可提供大量数据(每分钟几 GB)。为了处理如此大量的数据,SDK 有一个非常方便的假脱机功能,它通过 DMA 以 FITS 文件的形式直接将数据假脱机到硬盘驱动器,这是一种在天文学中使用的带有标头的原始二进制格式。当我编写一个小型 C 程序,将 .so 文件链接进去并以这种方式调用假脱机函数时,这个函数可以正常工作。但是当我用 ctypes 包装 .so 文件并从 python 调用函数时,除了 spool 函数之外,所有函数都在工作。当我调用假脱机函数时,它不会返回任何错误,但是假脱机数据文件是乱码,该文件具有正确的格式,但所有帧的一半是 0。在我的世界里,.so 文件中的函数应该根据调用它的程序、我自己的小 C 程序或 python(毕竟只是一个更大的 C 程序)而表现不同是没有意义的。当从不同的程序调用 .so 时,有没有人知道有什么不同?
我会非常感谢任何建议
尽管相机是商用的,但有些驱动程序是 GPL 并且可用,尽管有点复杂。(不幸的是,它似乎不是假脱机功能)我在 python 中有一个用于 Handel 相机的对象。
课程的开头写道:
class Andor:
def __init__(self,handle=100):
#cdll.LoadLibrary("/usr/local/lib/libandor.so")
self.dll = CDLL("/usr/local/lib/libandor.so")
error = self.dll.SetCurrentCamera(c_long(handle))
error = self.dll.Initialize("/usr/local/etc/andor/")
cw = c_int()
ch = c_int()
self.dll.GetDetector(byref(cw), byref(ch))
相关功能如下:
def SetSpool(self, active, method, path, framebuffersize):
error = self.dll.SetSpool(active, method, c_char_p(path), framebuffersize)
self.verbose(ERROR_CODE[error], sys._getframe().f_code.co_name)
return ERROR_CODE[error]
在相应的标题中,它显示:
unsigned int SetSingleTrackHBin(int bin);
unsigned int SetSpool(int active, int method, char * path, int framebuffersize);
unsigned int SetStorageMode(at_32 mode);
unsigned int SetTemperature(int temperature);
让相机运行的代码如下所示:
cam = andor.Andor()
cam.SetReadMode(4)
cam.SetFrameTransferMode(1)
cam.SetShutter(0,1,0,0)
cam.SetSpool(1,5,'/tmp/test.fits',10);
cam.GetStatus()
if cam.status == 'DRV_IDLE':
acquireEvent.clear()
cam.SetAcquisitionMode(3)
cam.SetExposureTime(0.0)
cam.SetNumberKinetics(exposureNumber)
cam.StartAcquisition()