通过套接字发送网络摄像头提要
Sending Webcam feed via socket
我知道这个问题已经出现过几次了,我都读完了(我希望...)但是在我的程序中,无论如何我都无法通过套接字发送图像后显示图像我试试。
我在客户端使用 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 等),但 none 会给我显示一张真实的图片。该程序创建了一个包含数据的图像文件,但我无法打开它或查看图片。
根据打印和 len(),两个字符串相等。长度是 819200。所以看起来传输是正确的,因为它是相同的字符串。问题是如何从字符串中获取图片?
我的计划是将网络摄像头流输入 Tkinter gui。
我也尝试过类似的东西
pygame.image.tostring(图片,"RGB")
在服务器端和
pygame.image.fromstring(字符串,(640,480),"RGB")
但是在这里,无论我尝试什么,我总是得到一个 "ValueError: String length does not equal format and resolution size"。
我对 Python 很陌生,所以我可能做了一些复杂的事情。有人能指出我正确的方向吗?我被困在这里好几天了。
好的,我自己想出来了。
使用下面的代码它可以工作。显然,我在以正确的方式格式化字符串时遇到了一些麻烦。
客户:
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()
我知道这个问题已经出现过几次了,我都读完了(我希望...)但是在我的程序中,无论如何我都无法通过套接字发送图像后显示图像我试试。
我在客户端使用 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 等),但 none 会给我显示一张真实的图片。该程序创建了一个包含数据的图像文件,但我无法打开它或查看图片。
根据打印和 len(),两个字符串相等。长度是 819200。所以看起来传输是正确的,因为它是相同的字符串。问题是如何从字符串中获取图片?
我的计划是将网络摄像头流输入 Tkinter gui。
我也尝试过类似的东西 pygame.image.tostring(图片,"RGB") 在服务器端和 pygame.image.fromstring(字符串,(640,480),"RGB") 但是在这里,无论我尝试什么,我总是得到一个 "ValueError: String length does not equal format and resolution size"。
我对 Python 很陌生,所以我可能做了一些复杂的事情。有人能指出我正确的方向吗?我被困在这里好几天了。
好的,我自己想出来了。 使用下面的代码它可以工作。显然,我在以正确的方式格式化字符串时遇到了一些麻烦。
客户:
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()