视频摄像机流无法持续捕捉

时间:2016-04-03 22:41:28

标签: python-2.7 opencv video-capture

我有一个从摄像机读取的程序,并找到所有帧的最大颜色强度。我注意到当我将激光指示器划过相机观察区域时会出现虚线效应。

我认为这是因为相机的fps小于相机的快门速度。或者waitkey功能阻止相机在此期间读取。

有没有办法去除这种效果,这样如果我在相机视图上划出一个激光指针,它会留下一条连续线?

编辑:如果可能的话,我也需要实时的结果。

以下是简化代码:

while 1:
      ret, view = vid.read()
      outputImg = processImage(view)
      cv2.waitkey(1)
      imshow(outputImg)

enter image description here

2 个答案:

答案 0 :(得分:0)

您应该先尝试保存视频,然后再处理。

while 1:
      ret, view = vid.read()
      outputImg = processImage(view)
      cv2.waitkey(1)
      imshow(outputImg)

您的代码会捕获一个帧,然后使用您的processImage函数对其进行处理,然后在cv2.waitkey(1)中等待,然后显示已处理的帧,最后再次读取下一帧。因此,在读取两帧之间存在时间间隔。您可以像这样保存:

while 1:
    ret, frame = vid.read()                 
    out.write(frame)

答案 1 :(得分:0)

虽然shiva's建议可能会改善您的结果,但它仍然是不可预测的,并且行为将在很大程度上取决于相机的功能和您控制它的能力。我希望存在差距。

相反,我会尝试纠正这个:

  • 在一个框架中找到每条纹的端点。
  • 找到相邻帧中的两个相邻端点。
  • 绘制连接这两点的人工激光线。 (也许通过使用从两端取得的样本并在它们之间进行插值)

如果由于某种原因你无法进行插值,但仍需要能够近乎实时地进行处理,请考虑将图像采集放入单独的线程中。将此线程设置为高优先级,以最小化帧之间的间隙。

这个帖子将重复:

  • 从相机中获取相框。
  • 将帧插入同步队列。

然后,创建一个处理线程(这也可能是你的主线程),它将从同步队列中获取帧,并进行必要的处理。

为了获得最佳效果,您应该使用能够以“自由运行”模式运行的相机,相机会自动触发,并将数据流发送到计算机进行处理。

这可能无法直接使用OpenCV和常规网络摄像头。一些较低端的工业相机,无论是GigEVision还是USB3型号都可能更合适。 (AVT Manta,Basler Scout等)如果成本超出您的价格范围,您可以在eBay上找到一些优惠。

您很可能需要使用特殊的API来控制相机并获取帧,但其余的处理将使用OpenCV完成。