视频前景提取 (II)【IplImage版本】

简介:

以下代码可以求出视频的前景,用的方法就是拿第一帧做差分。。。

但是以下代码有个致命的问题,那就是在视频帧处理的过程中,不断的create却不释放内存,导致了内存溢出。。

#include "cv.h"
#include "highgui.h"
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>
 
#ifdef _EiC
#define WIN32
#endif
 
static CvMemStorage* storage = 0;
 
int main()
{
    CvCapture* capture = 0;
    IplImage *frame, *frame_copy = 0,*img1=NULL;
    char* input_name;
 
	input_name = "002.avi";
  
    storage = cvCreateMemStorage(0);
 
    if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') )
		//直接从摄像头读入
        capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );
    else
		//从AVI视频读入
        capture = cvCaptureFromAVI( input_name ); 
 
    cvNamedWindow( "result", 1 );
 
	int flag=0;
    if( capture )
    {
		//如果捕捉到帧了
		//对每一帧做处理

        for(;;)
        {
			if( !cvGrabFrame( capture ))
				break;
            frame = cvRetrieveFrame( capture );
            if( !frame )
                break;
            
			if(flag==0)
			{
				//捕捉第一帧
				frame_copy = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U, frame->nChannels );
				cvCopy(frame,frame_copy,0);
				flag=1;
			}

			img1 = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U, frame->nChannels );

			cvAbsDiff(frame,frame_copy,img1);

			cvShowImage( "src", frame );
			cvShowImage( "result", img1 );
 
 
			//10ms中按任意键进入此if块
            if( cvWaitKey( 10 ) >= 0 )
                break;
        }
 
        cvReleaseImage( &frame_copy );
		cvReleaseImage( &img1 );
        cvReleaseCapture( &capture );
    }
    
	cvDestroyWindow("src");
    cvDestroyWindow("result");
 
    return 0;
}


为了解决这个问题,可以在开始的时候设置标志位,只在第一次的时候create图片:


#include "cv.h"
#include "highgui.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>

#ifdef _EiC
#define WIN32
#endif


int main()
{
	CvCapture* capture = 0;
	IplImage *frame, *frame_copy = 0,*img1=NULL;
	char* input_name;

	input_name = "001.avi";

	if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') )
		//直接从摄像头读入
		capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );
	else
		//从AVI视频读入
		capture = cvCaptureFromAVI( input_name ); 

	cvNamedWindow( "result", 1 );

	int flag=0;
	if( capture )
	{
		//如果捕捉到帧了
		//对每一帧做处理

		for(;;)
		{
			if( !cvGrabFrame( capture ))
				break;
			frame = cvRetrieveFrame( capture );
			if( !frame )
				break;

			if(flag==0)
			{
				//捕捉第一帧
				if( !frame_copy )
					frame_copy = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U, frame->nChannels );

				if( frame->origin == IPL_ORIGIN_TL )  
					cvCopy( frame, frame_copy, 0 );  
				else  
					cvFlip( frame, frame_copy, 0 );

				flag=1;
			}


			//为NULL就create一次,不然内存会溢出
			if( !img1 )
				img1 = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U, frame->nChannels );

			cvAbsDiff(frame,frame_copy,img1);

			cvShowImage( "src", frame );
			cvShowImage( "result", img1 );


			//10ms中按任意键进入此if块
			if( cvWaitKey( 10 ) >= 0 )
				break;
		}

		cvReleaseImage( &frame_copy );
		cvReleaseCapture( &capture );

		//不用释放,因为开始的时候没有显式分配内存
		//cvReleaseImage( &frame );
		//cvReleaseImage( &img1 );
	}

	cvDestroyWindow("src");
	cvDestroyWindow("result");

	return 0;
}


相关文章
|
11月前
|
数据挖掘 计算机视觉 Python
Python数据分析中图像处理的实用技术点:图像加载与保存、图像转换与增强、特征提取与描述
Python数据分析中图像处理的实用技术点:图像加载与保存、图像转换与增强、特征提取与描述
89 1
Python数据分析中图像处理的实用技术点:图像加载与保存、图像转换与增强、特征提取与描述
|
机器学习/深度学习 自然语言处理 文字识别
【计算机视觉】CLIP:连接文本和图像(关于CLIP的一些补充说明)
我们推出了一个名为CLIP的神经网络,它可以有效地从自然语言监督中学习视觉概念。CLIP可以应用于任何视觉分类基准,只需提供要识别的视觉类别名称,类似于GPT-2和GPT-3的“零样本”功能。
|
机器学习/深度学习 传感器 人工智能
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(下)
本文对现有的全景分割方法进行了第一次全面的综述。因此,基于所采用的算法、应用场景和主要目标的性质,对现有全景技术进行了定义良好的分类。此外,还讨论了全景分割在通过伪标记标注新数据集中的应用。接下来,进行消融研究,以从不同角度了解全景方法。此外,还讨论了适用于全景分割的评估指标,并对现有解决方案的性能进行了比较,以了解最新技术并确定其局限性和优势。最后,阐述了当前主题技术面临的挑战以及近期吸引大量关注的未来趋势,这可以作为未来研究的起点。
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(下)
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
150 1
|
6月前
|
算法 数据挖掘
[Halcon&图像] 阈值分割算法拓展
[Halcon&图像] 阈值分割算法拓展
120 1
|
计算机视觉
OpenCV-扩充图像边界cv::copyMakeBorder
OpenCV-扩充图像边界cv::copyMakeBorder
163 0
|
人工智能 文字识别 PyTorch
数学公式识别(Mathpix + pix2tex)
数学公式识别(Mathpix + pix2tex)
564 0
|
机器学习/深度学习 传感器 人工智能
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(上)
本文对现有的全景分割方法进行了第一次全面的综述。因此,基于所采用的算法、应用场景和主要目标的性质,对现有全景技术进行了定义良好的分类。此外,还讨论了全景分割在通过伪标记标注新数据集中的应用。接下来,进行消融研究,以从不同角度了解全景方法。此外,还讨论了适用于全景分割的评估指标,并对现有解决方案的性能进行了比较,以了解最新技术并确定其局限性和优势。最后,阐述了当前主题技术面临的挑战以及近期吸引大量关注的未来趋势,这可以作为未来研究的起点。
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(上)
|
自然语言处理 计算机视觉 C++
图像基础二(上)
图像基础二(上)
157 0
图像基础二(上)
|
图形学 iOS开发
Unity【Face Cap】- 关于人脸捕捉的解决方案(二)
Unity【Face Cap】- 关于人脸捕捉的解决方案(二)
773 0
Unity【Face Cap】- 关于人脸捕捉的解决方案(二)