python-3.x - 每 n 秒使用 Open CV 处理一张图像
问题描述
我正在使用 OpenCV 3.4 和 Python 3 编写程序。我还使用 Raspberry pi 3 和 PiCamera。我的问题是我必须每 2 或 3 秒处理一次从 picamera 实时录制的视频的最后一帧。
import cv2
from time import sleep
cam=cv2.VideoCapture(0)
while True:
suc, img=cam.read()
#operation on image, it's not important
cv2.imshow(...)
我有一个类似的代码。这段代码工作得很好,但是树莓派继续处理视频的最后一帧,持续几秒钟。我希望每 2 或 3 秒只处理 1 次。我已经尝试在 while 循环中使用 time.sleep(2) 但它不起作用,因为那时视频不是实时的。我在互联网上搜索了很多,我认为 picamera 继续记录,当 2 秒过去后,我的程序处理之后的帧,而不是相机记录的最后一帧。在互联网上,我找到了一个名为 VideoCapture.Grab 的函数,但我不明白它是如何工作的,以及是否必须使用它。我发现这个与我的非常相似的另一个问题 如何使用opencv python和Raspbery Pi 3在每5秒的相机后捕捉一张照片? 但是代码的第二部分被剪切或类似,我无法理解。谢谢你们。
解决方案
这是一个快速简便的解决方案:
在 python 中,time.time()
获取自 1970 年 1 月 1 日以来的当前时间(以秒为单位)。在您的 while 循环中,如果您只是获取当前时间并将其与您上次抓取一帧的时间进行比较,那么您可以检查 2 秒是否已经过去并且然后决定像您提到的那样“保留”您的框架。您可以尝试以下代码:
import cv2
import time
cam=cv2.VideoCapture(0)
last_recorded_time = time.time() # this keeps track of the last time a frame was processed
while True:
curr_time = time.time() # grab the current time
# keep these three statements outside of the if statement, so we
# can still display the camera/video feed in real time
suc, img=cam.read()
#operation on image, it's not important
cv2.imshow(...)
if curr_time - last_recorded_time >= 2.0: # it has been at least 2 seconds
# NOTE: ADD SOME STATEMENTS HERE TO PROCESS YOUR IMAGE VARIABLE, img
# IMPORTANT CODE BELOW
last_recorded_time = curr_time
请注意,我添加了 4 行代码并将 1 ( 更改from time import sleep
为import time
)。我希望这有帮助!它根本不会暂停您的程序或减慢它的速度。
推荐阅读
- google-apps-script - 为什么 Google App Script 突然不起作用
- mongodb - 在 MongoDB 上加入多个集合
- python-3.x - 如何将作为元素列表的字典的值转换为(坐标元组)的元组?
- amazon-web-services - 如何在不上传 zip 文件或使用 EFS 的情况下在 AWS Lambda 中获取 python 包?
- python - 有没有办法在熊猫上合并重复的行和求和值?
- javascript - 从服务器加载 pdf 并嵌入 Vue 应用程序
- c# - 共享 JWT 认证/授权
- javascript - 创建两个对象的联合/传播,同时将唯一属性转换为原始属性对象的数组
- react-intl - FormatJS CLI 提取
- python - 如果我们得到一个负值,则更改在 pandas 数据框中减去两列的结果