python - 检测连续图像的非/最小变化像素的最快方法

标签 python image numpy opencv computer-vision

我想找到静态视频流的像素。通过这种方式,我可以检测到视频流中的 Logo 和其他非移动项目。我的脚本背后的想法如下:

  • 在名为 previous 的列表中收集多个大小相同且灰度大小相同的帧
  • 如果收集到一定数量的帧,调用函数np.std
  • 该函数循环遍历所有 x-y-coordinates的新形象。
  • 根据所有帧对应坐标的灰度值计算所有坐标的灰度值标准差

  • 我的脚本:
    import math
    import cv2
    import numpy as np
    
    
    video = cv2.VideoCapture(0)
    previous = []
    n_of_frames = 200
    
    while True:
       ret, frame = video.read()
       if ret:
          cropped_img = frame[0:150, 0:500]
          gray = cv2.cvtColor(cropped_img, cv2.COLOR_BGR2GRAY)
          if len(previous) == n_of_frames:
             stdev_gray = np.std(previous, axis=2)
             previous = previous[1:]
             previous.append(gray)
          else:
             previous.append(gray)
    
          cv2.imshow('frame', frame)
    
          key = cv2.waitKey(1)
          if key == ord('q'):
             break
    
    video.release()
    cv2.destroyAllWindows()
    

    这个过程非常缓慢,我很好奇是否有更快的方法来做到这一点。我对 Cython 等持开放态度。非常感谢提前!

    最佳答案

    一种方法是使用 cv2.bitwise_and() 逐帧比较每个帧。 .这个想法是前一帧中的像素必须存在于当前帧中才能成为不变的像素。通过遍历帧列表,场景中的所有特征都必须存在于前一帧和当前帧中,才能被视为非移动项目。因此,如果我们按顺序遍历每一帧,最后一次迭代将具有所有先前帧的共享特征。

    使用每秒捕获一次的这组帧

    enter image description here

    我们将每一帧转换为灰度然后cv2.bitwise_and()与前一帧和当前帧。每次连续迭代的不变像素以灰色突出显示,而变化像素为黑色。最后一次迭代应该展示所有帧之间共享的像素。

    enter image description here

    相反,如果您还对每一帧进行阈值处理,您会得到更明显的结果

    enter image description here

    import cv2
    import glob
    
    images = [cv2.imread(image, 0) for image in glob.glob("*.png")]
    
    result = cv2.bitwise_and(images[0], images[1])
    for image in images[2:]:
        result = cv2.bitwise_and(result, image)
    
    cv2.imshow('result', result)
    cv2.waitKey(0)
    

    关于python - 检测连续图像的非/最小变化像素的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58877724/

    相关文章:

    python - TypeError : unsupported operand type(s) for +: 'set' and 'set'

    java - 动态创建和渲染具有透明背景的图像,以便与drawImage一起使用

    python - 如何使用opencv丢弃图像的边缘?

    python - 使用 np.savetxt 将数组保存为列

    python - shlex.split 的反面是什么?

    python - 无法在 share.streamlit.io 上部署 streamlit 应用程序

    python - 如何使用 Paramiko 传输文件夹

    image - 如何判断照片是否损坏?

    python - 是否有代码可以对列中包含的相似单词进行分组

    python - 创建置换矩阵 - numpy