【问题标题】:OpenCV record video and draw position of LEDOpenCV 录制视频并绘制 LED 的位置
【发布时间】:2020-12-26 06:31:01
【问题描述】:

我正在制作一个应用程序,用于记录用户在不同 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 循环结合起来进行视频录制。任何帮助表示赞赏。

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    检查每次迭代的时间是否是切换的时刻:

    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
    

    【讨论】:

    • 但是 LED 控制/分析在哪里出现?
    • pixels[3] = (255,0,0) - 此代码开启 LED?
    • 是的,正确。并且 (0,0,0) 将其关闭
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2017-03-04
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多