繁体   English   中英

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

[英]with() statement to read from VideoCapture in opencv?

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

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

with open('file.txt', 'r') as f:
   for i in f:
       print(i)

以下是否有从相机缓冲区读取的等效改写?:

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

---没有运气。 拆解/释放似乎是另一种功能。 这个成语可能在这里吗?

其他方式:

from contextlib import contextmanager

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

我不知道opencv,所以可能有更好的答案 - 但你总是可以通过定义__enter____exit__钩子来自己实现上下文管理器

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

用法如下所示:

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

并且在您点击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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM