我正在从网络摄像头读取视频帧并将它们存储在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秒的延迟,结果就像上一步......
我很感激您对此的评论。
答案 0 :(得分:1)
您可能需要将框架复制或克隆到另一个垫子,然后推送到您的矢量,更改您的代码,如
cv::Mat Frame;
Camera.read(Frame);
Mat tmp=Frame.clone(); //clone frame to new Mat
IMAGE_VEC.pushback(tmp);
否则你在每个后推上传递相同的指针。