为什么cv :: mat的向量总是返回第一个图像?

时间:2014-03-06 11:12:07

标签: c++ multithreading qt opencv

我正在从网络摄像头读取视频帧并将它们存储在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秒的延迟,结果就像上一步......

我很感激您对此的评论。

1 个答案:

答案 0 :(得分:1)

您可能需要将框架复制或克隆到另一个垫子,然后推送到您的矢量,更改您的代码,如

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

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

否则你在每个后推上传递相同的指针。