我需要创建一个图形,从视频实时显示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 = 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
方法不是为while
循环设计的FuncAnimation
对于预先计算的帧很有用。在这里你可以看到example1和example2李>我们可以计算
fps
(每秒帧数)值。例如,如果fps
值为5,则5帧持续时间等于1秒我们可以使用一个变量对帧进行计数,并检查该变量是否等于
fps
。然后我们添加帧你可能会问为什么不使用
time.time for calculating the seconds?
我认为使用
fps
比使用time.time
更可靠。我想保证每秒钟都能得到帧结果:
我已从命令提示符处获得结果。如果您调试它,您可能会得到多个图像,而不是一个更新的图像
更新-1
如果要分离通道,可以将每个计算的方差乘以不同的系数:
结果:
np.mean
结果:
更新-2
如果要将输出数据写入excel,可以使用^{} 库
您可以安装:
pip install xlsxwriter
conda install -c anaconda xlsxwriter
三个步骤:
步骤1:创建工作表:
步骤2:初始化
row
和column
变量:第三步:写
输出:
更新-3
在以前的更新中,错误的
fps = cv2.CAP_PROP_FPS
。正确的用法是fps = capture.get(cv2.CAP_PROP_FPS)
。现在我们正在获取网络摄像头的fps我们使用
red
、green
、blue
、xs
列表结构来存储显示和写入excel文件的帧和秒数随着帧数据的增加,列表结构成为实时处理的负担。因此,一种解决方案是划分显示和写入操作
用于显示:
b_frame
、g_frame
、r_frame
、和s_frame
要写入excel,请使用
blue
、green
、red
和xs
主要优点是现在我们可以减少显示帧的存储空间。因为我们存储在
blue
、green
、red
和xs
中例如:两秒钟后删除第一帧
因为
b_frame
、g_frame
、r_frame
和s_frame
不再包含所有帧。系统加速更新-4
VideoCapture
在读取、解码和返回下一帧时阻塞应用程序。很可能这就是相机冻结的原因一个选项是使用
VideoStream
,它通过使用队列结构同时处理读取、解码和返回操作安装
imutils
pip install imutils
conda install -c conda-forge imutils
例如:
我测试了
VideoStream
,在应用过程中没有冻结帧或暂停代码:
相关问题 更多 >
编程相关推荐