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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
python基于itchat实现微信群消息同步机器人
Feb 27 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
python方向键控制上下左右代码
Jan 20 Python
python调用百度语音REST API
Aug 30 Python
Python何时应该使用Lambda函数
Jul 02 Python
python画双y轴图像的示例代码
Jul 07 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
Python基于xlrd模块处理合并单元格
Jul 28 Python
python 常见的反爬虫策略
Sep 27 Python
Python本地及虚拟解释器配置过程解析
Oct 13 Python
pytorch常用数据类型所占字节数对照表一览
May 17 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与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
10条php编程小技巧
2015/07/07 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
点击弹出层效果&弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
玩转方法:call和apply
2014/05/08 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
vue中监听路由参数的变化及方法
2019/12/06 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python的类变量和成员变量用法实例教程
2014/08/25 Python
python根据文件大小打log日志
2014/10/09 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
浅谈python写入大量文件的问题
2018/11/09 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
法律进机关实施方案
2014/03/12 职场文书
法制报告会主持词
2014/04/02 职场文书
活动总结书
2014/05/08 职场文书
运动会开幕式主持词
2015/07/01 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
vue3中的组件间通信
2021/03/31 Vue.js