機械学習を行うために、Python で簡単な OpenCV スクリプトを作成しています。処理する一連のビデオ ファイルをフィードし、終了していくつかのパラメーターを吐き出します。ただし、cv2.VideoCapture でビデオ ファイルを開くと、無限にループします。ビデオの終わりに到達したことを検出するにはどうすればよいですか?
**編集** そのため、読み取りがファイルの終わりに達したときに空のフレームが返されるはずであることに注意した人が何人かいました。私はそれを探してみましたが、Linux マシンでは動作しますが、Mac では動作しません。Mac では、ファイルに終わりがないかのようにループし続けます。何か案は?
読み取りループのコードを以下に示します。esc キーを押さない限り、無限にループします。
cam = cv2.VideoCapture(sourceVideo)
while True:
ret, img = cam.read()
cv2.imshow('detection', img)
print ret
if (0xFF & cv2.waitKey(5) == 27) or img.size == 0:
break
ret は常に True を返し、img は常に有効なデータであることに注意してください。この種の読み取りに VideoCapture() を使用してはならない可能性はありますか? cv2 が使用する NumPy 配列を使用する必要があるため、古い cv コマンドを使用したくありません。
**編集**わかりました、合理的な解決策が見つかりました。少なくとも 1 人が Mac OS で同様の問題を抱えていることがわかりました: OpenCV キャプチャでビデオがループする/最後のフレームが検出されない
私の推測では、Mac OS で使用している OpenCV のセットアップまたは何らかの形でファイル形式に問題があると思われます。
通常、正しい解決策は、返されたフレームのタイプを確認することです。これでうまくいくはずです。
cam = cv2.VideoCapture(sourceVideo)
while True:
ret, img = cam.read()
if (type(img) == type(None)):
break
cv2.imshow('detection', img)
print ret
if (0xFF & cv2.waitKey(5) == 27) or img.size == 0:
break
ただし、私の問題がある場合は、最終フレームが検出されません。いずれにせよ、ファイル内のフレーム数をチェックし、単純に追跡するという合理的な回避策があります。
framecount = cam.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
frames = 0
while frames < framecount:
ret, img = cam.read()
frames += 1
if (type(img) == type(None)):
break
cv2.imshow('detection', img)
print ret
if (0xFF & cv2.waitKey(5) == 27) or img.size == 0:
break