我正在尝试使用 python (raspberry PI) 通过 TCP 套接字发送捕获图像的数据。 TCP Server (QT) 在其他机器上运行并尝试读取图像并在 QLabel 中显示。
我从来没有用 python 编程过,完全不明白我做错了什么。我花了很多时间(几天)来解决持续的错误,最后到了可以实际运行它的地步。但是我收到的数据是垃圾。
下面的程序在树莓派上的 sep 窗口中显示视频,并且应该通过套接字发送单个捕获的图像。
import cv2.cv as cv
import cv2
import time
from socket import socket
import sys
import numpy
cv.NamedWindow("camera",cv.CV_WINDOW_AUTOSIZE)
capture = cv.CaptureFromCAM(0)
sock = socket()
sock.connect(('192.168.0.2', 5001))
sock.send('Pi - Hallo')
while True:
frame = cv.QueryFrame(capture)
cv.ShowImage("camera", frame)
mat = cv.GetMat(frame)
buf = [1,90]
image = cv.CreateImage (cv.GetSize (frame), 8, 3)
nuImage = numpy.asarray(frame[:,:])
imgencode = cv2.imencode('.png', nuImage, buf)
data = numpy.array(imgencode)
stringData = data.tostring()
sock.send('Pi - Sending image data');
sock.send( stringData );
if cv.WaitKey(10) == 27:
break
sock.send('Pi - closing connection')
sock.close()
最佳答案
您收到的数据不是垃圾数据。是发送数据。但它是以字节为单位发送的。因此,在接收端,您需要在处理数据之前将字节转换为字符串。阅读this为了更好地理解在套接字编程中发送和接收数据,请阅读 this当前版本的 opencv 中使用的方法。
此外,您不需要使用 cv 来完成此任务。当前版本的 opencv 提供了通过 import cv2
完成此操作的方法。
以下是一个工作代码,虽然它的通信被简化了。
客户端.py
#!/usr/bin/python
import socket
import cv2
import numpy
TCP_IP = 'localhost'
TCP_PORT = 5001
sock = socket.socket()
sock.connect((TCP_IP, TCP_PORT))
capture = cv2.VideoCapture(0)
ret, frame = capture.read()
encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),90]
result, imgencode = cv2.imencode('.jpg', frame, encode_param)
data = numpy.array(imgencode)
stringData = data.tostring()
sock.send( str(len(stringData)).ljust(16));
sock.send( stringData );
sock.close()
decimg=cv2.imdecode(data,1)
cv2.imshow('CLIENT',decimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
server.py
#!/usr/bin/python
import socket
import cv2
import numpy
def recvall(sock, count):
buf = b''
while count:
newbuf = sock.recv(count)
if not newbuf: return None
buf += newbuf
count -= len(newbuf)
return buf
TCP_IP = 'localhost'
TCP_PORT = 5001
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(True)
conn, addr = s.accept()
length = recvall(conn,16)
stringData = recvall(conn, int(length))
data = numpy.fromstring(stringData, dtype='uint8')
s.close()
decimg=cv2.imdecode(data,1)
cv2.imshow('SERVER',decimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
关于python - 通过 TCP 发送图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820602/