C++ 为什么cv::mat的向量总是返回第一个图像?
我正在从网络摄像头读取视频帧,并将其存储在std::vectorC++ 为什么cv::mat的向量总是返回第一个图像?,c++,multithreading,qt,opencv,C++,Multithreading,Qt,Opencv,我正在从网络摄像头读取视频帧,并将其存储在std::vector变量中 每次我想计算两个连续帧之间的帧差时,我都会使用下面的代码,但结果总是零,我得到一个零矩阵!!我的程序中有两个线程,一个用于读取视频帧,另一个用于处理视频帧。 每当我要写入向量时,我都会使用互斥,以防止在推回或删除帧时出现任何进一步的问题 这是我的伪代码: std::vector<cv::Mat> IMAGE_VEC; Qmutex IMAGE_VEC_MUTEX; Main_Thread() { while(1
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();
}
}
std::vector IMAGE\u VEC;
Qmutex-IMAGE\u-VEC\u互斥体;
主螺纹()
{
而(1)
{
cv::垫框、预留框;
摄像机读取(帧);
帧。复制到(保留的帧);
QMutexLocker锁柜(&IMAGE\u VEC\u MUTEX);
图像矢量推回(保留帧);
Locker.unlock();
cv::imshow(“帧”,帧);
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_Thread()
{
对于(;IMAGE_VEC.size()>1;)
{
cv::Mat-frame1;
图像向量[0]。复制到(帧1);
cv::Mat-frame2;
图像向量[1]。复制到(第2帧);
cv::减法(第1帧、第2帧、结果);
QMutexLocker锁柜(&IMAGE\u VEC\u MUTEX);
IMAGE_VEC[0]。release();
//qDebug()您可能需要将您的帧复制或克隆到另一个Mat,然后推到矢量,更改代码,如
cv::Mat Frame;
Camera.read(Frame);
Mat tmp=Frame.clone(); //clone frame to new Mat
IMAGE_VEC.pushback(tmp);
否则,您将在每次回推时传递相同的指针。我忘了提到我也这样做了,但结果仍然与上面的代码类似……我已将代码更改为您的风格,以防止任何歧义。那么,为什么在第二个版本中添加延迟可以解决问题?我不想在代码中使用如此大的延迟。。。。!确保您每次都没有通过相同的帧,您可以在抓取后在每个帧上写入帧编号并从其他线程检查它来测试它。将帧编号添加到每个帧是什么意思?您的意思是我应该将一些数字添加到标题中?oooooops这是相同的帧!!!!我的原始代码之间的唯一区别是nd发布的代码是保留帧是一个全局变量。这是问题的根源吗?如果是,为什么延迟超过1秒会解决它?我的帧速率是30,所以每33毫秒我就有一个新帧存储在向量中。。。。
cv::Mat Frame;
Camera.read(Frame);
Mat tmp=Frame.clone(); //clone frame to new Mat
IMAGE_VEC.pushback(tmp);