2014-10-16 64 views
0

我正在使用C++和opencv在linux上編碼。我發現了this類似的問題;雖然,我不能完全實現它的工作。從視頻文件的墊陣列 - opencv

我想要做的是讀取一個視頻文件,並在數組中存儲一定數量的幀。在這個數字上,我想刪除第一幀並將最近的幀添加到數組的末尾。

這是我的代碼到目前爲止。

VideoCapture cap("Video.mp4"); 
int width = 2; 
int height = 2; 
Rect roi = Rect(100, 100, width, height); 

vector<Mat> matArray; 
int numberFrames = 6; 
int currentFrameNumber = 0; 

for (;;){ 

    cap >> cameraInput; 
    cameraInput(roi).copyTo(finalOutputImage); 

    if(currentFrameNumber < numberFrames){ 
     matArray.push_back(finalOutputImage); 
    }else if(currentFrameNumber <= numberFrames){ 
     for(int i=0;i<matArray.size()-1; i++){ 
      swap(matArray[i], matArray[i+1]); 
     } 
     matArray.pop_back(); 
     matArray.push_back(finalOutputImage); 
    } 

    currentFrameNumber++; 
} 

我對墊子的理解說這可能是指針問題;我只是不知道如何解決它。當我查看墊子陣列時,每個元素都是同一個框架。謝謝。

+0

如果你想使用數組來存儲'numberFrames'最後一幀,爲什麼你要使用'} else if(currentFrameNumber <= numberFrames){'?如果'currentFrameNumber> numberFrames'會阻止任何事情發生,這將會發生得非常快。所以我會說,無論視頻有多長時間,你只是存儲第1-6幀(不包括0)。 – Pafka 2014-10-16 19:32:49

+0

Mat只是一個智能指針,你從捕獲得到的東西指向* static *內存。你想要的是:'matArray.push_back(finalOutputImage.clone());' – berak 2014-10-16 20:07:41

+0

@Pafka謝謝你指出我的錯字。它應該是一個超過標誌。仍然沒有解決這個問題,但是貝拉克說的確如此。 – tierratheseeress 2014-10-17 20:45:03

回答

2

如果您要使用C++的高度有用的STL,則不需要所有這些複雜的東西。

if(currentFrameNumber >= numberFrames) 
    matArray.remove(matArray.begin()); 
matArray.push_back(finalOutputImage.clone());  //check out @berak's comment 

應該這樣做。

+0

包括.clone()可以解決所有顯示相同框架的問題。當我構建它時,出現「刪除無法解決」的錯誤。 做了一些研究。這是需要使用的.erase。感謝您幫助清理我的代碼。 – tierratheseeress 2014-10-17 20:51:55

+0

我不確定這是爲什麼。檢查出來:http://stackoverflow.com/questions/19296958/difference-between-stdremove-and-erase-for-vector – 2014-10-18 01:16:56