python 利用opencv实现图像网络传输


Posted in Python onNovember 12, 2020

本代码主要实现的是利用网络传输图片,用在我的树莓派项目之上。该项目在PC上运行服务端,树莓派上运行客户端,两者连接到同一局域网中,修改代码中的IP地址,就可以实现将树莓派采集到的图像数据实时传输到PC端。先运行服务端代码,然后运行客户端代码即可。树莓派摄像头使用的是普通的USB摄像头,并且在树莓派上安装了opencv,在树莓派上安装opencv的过程可以参考https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/。最后,该代码稍加修改就可以传输其他的信息,当然服务端,客户端也可以同时在PC上运行,以验证结果。所以本质还是希望读者借此代码可以了解python的socket编程。代码意义已在注释中详细说明,仅供参考。使用时请注意修改IP地址和端口号。

服务端代码

import socket
import time
import cv2
import numpy
 
def ReceiveVideo():
	#IP地址'0.0.0.0'为等待客户端连接
	address = ('0.0.0.0', 8002)
	#建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925
	#socket.AF_INET:服务器之间网络通信 
	#socket.SOCK_STREAM:流式socket , for TCP
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	#将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.
	s.bind(address)
	#开始监听TCP传入连接。参数指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
	s.listen(1)
 
	def recvall(sock, count):
		buf = b''#buf是一个byte类型
		while count:
			#接受TCP套接字的数据。数据以字符串形式返回,count指定要接收的最大数据量.
			newbuf = sock.recv(count)
			if not newbuf: return None
			buf += newbuf
			count -= len(newbuf)
		return buf
		
	#接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。addr是连接客户端的地址。
	#没有连接则等待有连接
	conn, addr = s.accept()
	print('connect from:'+str(addr))
	while 1:
		start = time.time()#用于计算帧率信息
		length = recvall(conn,16)#获得图片文件的长度,16代表获取长度
		stringData = recvall(conn, int(length))#根据获得的文件长度,获取图片文件
		data = numpy.frombuffer(stringData, numpy.uint8)#将获取到的字符流数据转换成1维数组
		decimg=cv2.imdecode(data,cv2.IMREAD_COLOR)#将数组解码成图像
		cv2.imshow('SERVER',decimg)#显示图像
		
		#进行下一步处理
		#。
		#。
		#。
 
    #将帧率信息回传,主要目的是测试可以双向通信
		end = time.time()
		seconds = end - start
		fps = 1/seconds;
		conn.send(bytes(str(int(fps)),encoding='utf-8'))
		k = cv2.waitKey(10)&0xff
		if k == 27:
			break
	s.close()
	cv2.destroyAllWindows()
 
if __name__ == '__main__':
	ReceiveVideo()

客户端代码:

import socket
import cv2
import numpy
import time
 
def SendVideo():
	#建立sock连接
	#address要连接的服务器IP地址和端口号
	address = ('127.0.0.1', 8002)
	try:
		#建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925
		#socket.AF_INET:服务器之间网络通信 
		#socket.SOCK_STREAM:流式socket , for TCP
		sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		#开启连接
		sock.connect(address)
	except socket.error as msg:
		print(msg)
		sys.exit(1)
 
	#建立图像读取对象
	capture = cv2.VideoCapture(0)
	#读取一帧图像,读取成功:ret=1 frame=读取到的一帧图像;读取失败:ret=0
	ret, frame = capture.read()
	#压缩参数,后面cv2.imencode将会用到,对于jpeg来说,15代表图像质量,越高代表图像质量越好为 0-100,默认95
	encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),15]
 
	while ret:
		#停止0.1S 防止发送过快服务的处理不过来,如果服务端的处理很多,那么应该加大这个值
		time.sleep(0.01)
		#cv2.imencode将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输
		#'.jpg'表示将图片按照jpg格式编码。
		result, imgencode = cv2.imencode('.jpg', frame, encode_param)
		#建立矩阵
		data = numpy.array(imgencode)
		#将numpy矩阵转换成字符形式,以便在网络中传输
		stringData = data.tostring()
		
		#先发送要发送的数据的长度
		#ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串
		sock.send(str.encode(str(len(stringData)).ljust(16)));
		#发送数据
		sock.send(stringData);
		#读取服务器返回值
		receive = sock.recv(1024)
		if len(receive):print(str(receive,encoding='utf-8'))
		#读取下一帧图片
		ret, frame = capture.read()
		if cv2.waitKey(10) == 27:
			break
	sock.close()
	
if __name__ == '__main__':
	SendVideo()

以上就是python 利用opencv实现图像网络传输的详细内容,更多关于python 图像网络传输的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中文编码那些事
Jun 25 Python
详解Python中__str__和__repr__方法的区别
Apr 17 Python
在Python中获取操作系统的进程信息
Aug 27 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
Pytorch自己加载单通道图片用作数据集训练的实例
Jan 18 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
Pytest单元测试框架如何实现参数化
Sep 05 Python
Python Socket多线程并发原理及实现
Dec 11 Python
python爬取某网站原图作为壁纸
Jun 02 Python
Anaconda详细安装步骤图文教程
Nov 12 #Python
Jupyter Notebook安装及使用方法解析
Nov 12 #Python
利用Python发送邮件或发带附件的邮件
Nov 12 #Python
Python如何使用ConfigParser读取配置文件
Nov 12 #Python
Python使用windows设置定时执行脚本
Nov 12 #Python
Django restful framework生成API文档过程详解
Nov 12 #Python
Python通过Schema实现数据验证方式
Nov 12 #Python
You might like
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
jQuery 前的按键判断代码
2010/03/19 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python实现二维有序数组查找的方法
2016/04/27 Python
python之django母板页面的使用
2018/07/03 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
python实现海螺图片的方法示例
2019/05/12 Python
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
python如何保证输入键入数字的方法
2019/08/23 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
python创建学生管理系统
2019/11/22 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
思想政治自我鉴定
2013/10/06 职场文书
户籍证明的格式
2014/01/13 职场文书
班级安全教育实施方案
2014/02/23 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
会计系毕业生求职信
2014/05/28 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
皇城相府导游词
2015/02/06 职场文书
安全教育第一课观后感
2015/06/17 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android