Python 来自网络摄像头的实时RGB图
我需要创建一个图形,从视频实时显示RGB。我知道我必须捕获一帧并在图形和x轴绘图时间中绘制3个通道。但是我有一个错误。网络摄像头正常打开,屏幕上显示空白图形。有人知道我该如何写这段代码吗Python 来自网络摄像头的实时RGB图,python,opencv,matplotlib,graph,rgb,Python,Opencv,Matplotlib,Graph,Rgb,我需要创建一个图形,从视频实时显示RGB。我知道我必须捕获一帧并在图形和x轴绘图时间中绘制3个通道。但是我有一个错误。网络摄像头正常打开,屏幕上显示空白图形。有人知道我该如何写这段代码吗 import cv2 import matplotlib.pyplot as plt import numpy as np from matplotlib.animation import FuncAnimation capture = cv2.VideoCapture(0) ret, frame = cap
import cv2
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
capture = cv2.VideoCapture(0)
ret, frame = capture.read()
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
while True:
ret, frame = capture.read()
cv2.imshow('Frame', frame)
if not ret:
break
def animate(i):
b, g, r = cv2.split(frame)
xs = []
ys = []
for line in b:
if len(line) > 1:
x, y = line.split(',') #Getting the error: 'numpy.ndarray has no attribute split'.
xs.append(x)
ys.append(y)
ax1.clear()
ax1.plot(xs, ys)
ani = FuncAnimation(fig, animate, interval=1000)
plt.show()
keyval = cv2.waitKey(1) & 0xFF
if keyval == ord('q'):
break
capture.release()
cv2.destroyAllWindows()
您希望在接收网络摄像头帧时显示交互式图形
- 您可以使用
。plt.ion()
方法在接收输入时更新图形ion()
- 您可能会问为什么不使用FuncAnimation?
- 据我所知,
方法不是为FuncAnimation
循环设计的<代码>FuncAnimation对于预计算的帧很有用。在这里你可以看到和while
- 据我所知,
- 如何获得每秒的帧
- 我们可以计算
(每秒帧数)值。例如,如果fps
值为5,则5帧持续时间等于1秒fps
- 我们可以使用一个变量对帧进行计数,并检查该变量是否等于
。然后我们添加帧fps
-
如果帧计数%fps==0: b、 g,r=cv2.分体式(框架) line=[如果len(line)的话,zip(b,g,r)中的行对应的行] 追加(第二个) blue.append(np.mean(行[0])) green.append(np.mean(第[1]行))) 红色。附加(np.平均值(第[2]行))
- 您可能会问为什么不使用
time.time来计算秒数?
- 我认为使用
比使用fps
更可靠。我想保证每秒钟都能得到帧time.time
-
如果要分离通道,可以将每个计算的方差乘以不同的系数:
blue.append(np.var(行[0])*0.02)
green.append(np.var(第[1]行))*0.03
红色追加(np.var(第[2]行)0.04)
结果:
- 您也可以使用
np.mean
blue.append(np.平均值(第[0]行))*0.02)
绿色。附加(np.平均值(第[1]行)0.03)
红色追加(np.平均值(第[2]行)0.04)
结果:
更新-2
如果要将输出数据写入excel,可以使用库 您可以安装:
- pip环境:
pip安装xlsxwriter
- anaconda环境:
conda安装-c anaconda xlsxwriter
- 步骤1:创建工作表:
-
book=工作簿('Channel.xlsx') 工作表=书本。添加工作表()
-
- 步骤2:初始化
和行
变量:列
-
行=0 col=0
-
- 第三步:写
-
用于拉链中的s、b、g、r(xs、蓝色、绿色、红色): 书写(行、列、s) 书写(第1行,第b列) 书写(第2行,第g列) 书写(第3行、第3列、第r列) col+=1
-
- 时间
- 在以前的更新中,
错误。正确的用法是fps=cv2.CAP\u PROP\u fps
。现在我们正在获取网络摄像头的fpsfps=capture.get(cv2.CAP\u PROP\u fps)
- 加速
- 我们使用了
、red
、green
、blue
列表结构来存储帧和秒,用于显示和写入excel文件xs
- 随着帧数据的增加,列表结构成为实时处理的负担。因此,一种解决方案是划分显示和写入操作
- 用于显示:
,b\u帧
,g\u帧
,以及r\u帧
s\u帧
- 要写入excel,请使用蓝色、绿色、红色和xs
- 主要优点是现在我们可以减少显示帧的存储空间。因为我们存储在
、蓝色
、绿色
和红色
中xs
- 例如:两秒钟后删除第一帧
del b_帧[0] del g_帧[0] del r_帧[0] del s_帧[0]
- 因为
、b_帧
、g_帧
和r_帧
不再包含所有帧。系统加速s_帧
VideoCapture
在读取、解码和返回下一帧时阻止应用程序。很可能这就是相机冻结的原因
一个选项是使用VideoStream
,它通过使用队列结构同时处理读取、解码和返回操作
安装imutils
- 对于pip:
pip安装imutils
- 对于蟒蛇:
conda安装-c conda forge imutils
从imutils.video导入视频流
vs=VideoStream().start()
尽管如此:
frame=vs.read()
如果框架为无:
打破
.
.
vs.stop()
我测试了VideoStream
,在应用过程中没有冻结帧或暂停
代码:
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从imutils.video导入视频流
从xlsxwriter导入工作簿
图=plt.图()
plt.ion()#打开交互模式
xs=[]
蓝色=[]
红色=[]
绿色=[]
b_帧=[]
g_帧=[]
r_帧=[]
s_帧=[