【问题标题】:Sending Webcam feed via socket通过套接字发送网络摄像头馈送
【发布时间】:2015-07-28 23:12:55
【问题描述】:

我知道这个问题已经出现了好几次,我都阅读了(我希望...)但是在我的程序中,无论我尝试什么,我都无法在通过套接字发送图像后显示图像.

我在客户端使用 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 等),但没有一个会显示真实的图片。该程序会创建一个包含数据的图像文件,但我无法打开它或查看图片。

根据 prints 和 len(),两个字符串相等。长度是 819200。所以看起来传输是正确的,因为它是相同的字符串。问题是如何从字符串中获取图片?

我的计划是将网络摄像头流输入到 Tkinter gui。

我也尝试过类似的东西 pygame.image.tostring(图像,“RGB”) 在服务器端和 pygame.image.fromstring(string,(640,480),"RGB") 但是在这里我总是得到一个“ValueError:字符串长度不等于格式和分辨率大小”,无论我尝试什么。

我对 Python 很陌生,所以也许我做了一些有点复杂的事情。有人可以指出我正确的方向吗?这几天我被困在这里。

【问题讨论】:

  • 如果 StackOverflow 允许,请回答您自己的问题(不确定您需要多高的分数)。

标签: python sockets pygame webcam


【解决方案1】:

好吧,我自己想通了。 使用下面的代码它可以工作。显然我在以正确的方式格式化字符串时遇到了一些麻烦。

客户:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多