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中如何将从视频中抓取的帧释放掉的主要内容,如果未能解决你的问题,请参考以下文章