簡體   English   中英

為什么向量cv :: mat總是返回第一個圖像?

[英]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.

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