opencv中如何将从视频中抓取的帧释放掉

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv中如何将从视频中抓取的帧释放掉相关的知识,希望对你有一定的参考价值。

实时从摄像头中提取每一帧图像进行处理,但是每一帧图像都会存在内存中,时间一长就会发生内存溢出,求教各位大神怎样将用过的每一帧图像释放掉,thanks!!!

参考技术A Mat frame;
frame.release();追问

我定义的结构是这样的IplImage* frame
然后获取每一帧是这样获得的frame = cvQueryFrame( capture );

追答

cvRelease(frame);
frame=NULL;
上面的方法是高版本的

追问

好像不可以吧,我这样试过,不是同一个数据结构会报错 error C2664: “cvRelease”: 不能将参数 1 从“IplImage **”转换为“void **”

追答

汗。。。这些小问题网上不是很多吗?我记错了是
cvReleaseImage
函数

追问

好吧,怨我没说清楚,改成这个虽然程序没有报错,但运行后直接会中断的,用户手册上有说函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。
所以我才很纠结到底要怎样释放内存

追答

你释放了,你必须开辟一个内存空间,否则不就报错了

追问

非常感谢你,不过我们可能说的不是一个问题,我再研究一下吧

将从视频中获得的帧分割成单独的通道

【中文标题】将从视频中获得的帧分割成单独的通道【英文标题】:Split frames obtained from video into separate channels 【发布时间】:2016-02-23 11:52:18 【问题描述】:

我正在尝试逐帧读取视频 (mp4),然后将帧从 BGR 转换为 HSV。 然后我想将 HSV 垫分成不同的通道(色调、饱和度、值)。

但是,这不起作用:

void colorize () 

VideoCapture cap("myFile.mp4");
Mat frame;
Mat frame2;



while (true) 
    cap>>frame;
    cvtColor(frame, frame2, CV_BGR2HSV);
    Vector<Mat> channels;
    split(frame2, channels);




   

拆分函数给出以下错误:

no matching function for call to ‘split(cv::Mat&, cv::Vector<cv::Mat>&)’
     split(frame2, channels);

我已经在循环之外尝试了与我之前转换为 hsv 的另一个图像完全相同的代码,它工作正常,所以我认为问题一定是循环。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您使用的是cv::Vector,而您应该使用std::vector(注意小写v)。

std::vector<Mat> channels; // std::vector, not cv::Vector
split(frame2, channels);

【讨论】:

我会在 7 分钟内接受,*** 不会让我更早。同时,为什么我必须使用 std::vector? cv::Vector 在循环外工作得很好? 你确定吗?即使在循环之外,使用 cv::Vector 也不应该工作。 我的错。现在我有点为这个问题感到羞耻。 明确的问题,简单的解决方案。现在大家都很开心;D

以上是关于opencv中如何将从视频中抓取的帧释放掉的主要内容,如果未能解决你的问题,请参考以下文章

opencv 提取avi视频中的帧,逐帧播放

如何减少OpenCV python中的帧数?

opencv 如何能把从摄像头中抓取的两帐图片进行精确比较?

将相机中的帧写入OpenCV中的单个图像

OpenCV 不报告准确的帧速率/计数

视频文件中的垫子数组 - opencv