0.前言
经过前面的实验,队长要求我使用opencv的camera作为摄像头来实现真正的视频流传输,因此本次实验我将讲述如何实现一个视频流的传输
附之前文章的链接:
【编程实践/嵌入式比赛】嵌入式比赛学习记录(一):TCP服务器和web界面的建立
【编程实践/嵌入式比赛】嵌入式比赛学习记录(二):基于TCP的图片流传输
1.视频流传输思想
我们提到视频,一般会想到帧的概念。从不严谨的角度来看,帧率就是指视频每秒刷新多少次。如果视频帧率是30,那么就是指1秒视频刷新30次。
因此我们可以将摄像头的视频截获下来,这样就是一张图片。通过刷新这样一张图片便可以视频流的形式展现。事实上很多网络IP摄像头就是通过传视频截获的帧来展示在前端的。
因此对于客户端(摄像头)而言,关键在于如何把视频帧进行编码传出去。而对于服务器端而言,则在于如何进行视频帧的解码。
大致的传输流程如下:
其中下位机部分暂且用一个单独进程来实现,摄像头使用opencv的camera,TCP client使用python socket实现。
2.摄像头部分
摄像头部分就是如之前所说,使用opencv来调用电脑的摄像头,模拟下位机的摄像头
另:貌似opencv的摄像头窗口大小只能选择预设的几个值,如果必须要自定义大小只能自己手动修改大小。
import cv2
#自定义模块
from MyClient import *
from MyImage import *
#TCP client,自己实现的类
client=TCPClient("192.168.71.1",5001)
def StartCamera():
cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)
if not cap.isOpened():
print("Camera error!")
return
fps=15
#设置为640*480,帧率为15
cap.set(3,height)
cap.set(4,width)
cap.set(cv2.CAP_PROP_FPS,fps)
while 1:
#截取帧
ret,frame=cap.read()
if not ret:
print("Get frame error")
break
#print(frame.shape)
#type:numpy.ndarray
#shape(480,640,3)
#翻转
frame=cv2.flip(frame,180)
'''调用TCP client的接口传输'''
'''image_encode是图片编码'''
client.send_data(image_encode(frame))
time.sleep