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中bisect的用法
Sep 23 Python
详解Python的Django框架中的templates设置
May 11 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
Python实现 多进程导入CSV数据到 MySQL
Feb 26 Python
使用Python & Flask 实现RESTful Web API的实例
Sep 19 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
Python探索之SocketServer详解
Oct 28 Python
Python进程间通信Queue实例解析
Jan 25 Python
Python开发之基于模板匹配的信用卡数字识别功能
Jan 13 Python
flask框架url与重定向操作实例详解
Jan 25 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
关于php mvc开发模式的感想
2011/06/28 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
获取url中用&隔开的参数实例(分享)
2017/05/28 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python的Django框架使用入门指引
2015/04/15 Python
python机器学习实战之K均值聚类
2017/12/20 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
pytorch 模型可视化的例子
2019/08/17 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
学术会议主持词
2014/03/17 职场文书
优秀纪检干部材料
2014/08/27 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
家长意见书
2015/06/04 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android