1

カメラから画像を取得し、バイナリ データをファイルに書き込む C プログラムがあります。

私は(これまでのところ失敗しています)Cコードを模倣するPythonスクリプトを作成しようとしています。

Python ctypes の例は、ファイルに書き込もうとするまでエラーなしで実行されるようです。つまり、Python では、fwriteこのインスタンスでデータをファイルに書き込むことができません。 ファイルが書き込まれたことを示すfwriteの値を返します。00

だから、私は次のように尋ねています: おそらくメモリ内のバッファにバイナリデータを読み取る外部c関数があるため、Python ctypesのインスタンスが単にこのメモリ位置への読み取りアクセスを持っていない可能性はありますか? その場合、python ctypesがメモリ内の適切な領域にアクセスするために必要なアクセス許可を取得することは可能ですか?

参考までに、(期待どおりに動作する) 単純化された C の例と、それに続く以下の Python ctypes の例を含めました。これは、適切なファイルを開いて作成しますが、書き込みは行いません。

//Data Saving Sample
//The sample will open the first camera attached
//and acquire 3 frames.  The 3 frames will be saved
//in a raw format and can be opened with applications
//such as image-j

#define NUM_FRAMES  3
#define NO_TIMEOUT  -1

#include "stdio.h"
#include "picam.h"
#include <iostream>
using namespace std;

int main()
{

    // The following structure contains the image data
    AvailableData data;

    int readoutstride = 2097152;
    FILE *pFile;


    Acquire( NUM_FRAMES, NO_TIMEOUT, &data, &errors );

    pFile = fopen( "sampleX3.raw", "wb" );
    if( pFile )
    {
        fwrite( data.initial_readout, 1, (NUM_FRAMES*readoutstride), pFile );
        fclose( pFile );
    }

}

そして、ここに私のPythonバージョンがあります:

""" Load the picam.dll """
picamDll = 'DLLs/Picam.dll'
picam = ctypes.cdll.LoadLibrary(picamDll)

libc = ctypes.cdll.msvcrt
fopen = libc.fopen

data = AvailableData()
readoutstride = ctypes.c_int(2097152)

"""
This is the C-structure form from the provided header file, followed by the Python syntax for creating the same structure type
typedef struct AvailableData
{
    void* initial_readout;
    int64 readout_count;
} AvailableData;

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

"""
Simplified C-Prototype for Acquire

Acquire(
int64                       readout_count,
int                       readout_time_out,
AvailableData*         available);
"""
picam.Acquire.argtypes = int64, int, ctypes.POINTER(AvailableData)

picam.Acquire.restype = int

print picam.Acquire( 3, -1, ctypes.byref(data), ctypes.byref(errors))

""" Write contents of Data to binary file """
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_int

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

fp = fopen('PythonBinOutput.raw', 'wb')
print 'fwrite returns: ',fwrite(data.initial_readout, 3*readoutstride.value, 1, fp)
fclose(fp)
4

1 に答える 1