python实现opencv+scoket网络实时图传


Posted in Python onMarch 20, 2020

本文实例为大家分享了python实现opencv+scoket网络实时图传的具体代码,供大家参考,具体内容如下

服务器分析:

1. 先通过在服务器端利用OpenCV捕获到视频的每一帧图片

2. 将这些图片进行压缩成JPEG格式,这样能减小图片大小,便于传输

3. 按照提前协商好的分辨率和帧数进行打包编码传输

4. 利用服务器端打开端口8880,此时客户端连接后,便可以在客户端中捕获到服务器端的视频。

#服务端
import socket
import threading
import struct
import time
import cv2
import numpy

class Carame_Accept_Object:
  def __init__(self,S_addr_port=("",8880)):
    self.resolution=(640,480)    #分辨率
    self.img_fps=15         #每秒传输多少帧数
    self.addr_port=S_addr_port
    self.Set_Socket(self.addr_port)

  #设置套接字
  def Set_Socket(self,S_addr_port):
    self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    self.server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #端口可复用
    self.server.bind(S_addr_port)
    self.server.listen(5)
    #print("the process work in the port:%d" % S_addr_port[1])


def check_option(object,client):
  #按格式解码,确定帧数和分辨率
  info=struct.unpack('lhh',client.recv(8))
  if info[0]>888:
    object.img_fps=int(info[0])-888     #获取帧数
    object.resolution=list(object.resolution)
    # 获取分辨率
    object.resolution[0]=info[1]
    object.resolution[1]=info[2]
    object.resolution = tuple(object.resolution)
    return 1
  else:
    return 0

def RT_Image(object,client,D_addr):
  if(check_option(object,client)==0):
    return
  camera=cv2.VideoCapture(0)                #从摄像头中获取视频
  img_param=[int(cv2.IMWRITE_JPEG_QUALITY),object.img_fps] #设置传送图像格式、帧数
  while(1):
    time.sleep(0.1)       #推迟线程运行0.1s
    _,object.img=camera.read() #读取视频每一帧

    object.img=cv2.resize(object.img,object.resolution)   #按要求调整图像大小(resolution必须为元组)
    _,img_encode=cv2.imencode('.jpg',object.img,img_param) #按格式生成图片
    img_code=numpy.array(img_encode)            #转换成矩阵
    object.img_data=img_code.tostring()           #生成相应的字符串
    try:
      #按照相应的格式进行打包发送图片
      client.send(struct.pack("lhh",len(object.img_data),object.resolution[0],object.resolution[1])+object.img_data)
    except:
      camera.release()    #释放资源
      return

if __name__ == '__main__':
  camera=Carame_Accept_Object()
  while(1):
    client,D_addr=camera.server.accept()
    clientThread=threading.Thread(None,target=RT_Image,args=(camera,client,D_addr,))
    clientThread.start()

客户端分析:

1. 客户端连接端口后,首先发送需要协商的分辨率和帧数,以致能够使传输“协议”一致

2. 客户端使用线程,对图片进行收集

3. 对收到的每一张图片进行解码,并利用OpenCV播放出来,即可实现C/S两端实时视频传输。

#客户端
import socket
import cv2
import threading
import struct
import numpy

class Camera_Connect_Object:
  def __init__(self,D_addr_port=["",8880]):
    self.resolution=[640,480]
    self.addr_port=D_addr_port
    self.src=888+15         #双方确定传输帧数,(888)为校验值
    self.interval=0         #图片播放时间间隔
    self.img_fps=15         #每秒传输多少帧数

  def Set_socket(self):
    self.client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    self.client.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

  def Socket_Connect(self):
    self.Set_socket()
    self.client.connect(self.addr_port)
    print("IP is %s:%d" % (self.addr_port[0],self.addr_port[1]))

  def RT_Image(self):
    #按照格式打包发送帧数和分辨率
    self.name=self.addr_port[0]+" Camera"
    self.client.send(struct.pack("lhh", self.src, self.resolution[0], self.resolution[1]))
    while(1):
      info=struct.unpack("lhh",self.client.recv(8))
      buf_size=info[0]          #获取读的图片总长度
      if buf_size:
        try:
          self.buf=b""        #代表bytes类型
          temp_buf=self.buf
          while(buf_size):      #读取每一张图片的长度
            temp_buf=self.client.recv(buf_size)
            buf_size-=len(temp_buf)
            self.buf+=temp_buf   #获取图片
            data = numpy.fromstring(self.buf, dtype='uint8')  #按uint8转换为图像矩阵
            self.image = cv2.imdecode(data, 1)         #图像解码
            cv2.imshow(self.name, self.image)          #展示图片
        except:
          pass;
        finally:
          if(cv2.waitKey(10)==27):    #每10ms刷新一次图片,按‘ESC'(27)退出
            self.client.close()
            cv2.destroyAllWindows()
            break

  def Get_Data(self,interval):
    showThread=threading.Thread(target=self.RT_Image)
    showThread.start()

if __name__ == '__main__':
  camera=Camera_Connect_Object()
  camera.addr_port[0]="服务端的ip"
  camera.addr_port=tuple(camera.addr_port)
  camera.Socket_Connect()
  camera.Get_Data(camera.interval

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用第三方库xlrd来读取Excel示例
Apr 05 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
pandas Dataframe行列读取的实例
Jun 08 Python
用于业余项目的8个优秀Python库
Sep 21 Python
python for循环remove同一个list过程解析
Aug 14 Python
在pycharm中配置Anaconda以及pip源配置详解
Sep 09 Python
django序列化serializers过程解析
Dec 14 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
Django单元测试中Fixtures用法详解
Feb 25 Python
PyTorch如何搭建一个简单的网络
Aug 24 Python
python状态机transitions库详解
Jun 02 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 Python
python实现同一局域网下传输图片
Mar 20 #Python
python实现udp传输图片功能
Mar 20 #Python
python实现UDP协议下的文件传输
Mar 20 #Python
python实现TCP文件传输
Mar 20 #Python
python实现FTP循环上传文件
Mar 20 #Python
python实现ftp文件传输功能
Mar 20 #Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
Mar 20 #Python
You might like
PHP扩展CURL的用法详解
2014/06/20 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
js 浮动层菜单收藏
2009/01/16 Javascript
由document.body和document.documentElement想到的
2009/04/13 Javascript
来自qq的javascript面试题
2010/07/24 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
小程序双头slider选择器的实现示例
2020/03/31 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
django model通过字典更新数据实例
2020/04/01 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
办公自动化毕业生求职信
2014/03/09 职场文书
绿化工程实施方案
2014/03/17 职场文书
小学语文课后反思精选
2014/04/25 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis