gpt4 book ai didi

c++ - 为什么 cv::mat 的 vector 总是返回第一张图像?

转载 作者:行者123 更新时间:2023-11-28 07:02:32 29 4
gpt4 key购买 nike

我正在从网络摄像头读取视频帧并将它们存储在 std::vector < cv::mat > 变量中。

每次我想计算两个连续帧之间的帧差时,我使用以下代码但结果始终为零并且我得到一个零矩阵!我的程序中有两个线程,一个用于读取视频帧,一个用于处理视频帧。 每当我要写入 vector 时,我都会使用互斥锁,以防止在推回或删除帧时出现任何进一步的问题。

这是我的伪代码:

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_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,然后推送到您的 vector ,更改您的代码

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

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

否则您将在每次回退时传递相同的指针。

关于c++ - 为什么 cv::mat 的 vector 总是返回第一张图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22222737/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com