[英]why a vector of cv::mat always return the first image?
我正在從網絡攝像頭讀取視頻幀,並將其存儲在std :: vector <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線程中每幀的平均值和標准偏差,它們始終相同! 我可以通過將線程處理代碼更改為此代碼來解決此問題
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秒的延遲,結果如上一步所示...
非常感謝您對此發表評論。
您可能需要將框架復制或克隆到另一個Mat,然后推入向量,更改代碼,例如
cv::Mat Frame;
Camera.read(Frame);
Mat tmp=Frame.clone(); //clone frame to new Mat
IMAGE_VEC.pushback(tmp);
否則,您將在每次推回傳遞相同的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.