2015-05-17 66 views
2

我知道這個問題已經出現了幾次,我讀了所有的內容(我希望...)但是在我的程序中,我無法在通過套接字發送它之後顯示圖像不管我嘗試什麼。通過插座發送攝像頭反饋

我在服務器端

這裏使用Python 2.7的客戶端和Python 3.4的代碼是:

服務器:

pygame.init() 
pygame.camera.init() 
cam = pygame.camera.Camera("/dev/video0",(640,480),'RGB') 
cam.start() 

host='192.168.0.11' 
port=8080 

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
s.connect((host,port)) 

image = cam.get_raw() 
data_64 = base64.b64encode(image) 
data_utf = data_64.decode('utf-8') 

print (data_utf) 
print (len(data_utf)) 

s.sendall(data_utf) 
s.close 

客戶:

host='192.168.0.11' 
port=8080 

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(1) 
conn, addr = s.accept() 

string = '' 

while True: 
    d = conn.recv(640*480) 

    if not d: 
     break 

    else: 
     d = d.decode('UTF-8') 
     string += d 

print (string) 
print (len(string)) 

fh = open("imageToSave.jpeg", "wb") 
fh.write(string) 
fh.close() 

在最後,我嘗試了不同的格式(.png,.gif等),但沒有一個會顯示我一張acutal圖片。該程序創建一個包含數據的圖像文件,但無法打開或看到圖片。

根據打印和len(),兩個字符串都是相等的。長度是819200.所以看起來轉移是正確的,因爲它是相同的字符串。問題是如何從字符串中獲得圖片?

我的計劃是將攝像頭流送入Tkinter GUI。

我也試着像 pygame.image.tostring(圖像, 「RGB」) 在服務器端和 pygame.image.fromstring東西(字符串,(640,480), 「RGB」) 但在這裏我總是得到無論我嘗試什麼,「ValueError:字符串長度不等於格式和分辨率大小」。

我對Python很新,所以也許我做了一些有點複雜的事情。有人能指出我正確的方向嗎?我在這裏呆了幾天。

+0

請回答自己的問題,如果StackOverflow上允許它(不知道你需要的分數有多高吧)。 –

回答

0

好吧我自己想出來了。 下面的代碼可以工作。顯然,我以正確的方式格式化字符串時遇到了一些麻煩。

客戶:

pygame.init() 
pygame.camera.init() 
cam = pygame.camera.Camera("/dev/video0",(300,300),'RGB') 
cam.start() 

image = cam.get_image() 
print = cam.get_size() 
img_str = pygame.image.tostring(img,"RGB") 

host='192.168.0.11' 
port=8080 

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
s.connect((host,port)) 




s.sendall(img_str) 
s.close 

主持人:

host='192.168.0.11' 
port=8080 


s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(1) 
conn, addr = s.accept() 

string = bytes('','UTF-8') 


while True: 

    d = conn.recv(640*480) 

    if not d: 
     print ("break") 
     break 

    else: 

     string += d 

    pil_image = Image.fromstring("RGB",(352,288),string) 
    #(352,288) is the return of cam.get_size()