Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 来自网络摄像头的实时RGB图_Python_Opencv_Matplotlib_Graph_Rgb - Fatal编程技术网

Python 来自网络摄像头的实时RGB图

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

我需要创建一个图形,从视频实时显示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对于预计算的帧很有用。在这里你可以看到和
  • 如何获得每秒的帧
    • 我们可以计算
      fps
      (每秒帧数)值。例如,如果
      fps
      值为5,则5帧持续时间等于1秒

    • 我们可以使用一个变量对帧进行计数,并检查该变量是否等于
      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
        更可靠。我想保证每秒钟都能得到帧

结果:

我已从命令提示符处获得结果。如果您调试它,您可能会得到多个图像,而不是一个更新的图像

更新-1


如果要分离通道,可以将每个计算的方差乘以不同的系数:

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
      
输出:

更新-3


  • 时间

  • 在以前的更新中,
    fps=cv2.CAP\u PROP\u fps
    错误。正确的用法是
    fps=capture.get(cv2.CAP\u PROP\u fps)
    。现在我们正在获取网络摄像头的fps

  • 加速

  • 我们使用了
    red
    green
    blue
    xs
    列表结构来存储帧和秒,用于显示和写入excel文件

  • 随着帧数据的增加,列表结构成为实时处理的负担。因此,一种解决方案是划分显示和写入操作

  • 用于显示:
    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_帧
    不再包含所有帧。系统加速

更新-4


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_帧=[