我想用socket在两台机器之间传输图片
cilent
import socket
import cv2
from PIL import ImageGrab
import numpy as np
HOST = '127.0.0.1'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
img=ImageGrab.grab()
img_np=np.array(img)
frame=cv2.cvtColor(img_np,cv2.COLOR_BGR2RGB)
s.send(str(frame).encode("utf-8"))
cv2.destroyAllWindows()
s.close()
serve
import socket
import threading
import cv2
import numpy as np
HOST = '0.0.0.0' # 本地localhost
PORT = 50007
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
def tcp(a):
while 1:
data = a.recv(102400)
data=data.decode("utf-8")
data=np.array(data)
if not data:
break
cv2.imshow('screen',data)
cv2.waitKey(0)
a.close()
while 1:
conn, addr = s.accept()#接受连接
print('Connected by', addr)
t= threading.Thread(target=tcp,args=(conn,))#创建线程
t.setDaemon(True)#设置为后台线程,这里默认是False,设置为True之后则主线程不用等待子线程
t.start()
continue
输出后两端的frame和data数据和类型都一模一样,但为什么用imshow时报
cv2.error: OpenCV(4.5.2) :-1: error: (-5:Bad argument) in function 'imshow'
> Overload resolution failed:
> - mat data type = 19 is not supported
> - Expected Ptr<cv::cuda::GpuMat> for argument 'mat'
> - Expected Ptr<cv::UMat> for argument 'mat'
str(cv2.cvtColor(img_np,cv2.COLOR_BGR2RGB)).encode("utf-8")无法序列化ndarray对象,建议题主尝试下面的方式序列化核反序列化,重点是要数据类型要对应。
>>> a = np.array([1,2,3], dtype=np.int32)
>>> b = a.tobytes()
>>> np.fromstring(b, dtype=np.int32)
array([1, 2, 3])
可以参考这篇文章,希望对你有帮助:python 使用socket传输图片视频等文件的实现方式_python基础编程开发教程-CSDN博客
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632