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内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
Python封装shell命令实例分析
May 05 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
一道python走迷宫算法题
Jan 22 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
Python生成器的使用方法和示例代码
Mar 04 Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 Python
Python中的延迟绑定原理详解
Oct 11 Python
如何用Python和JS实现的Web SSH工具
Feb 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
PHP IE中下载附件问题解决方法
2014/01/07 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
element-ui表格数据转换的示例代码
2018/08/24 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
Python连接PostgreSQL数据库的方法
2016/11/28 Python
python脚本替换指定行实现步骤
2017/07/11 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
简单了解python数组的基本操作
2019/11/26 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
印度低票价航空公司:GoAir
2017/10/11 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
工作分析计划书
2014/04/30 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
医院护士工作检讨书
2014/10/26 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
家长意见书
2015/06/04 职场文书
感恩教师主题班会
2015/08/12 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
win10安装配置nginx的过程
2021/03/31 Servers