2014-03-06 82 views
0

我正在閱讀攝像頭的視頻幀,並將它們存儲在std :: vector < cv :: mat>變量中。每次我想計算兩個連續幀之間的幀差,我使用下面的代碼,但結果總是零,我得到一個零矩陣!我的程序中有兩個線程,一個用於讀取視頻幀,另一個用於處理視頻幀。每當我要寫入向量時,我都會使用一個互斥體,以防止在推回或移除框架時出現任何其他問題。爲什麼cv :: mat的矢量總是返回第一個圖像?

這裏是我的僞代碼:

std::vector<cv::Mat> IMAGE_VEC; 
Qmutex IMAGE_VEC_MUTEX; 
Main_Thread() 
{ 

while(1) 
{ 
cv::Mat Frame,Reserved_Frame; 
Camera.read(Frame); 
Frame.copyTo(Reserved_Frame); 
QMutexLocker Locker(&IMAGE_VEC_MUTEX); 
IMAGE_VEC.pushback(Reserved_Frame); 
Locker.unlock(); 
cv::imshow("Frame",Frame); 
cv::waitKey(); 
} 
} 

和我的進程線程是:

Process_Thread() 
{ 

    for (; IMAGE_VEC.size() > 1 ;) 
{ 
     cv::Mat frame1; 
     IMAGE_VEC[0].copyTo(frame1); 
     cv::Mat frame2; 
     IMAGE_VEC[1].copyTo(frame2); 
     cv::subtract(frame1,frame2,result); 
     QMutexLocker Locker(&IMAGE_VEC_MUTEX); 
     IMAGE_VEC[0].release(); 
     //qDebug()<<"IMAGE_VEC Step2 size is: "<<IMAGE_VEC.size()<<"\n"; 
     IMAGE_VEC.erase(IMAGE_VEC.begin()); 
     Locker.unlock(); 
} 
} 

我計算了處理線程的平均每幀的標準差,他們總是一樣的!我可以通過將線程進程代碼更改爲此代碼來解決此問題

Process_Thread() 
{ 

    for (; IMAGE_VEC.size() > 1 ;) 
{ 
     cv::Mat frame1; 
     IMAGE_VEC[0].copyTo(frame1); 
     QMutexLocker Locker(&IMAGE_VEC_MUTEX); 
     IMAGE_VEC[0].release(); 
     //qDebug()<<"IMAGE_VEC Step2 size is: "<<IMAGE_VEC.size()<<"\n"; 
     IMAGE_VEC.erase(IMAGE_VEC.begin()); 
     Locker.unlock(); 
     delay_ms(1000); // more than 1 second delay !!! 
     cv::Mat frame2; 
     IMAGE_VEC[0].copyTo(frame2); 
     cv::subtract(frame1,frame2,result); 

} 
} 

爲什麼會發生這種情況?爲什麼應該使用超過1秒的延遲來使此代碼有效?我嘗試了延遲不到1秒,結果如上一步...

我很感激你對此的評論。

回答

1

您可能需要像

cv::Mat Frame; 
Camera.read(Frame); 

Mat tmp=Frame.clone(); //clone frame to new Mat 
IMAGE_VEC.pushback(tmp); 

否則你逝去的同一個指針上的每個反推複製或克隆你的幀到另一個墊,然後推到您的載體,改變你的代碼。

+0

我忘了提及我也這樣做了,但結果仍然像上面的代碼...我已將代碼更改爲您的樣式以防止任何歧義 – PsP

+0

另外,爲什麼在第二個版本中加入延遲問題將得到解決?我不想在我的代碼中使用這麼大的延遲....! – PsP

+0

確保每次都沒有傳遞相同的幀,您可以通過在抓取每幀後在幀上編寫幀號並從其他線程檢查幀來測試它。 – Haris

相關問題