首页 > 解决方案 > OpenCV 录制视频并绘制 LED 的位置

问题描述

我正在制作一个应用程序,记录用户在不同 LED 发光的过程中的面部表情。用户站在设备前面,角落的 4 个 LED 轮流点亮和熄灭。我正在使用 adafruit neopixel 库执行此操作。这工作正常。我的下一个目标是让记录的图像在对应于当前打开的 LED 的帧中画一个小圆圈。因此,如果右上角的 LED 亮起,我希望在框架的右上角画一个小圆圈,指示哪个 LED 处于活动状态。在查看常规网络摄像头镜头时,我也可以很好地绘制帧。

但是,我的问题是将两者结合起来。如果我运行一个循环来处理帧,那么我就无法准确控制 LED 的时序。如果我设置延迟或睡眠功能以按照需要的方式对 LED 进行计时,那么处理帧的循环也会停止。如果我把循环放在脚本的顶部,它永远不会调用函数来闪烁 LED,因为它永远不会中断while True,如果我把它放在底部,LED 在视频捕获开始之前通过它们的功能闪烁。

所以对于普通的网络摄像头视频:

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

并让一个 LED 闪烁 3 次:

def blinkTopRight():
    pixels[3] = (255,0,0)
    sleep(1)
    pixels[3] = (0,0,0)
    sleep(1)
    pixels[3] = (255,0,0)
    sleep(1)
    pixels[3] = (0,0,0)
    sleep(1)
    pixels[3] = (255,0,0)
    sleep(1)
    pixels[3] = (0,0,0)
    sleep(1)

我的目标是在 LED 亮起时有这样的东西:

pixels[3] = (255,0,0)
frame = cv2.circle(frame, (100,100), 10, (0, 255, 0), 3)
cv2.imshow("Vid", frame)

然后当它关闭时,没有绘图:

pixels[3] = (0,0,0)
cv2.imshow("Vid", frame)

但显然这不起作用,我不知道如何将定时闪烁与无限while True循环结合起来进行视频录制。任何帮助表示赞赏。

标签: pythonopencv

解决方案


如果是切换的时刻,请检查每次迭代的时间:

import time

p_time = time.time()
on = False
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    c_time = time.time()
    
    if on:
        frame = cv2.circle(frame, (100, 100), 10, (0, 255, 0), 3)
       
        
    if c_time - p_time > 1:

        on = not on
        if on:
            pixels[3] = (255,0,0)
        else:
            pixels[3] = (0,0,0)
        p_time = c_time

    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

推荐阅读