小哀小白 2023-06-01 21:31 采纳率: 37.5%
浏览 11

python的socket发送处理好的图片问题

我的程序是通过opencv读取视频,然后进行图片处理,之后输出到前端界面。在这个过程中我想使用socket将处理后的图片发送到局域网内的其他电脑。但是只能发送一帧。我的本机作为服务器端,另一台电脑作为接收端。我想在不影响我当前程序的运作下,能把图片也发出去。但是现在我写的socket是阻塞的,必须接受信号才能运作,运行也只能运行一次 就卡死。如何修改可以一边不影响我的程序,一边还能发信息。

class VideoStreamingTest(object):
    def __init__(self,img,id,a):
        self.connection, self.client_address=a[id].accept()
        self.connect = self.connection.makefile('wb')                            # 创建一个传输文件 写功能 写入数据时b''二进制类型数据
        self.host_name = socket.gethostname()
        self.img=img                                        # 获得服务端主机名
        self.host_ip = socket.gethostbyname(self.host_name)                        # 获得服务端主机IP地址
        time.sleep(3)
        self.start()

    def start(self):
        print("客服端已连接:")
        print("Client Host Name:", self.host_name)
        print("Connection from: ", self.client_address)
        print("Streaming...")
        stream = io.BytesIO()                            # 创建一个io流,用于存放二进制数据
        try:
            frame=self.img
            img_encode = cv2.imencode('.jpg', frame)[1]                        # 编码
            data_encode = np.array(img_encode)                                # 将编码数据转换成二进制数据
            stream.write(data_encode)                                        # 将二进制数据存放到io流
            self.connect.write(struct.pack('<L', stream.tell()))            # struct.pack()将数据转换成什么格式    stream.tell()获得目前指针的位置,将数据写入io流后,数据指针跟着后移,                                                                 # 也就是将数据长度转换成'<L'类型(无符号长整型),写入makefile传输文件                                     # 它的作用相当于 帧头数据,单独收到这个数据表示开始传输一帧图片数据,因为图片大小确定,这个数也就定下不变
            self.connect.flush()                                            # 刷新,将数据长度发送出去
            stream.seek(0)                                                    # 更新io流,将指针指向0
            self.connect.write(stream.read())                                # 指针指向0后,从头开始读数据,然后写到makefile传输文件
            stream.seek(0)                                                    # 更新指针
            stream.truncate()                                                # 更新io流数据,删除指针后面的数据
                                                # 发送0,相当于帧尾数据,单独收到这个数表示一帧图片传输结束
        except:
            print(" ")
            print("The customer service is disconnected!")
        self.connect.write(struct.pack('<L', 0))
        #self.connection.close()
        print("与客服端断开连接!")
        print(" ")

这是我在网上找的传输代码 但是我不知道怎么停止,让这个函数可以传输出去 就运行我程序的下一步。我把上面的函数添加到我处理完图像的函数之后,在要发到前端界面之前的位置。但是他会在socket停住,每次只能发送一张,等待我客户端运行一次 这边发一张。

     self.is_draw = False
        self.SaveNowVideo()
        #self.send_look(img=self.img, id=self.id)
        VideoStreamingTest(img=self.img,id=self.id,a=a)#这句就是上面的那段
        self.img = cv2.cvtColor(self.img, cv2.COLOR_BGR2RGB)
        self.img_single.emit(self.img, self.id)

  • 写回答

3条回答 默认 最新

  • vimtion 2023-06-01 23:14
    关注

    可以使用 Threading 创建多线程处理这些问题

    评论

报告相同问题?

问题事件

  • 创建了问题 6月1日

悬赏问题

  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?