5

ファイルやデータベース接続にアクセスするために 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

---運が悪かった。ティアダウン/リリースは別の種類の機能のようです。このイディオムはここで可能ですか?

4

2 に答える 2

8

別の方法:

from contextlib import contextmanager

@contextmanager
def VideoCapture(*args, **kwargs):
    cap = cv2.VideoCapture(*args, **kwargs)
    try:
        yield cap
    finally:
        cap.release()
于 2016-01-08T15:27:08.290 に答える
7

私は opencv を知らないので、もっと良い答えがあるかもしれませんが、とフックを定義することで、いつでもコンテキスト マネージャーを自分で実装できます。__enter____exit__

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

使用法は次のようになります。

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

breakステートメントをヒットすると、リソースが解放されます。

あなたのコメントに基づいて、opencvここで何かファンキーなことをしているようです。VideoCapture インスタンスをラップするカスタム クラスを作成することもできます。今日の世界では、おそらくcontextlib

@contextlib.contextmanager
def video_capture_wrapper(*args, **kwargs):
    try:
        vid_stream = VideoCapture(*args, **kwargs)
        yield vid_stream
    finally:
         vid_stream.release()

ここでの使用法は次のようになります。

with video_capture_wrapper(0) as vid_stream:    
    while(True):
        _, f = vid_stream.read()
        cv.imshow('e2', f)
        if cv.waitKey(5) == 27:
            cv.waitKey()
            break
于 2013-09-30T04:32:58.150 に答える