2016-10-30 10 views
1

まずは、私がしたいこと: 私のラズベリーパイからソケット付き写真をラップトップに送信しています。ソケットを介してnumpy配列を送信

クライアント:私は写真をアップロードしてnumpyの配列にそれを回す :ここに何が起こる

#!/usr/bin/python 

import socket 
import cv2 
import numpy as np 
import pickle 

#Upload image 
img = cv2.imread('/path/to/image', 0) 

#Turn image into numpy-array 
arr = np.asarray(img) 

#Receiver ip 
ip = "XXX.XXX.X.XXX" 

#Set up socket and stuff 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

#Loop through each array (5 for test) 
for each in range(5): 

    #Encode each array 
    msg = pickle.dumps(arr[each][0]) 

    #Send msg to ip with port 
    s.sendto(msg, (ip, 50000)) 

s.close() 

。次に、配列の各行(各リスト)を取り出し、pickleで「エンコード」して、後でSocket経由で送信します。すべてがこの時点までうまく動作します。

サーバー:

#!/usr/bin/python 

import socket 
import numpy as np 
import cPickle as pickle 

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

s.bind(("", 50000)) 

while True: 
    data, addr = s.recvfrom(4096) 
    conv = pickle.loads(data) 
    print conv 
    #print np.fromstring(conv,dtype=int) 
s.close() 

サーバーは、エンコードされたデータを受信し、(それは私が達成したいものだ)numpyの配列に戻ってそれをデコードします。

最後に、アレイをイメージに戻すはずですが、私はこの時点で問題があるため、その部分には到達しませんでした。

私はまた、配列を最初に文字列に変換しようとしましたが、pickleでエンコードしてからデコードすると、numpyの配列になります。しかし、それはうまくいきませんでした。

とValueError:文字列のサイズが

要素サイズの倍数でなければならない私は、ヘルプの任意の種類をいただければ幸いそれがリンクであるか、私のミスを指摘。 これについて何日も作業しており、この問題で私を助けてくれるものは見つかりませんでした。

ありがとうございます。

+1

あなたがバイトとして直接画像を送信しない理由を私は知らない - 'FH =オープン(... "RB")'、 'のsendto(fh.read( )) ' – furas

+0

もう少し説明できますか? sendto()関数はどのように機能しますか? 私は実際にソケットとそのすべてのもののためにかなり新しいです^^ –

+0

あなたは何を意味するのか分かりましたが、メッセージが長すぎて動作しません。データをパッケージに分割して送信する方法はありますか? 'socket.error:[Errno 90] Message too long' –

答えて

1

に浮くことができますがUTF-テーブルに

を調べることができますchar型それのためにumPy。代わりに、単にファイルのバイトを直接送信してください。 Python 3.5をお持ちの場合は、socket.sendfile()を使用することもできます。詳細については

参照:Sending a file over TCP sockets in Python

+0

ありがとう、しかし私はすでにそれがfurasが私に言った方法を解決しました。 –

0

は私が

def retrieve_and_decode_data(): 
    try: 
     data,addr = s.recvfrom(4096)                                             
     list_of_converted_utf16chars = (repr(data.decode('utf-16')).split("\\")[1:]) 

    except (ValueError, IndexError) as e: 
     **perform some conversion-error exception...** 

「のrepr」をお送りあなたが必要とするどのように多くの小数点以下の桁を知っていますがUTF16であなたのnumpyの配列の値をエンコードすることができBEと、ソケットの後にデコードいけない機能を使用すると、UTF16の表現を与えますあなたがOpenCVのとNを必要としないあなたがint型にこの表現を変換したり、

integer_value = int(list_of_converted_utf16chars[index], 16) 
+0

ありがとうございます、しかし、私はfurasが私に言ったようにそれを既に解決しました –

関連する問題