从opencv中的VideoCapture读取with()语句?

2024-05-03 11:46:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我喜欢使用with语句访问文件和数据库连接,因为它会在出错或文件关闭时自动断开连接。在

f = open('file.txt', 'r')
for i in f():
   print(i)
f.close()

^{pr2}$

在下面的内容中,是否有一个从相机缓冲区读取的等效的重新措辞?公司名称:

c = cv.VideoCapture(0)    
while(1):
    _,f = c.read()
    cv.imshow('e2',f)
    if cv.waitKey(5)==27:
        cv.waitKey()
        break
c.release()

我试过:

c = cv.VideoCapture(0)    
while(1):
   with c.read() as _,f:
       cv.imshow('e2',f)
       if cv.waitKey(5)==27:
           cv.waitKey()
           break

——运气不好。看起来拆卸/释放是一种不同的功能。这里有这个成语吗?在


Tags: 文件数据库readifwith语句opencv
2条回答

另一种方式:

from contextlib import contextmanager

@contextmanager
def VideoCapture(*args, **kwargs):
    cap = cv2.VideoCapture(*args, **kwargs)
    try:
        yield cap
    finally:
        cap.release()

我不知道opencv,所以可能有更好的答案,但是您可以通过定义__enter__和{}钩子来实现context manager

class MyVideoCapture(cv.VideoCapture):
    def __enter__(self):
        return self
    def __exit__(self, *args):
        self.release()

这样的用法如下:

^{pr2}$

在您点击break语句后,资源将被释放。在

根据你的评论,看起来opencv在这里做一些很奇怪的事情。您还可以创建一个自定义类来包装VideoCapture实例:

class VideoCaptureWrapper(object):
    def __init__(self, *args, **kwargs):
        self.vid_steam = VideoCapture(*args, **kwargs):
    def __enter__(self):
        return self
    def __exit__(self, *args):
        self.vid_stream.release()

这里的用法是:

with VideoCaptureWrapper(0) as c:    
    while(1):
        _,f = c.vid_stream.read()
        cv.imshow('e2',f)
        if cv.waitKey(5)==27:
            cv.waitKey()
            break

相关问题 更多 >