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使用代理抓取网站图片(多线程)
Mar 14 Python
Python中用format函数格式化字符串的用法
Apr 08 Python
Python执行时间的计算方法小结
Mar 17 Python
Python爬取网易云音乐热门评论
Mar 31 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
Python使用Pandas库常见操作详解
Jan 16 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 Python
python使用gdal对shp读取,新建和更新的实例
Mar 10 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 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
网页上facebook分享功能具体实现
2014/01/26 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
JQuery 小练习(实例代码)
2009/08/07 Javascript
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
2017/01/13 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
在vue中安装使用vux的教程详解
2018/09/16 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
python奇偶行分开存储实现代码
2018/03/19 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
介绍一下Java中的static关键字
2012/05/12 面试题
毕业设计说明书
2014/05/07 职场文书
党员政治学习材料
2014/05/14 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android