簡體   English   中英

如何使用OpenCV(Python)讀取視頻文件而無需循環(Mac OS)?

[英]How can I use OpenCV (Python) to read a video file WITHOUT looping (Mac OS)?

我正在用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()進行此類閱讀? 我不想使用較舊的cv命令,因為我需要使用cv2使用的NumPy數組。

**編輯**好,找到了一個合理的解決方案。 我發現至少有其他人在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

不要忘記添加檢查視頻文件是否已成功打開。

if( !cam.isOpened() )
  throw "Error when reading image file";

通過將它們通過管道傳送到cv :: Mat中來抓取幀

Mat frame;

for( ; ; )
{
    cam >> frame;
    if(!frame)
        break;
    imshow("w", frame);
    waitKey(20);
}

如果幀為假,則循環應正確終止。

為了也完全終止循環,您可以執行

cam.get(CV_CAP_PROP_FRAME_COUNT)

以獲得確切的幀數。 無法獲得無循環的視頻,因為其增量讀取。 您可以將其包裝到單獨的函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM