2014-08-30 93 views
0

我正在用OpenCV處理幀。事情是這樣的:第二遍OpenCV幀數據爲零

VideoCapture cap(pathC); 

    while(true) { 
    cap >> cur; 

    if(cur.data == NULL) { 
     break; 
    } 

    // do something with cur 
    } 

時循環結束,我需要再次處理所有幀,所以我有另一個循環正是這樣一個,但首先我必須定位在第一幀的視頻。事情是這樣的:

// I have tried all these methods to put cap on frame 0 
    // cap.set(CV_CAP_PROP_POS_AVI_RATIO, 0); 
    cap.set(CV_CAP_PROP_POS_FRAMES, 0); 
    // cap.set(CV_CAP_PROP_POS_MSEC, 0); 

    // in theory the video is on frame 0 now, do the loop 

    while(true) { 
    cap >> cur; 

    if(cur.data == NULL) { 
     break; 
    } 

     // do something with cur 
    } 

問題是cur.data在這第二個循環是nil

印刷CUR就這兩種情況下安慰給了我這個

第一循環

{ 
    1124024336 

    2 

    1072 

    1920 

    0x04390010 

    0x04973810 

    0x04390010 

    0x04973810 

    0x04973810 

    <nil> 

    { 
    0x27d33dac 

    } 
    { 
    0x27d33dd4 

    ([0] = 5760, [1] = 3) 
    } 
} 

第二循環

{ 
    1124024336 

    2 

    <nil> 

    1920 

    <nil> 

    <nil> 

    <nil> 

    <nil> 

    <nil> 

    <nil> 

    { 
    0x27d33dac 

    } 
    { 
    0x27d33dd4 

    ([0] = 5760, [1] = 3) 
    } 
} 

那麼,什麼是錯與對的對象第二遍。它似乎失去了很多東西。

任何線索?

回答

0

我遇到過類似的問題。當視頻數據或標題中存在一些損壞時會發生這種情況。因此,手動設置幀號時會出現問題。 我做的修復是在第一遍之後關閉視頻。開始第二遍時,不要將位置設置爲0,只需再次打開視頻,它將打開視頻,並將光標置於0處,並且讀取沒有問題。

+0

這就是我所做的工作,但我試圖找到一個不那麼蹩腳的解決方案,並且因爲重新讀取文件的開銷。無論如何,它的工作。感謝: – SpaceDog 2014-08-31 07:36:19

+0

:)很高興它幫助。如果它有效,你可以作爲答覆upvote/accept,它會幫助其他人知道答案的有效性。同樣,set函數也有類似的開銷,比如打開視頻,無論如何,除非您保存或存儲幀,否則您必須重新讀取幀。如果您不處理蒸汽視頻,這是最好的解決方案,因爲您不必存儲或保存幀。 – 2014-08-31 08:13:42

+0

我必須測試另一個答案。你的並不是一個完全解決方案,而是一個破解。無論如何,如果沒有真正的解決方案,我會接受你的。 :) – SpaceDog 2014-08-31 08:20:27

0

我剛剛測試了一段代碼的確切副本,它工作得很好。我猜想它與您運行代碼的平臺或視頻文件的格式/壓縮有關。

我使用C++接口cv::VideoCapture.set(...)和C one cvSetCaptureProperty(...)進行了測試。兩者都很好。第二個循環像第一個循環一樣遍歷所有幀。

我的設置:

  • 文件格式:.AVI
  • 視頻性能:646架總在20fps的。
  • 壓縮/編解碼器:ffdshow。
  • OpenCV的版本:2.49,x64構建。
  • 環境:VS2013,Windows 8.1。

我的建議:

  1. 嘗試使用未壓縮的文件格式爲AVI。如果這樣做,那麼OpenCV可能不支持以某些格式/編解碼器設置視頻文件的屬性。說實話,這不會是一個驚喜。我記得過去有些編解碼器存在問題,即使我已經將它們正確安裝在我的電腦中。但是,一直在工作的人是ffdshow。

  2. 嘗試使用上面剛剛提到的C接口。我記得在2.42版本中它們的表現都不一樣。我用C界面打開了一些視頻。

  3. 構建您自己的庫版本(使用cmake)也可能是一個選項。

請讓我知道這些建議是否有幫助。

+0

謝謝。我使用H264編解碼器來使用MP4視頻。我在iOS上運行這個。我會嘗試你所說的,並在我有一些結果後立即回到這裏。謝謝。 – SpaceDog 2014-08-31 01:22:23