5

python ctypes と libc を使用して、ベンダー提供の DLL ファイルとやり取りしています。DLL ファイルの目的は、カメラから画像を取得することです。

画像取得はエラーなしで実行されているようです。私が抱えている問題は、データへのアクセスです。

画像取得関数は、画像データの引数として ctypes.c_void_p を取ります。

次のように簡略化されます。

"""
typedef struct AvailableData
{
    void* initial_readout;
    int64 readout_count;
} imageData;
"""

class AvailableData(ctypes.Structure):
    _fields_ = [("initial_readout", ctypes.c_void_p), 
                ("readout_count", ctypes.c_longlong)]

"""
Prototype
Acquire(
CamHandle                 camera,
int64                       readout_count,
int                       readout_time_out,
AvailableData*         available,
AcquisitionErrorsMask* errors );
"""

>>> imageData = AvailableData()
>>> Acquire.argtypes = CamHandle, ctypes.c_longlong, ctypes.c_int, 
         ctypes.POINTER(AvailableData), ctypes.POINTER(AcquisitionErrorsMask)
>>> Acquire.restype = ctypes.c_void_p

>>> status = Acquire(camera, readout_count, readout_time_out, imageData, errors)

関数を実行した後、タイプ「long」のように見えるため、関数が何をしているのかを完全には理解していませんimageData.initial_readout(ctypes.c_longではなく、単に「long」です)。ただし、それに関連付けられた値もあります。これは、データが保存されている場所の開始アドレスであると想定しています。

>>> type(imageData.initial_readout)
<type 'long'>
>>> imageData.initial_readout
81002560L

データにアクセスするための私の現在のアプローチは、次のように libc.fopen、libc.fwrite、libc.fclose を使用することです。

>>> libc = ctypes.cdll.msvcrt

>>> fopen = libc.fopen
>>> fwrite = libc.fwrite
>>> fclose = libc.fclose
>>> fopen.argtypes = ctypes.c_char_p, ctypes.c_char_p
>>> fopen.restype = ctypes.c_void_p

>>> fopen.restype = ctypes.c_void_p
>>> fwrite.argtypes = ctypes.c_void_p, ctypes.c_size_t, ctypes.c_size_t, ctypes.c_void_p
>>> fwrite.restype = ctypes.c_size_t

>>> fclose = libc.fclose
>>> fclose.argtypes = ctypes.c_void_p,
>>> fclose.restype = ctypes.c_int

>>> fp = fopen('output3.raw', 'wb')
>>> print 'fwrite returns: ',fwrite(ctypes.c_void_p(imageData.initial_readout), readoutstride.value, 1, fp)
fwrite returns:  0
>>> fclose(fp)

ここでreadoutstride = 2097152、16 ビット ピクセルの 1024x1024 配列に対応します。

ファイル "output3.raw" が Windows エクスプローラーに表示されますが、ファイルが 0 KB であり、(imag ビューアーなどで) 開こうとすると、ファイルが空であると表示されます。

fwrite値0を返すことがわかります(ただし、値1を返す必要があります)

ここで私が間違っていることについて何か考えがあれば、非常に感謝しています。前もって感謝します。

4

1 に答える 1

6

関数の を指定argtypesrestypeます。

import ctypes

libc = ctypes.windll.msvcrt

fopen = libc.fopen
fopen.argtypes = ctypes.c_char_p, ctypes.c_char_p,
fopen.restype = ctypes.c_void_p

fwrite = libc.fwrite
fwrite.argtypes = ctypes.c_void_p, ctypes.c_size_t, ctypes.c_size_t, ctypes.c_void_p
fwrite.restype = ctypes.c_size_t

fclose = libc.fclose
fclose.argtypes = ctypes.c_void_p,
fclose.restype = ctypes.c_int

fp = fopen('output3.raw', 'wb')
fwrite('Hello', 5, 1, fp)
fclose(fp)
于 2013-06-23T05:15:27.930 に答える