2017-01-06 5 views
0

生画像データ、つまりuint16配列をシリアル化し、zmqを使用してPythonに送りたいとします。私はmsgPack-cを使うと考えられていますが、私が見つけた唯一の方法はHow do I unpack and extract data properly using msgpack-c?というようなものでした。Cで生画像バッファー(rgbピクセル)をシリアライズし、Pythonで非直列化

私はこのアプローチに従えば、Cアレイの各要素を個別にパックする必要があり、非常に遅くなります。

誰かが正しい方向を指してくれたでしょうか。

+0

、あなたはmsgpack_pack_binとmsgpack_pack_bin_bodyを使用することができます。 https://github.com/msgpack/msgpack-c/wiki/v2_0_c_overviewを参照してください。 –

答えて

1

uint16_t配列をそのままc側から送信し、​​モジュールを使用してPythonコードでアクセスできます。

送信するCコード:

#include <stdint.h> 
#include <stdio.h> 
#include <zmq.h> 

#define IMAGE_SIZE (256 * 256) 

unsigned checksum(uint16_t* data, int len) { 
    unsigned s = 0; 
    for (int i = 0; i < len; ++i) { 
     s += data[i]; 
    } 
    return s; 
} 

int main() { 
    uint16_t image[IMAGE_SIZE]; 
    printf("image checksum: %i\n", checksum(image, IMAGE_SIZE)); 

    void* context = zmq_ctx_new(); 
    void* push = zmq_socket(context, ZMQ_PUSH); 
    zmq_connect(push, "tcp://127.0.0.1:5555"); 
    zmq_send(push, image, IMAGE_SIZE * sizeof(uint16_t), 0); 
    zmq_close(push); 
    zmq_ctx_destroy(context); 
    return 0; 
} 

受信Pythonのコードは:あなたはバイト配列として生の画像データを扱うことができる場合

from ctypes import c_uint16 
import zmq 

IMAGE_SIZE = 256 * 256 
Image = c_uint16 * IMAGE_SIZE # corresponds to uint16_t[IMAGE_SIZE] 

context = zmq.Context(1) 
pull = zmq.Socket(context, zmq.PULL) 
pull.bind("tcp://127.0.0.1:5555") 
message = pull.recv() 

image = Image.from_buffer_copy(message) 

# This should print the same number as the sending code 
# Note that it is different from sum(message) 
print(sum(image)) 
関連する問題