2016-10-30 2 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() 

서버는 인코딩 된 데이터를 수신하고 (즉, I 달성하고자 무엇)을 NumPy와 배열로 다시 디코딩한다.

결국 배열을 이미지로 되돌려 야하지만이 부분에 대한 문제 때문에이 부분까지 도달하지 못했습니다.

나는 또한 배열을 문자열로 바꾸고, pickle로 인코딩 한 다음, 디코드 될 때 보낼 것이다. 이것은 numpy 배열이다. 그러나 그것은 잘 작동하지 않았습니다.

에 ValueError : 문자열의 크기는 그것에게 링크를 수 또는 내 실수를 지적, 내가 도움이 모든 종류의 감사하겠습니다

요소 크기의 배수 여야합니다. 며칠 동안이 작업을 해오 고 있으며이 문제에 도움이 될만한 것을 찾지 못했습니다.

미리 감사드립니다.

+1

나도 몰라 -'FH = 개방 (... "RB")','sendto를 (fh.read ())' – furas

+0

조금 더 설명해 주시겠습니까? sendto() 함수는 어떻게 작동합니까? 저는 실제로 소켓과 그 모든 것들에 대해 새로운 것입니다. 그 이유는 무엇입니까 ^^ –

+0

신경 쓰지 마세요. 무슨 뜻인지는 이제 알지만 메시지가 너무 길어서 작동하지 않습니다. 데이터를 패키지로 분할하여 그렇게 보낼 수있는 방법이 있습니까? 'socket.error : [Errno 90] Message too long' –

답변

1

에 떠 있습니다 당신은 UTF-표에서 찾아 볼 수 있습니다 숯불 음. 대신 단순히 파일의 바이트를 직접 보내십시오. 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가 말해 준 방식으로 이미 해결했습니다 –