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