opencv and c++ visual studio 2012

opencv and c++ visual studio 2012

本文关键字:studio 2012 visual c++ and opencv      更新时间:2023-10-16

我有这个代码,它工作良好。

当视频长度小于1分钟,视频大小为165 KB时当我更改视频长度为2分钟,大小为15mb或另一个相同长度,大小为5mb的视频时,它显示给我

项目已停止工作

this my code

# include "windows.h" 
# ifdef _CH_ 
# pragma package < opencv > 
# endif 
# include "windows.h" 
# ifndef _EiC 
# include "cv.h" 
# include "cvAux.h" 
# include "highgui.h" 
# include "cxcore.h" 
# include < stdio.h > 
# include < ctype.h > 
# endif 

// x?y?
int getpixel ( IplImage * image , int x , int y , int * h , int * s , int * v ) { 
* h = ( uchar ) image -> imageData [ y * image -> widthStep + x * image -> nChannels ] ; 
* s = ( uchar ) image -> imageData [ y * image -> widthStep + x * image -> nChannels + 1 ] ; 
* v = ( uchar ) image -> imageData [ y * image -> widthStep + x * image -> nChannels + 2 ] ; 
return 0 ; 
} 
//-------------------------------------------------------------------------------- 

int main ( int argc , char * * argv ) { 
CvCapture * capture = cvCaptureFromAVI("a.avi") ; 
IplImage * image = 0; 
IplImage * HSV = 0 ; 
/*
IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // convert IplImage* -> Mat
*/
if ( argc == 1 || ( argc == 2 && strlen ( argv [ 1 ] ) == 1 && isdigit ( argv [ 1 ] [ 0 ] ) ) ) { 
//capture = cvCaptureFromCAM ( argc == 2 ? argv [ 1 ] [ 0 ] - '0' : 0 ) ; 
} 
else if ( argc == 2 ) { 
//capture = cvCaptureFromAVI ( argv [ 1 ] ) ; 
} 
if ( !capture ) { 
fprintf ( stderr , "Could not initialize capturing.../n" ) ; 
return - 1 ; 
} 
printf ( "Hot keys: /n" "/tESC - quit the program/n" ) ; 
//Normal
cvNamedWindow ( "Normal" , CV_WINDOW_AUTOSIZE ) ; 

//Condensation------------------------------------------------- 
int DP = 2 ; // 
int MP = 2 ; // 
int SamplesNum = 300 ; // 

CvConDensation * ConDens = cvCreateConDensation ( DP , MP , SamplesNum ) ; 
//----------------------------------------------------------------------- 

//Condensation----------------------------------- 
CvMat * lowerBound ; // 
CvMat * upperBound ; // 
lowerBound = cvCreateMat ( 2 , 1 , CV_32F ) ; 
upperBound = cvCreateMat ( 2 , 1 , CV_32F ) ; 
//640*480 
cvmSet ( lowerBound , 0 , 0 , 0.0 ) ; 
cvmSet ( upperBound , 0 , 0 , 640.0 ); 
cvmSet ( lowerBound , 1 , 0 , 0.0 ) ; 
cvmSet ( upperBound , 1 , 0 , 480.0 ) ; 
cvConDensInitSampleSet ( ConDens , lowerBound , upperBound ) ; 
//----------------------------------------------------------------------- 

//------------------------------ 
for ( int i = 0 ; i < SamplesNum ; i++ ) { 
ConDens -> flSamples [ i ] [ 0 ] += 320.0 ; 
ConDens -> flSamples [ i ] [ 1 ] += 240.0 ; 
} 
//----------------------------------------------------------------------- 

//---------------------------- 
ConDens -> DynamMatr [ 0 ] = 1.0 ;
ConDens->DynamMatr [ 1 ] = 0.0 ; 
ConDens -> DynamMatr [ 2 ] = 0.0 ;
ConDens->DynamMatr [ 3 ] = 1.0 ; 
//----------------------------------------------------------------------- 

for ( ;; ) { 
IplImage* frame = 0 ; 
int c ; 
int X , Y , XX , YY ; 
int H , S , V ; 
frame = cvQueryFrame ( capture ) ; 
if ( !frame ) { 
break ; 
} 
if ( !image ) { 
image = cvCreateImage ( cvGetSize ( frame ) , 8 , 3 ) ; 
image -> origin = frame -> origin ; 
HSV = cvCreateImage ( cvGetSize ( frame ) , 8 , 3 ) ; 
HSV -> origin = frame -> origin ; 
} 
cvCopy ( frame , image , 0 ) ; 
cvCvtColor ( image , HSV , CV_BGR2HSV ) ; 
//?--------------------------------------------------- 
for ( int i = 0 ; i < SamplesNum ; i++ ) { 
X = ( int ) ConDens -> flSamples [ i ] [ 0 ] ; 
Y = ( int ) ConDens -> flSamples [ i ] [ 1 ] ; 
if ( X >= 0 && X <= 640 && Y >= 0 && Y <= 480 ) { //
getpixel ( HSV , X , Y , &H , &S , & V ) ; 
if ( H <= 19 && S >= 48 ) { // //H<=19 S>=48 
cvCircle ( image , cvPoint ( X , Y ) , 4 , CV_RGB ( 255 , 0 , 0 ) , 1 ) ; 
ConDens -> flConfidence [ i ] = 1.0 ; 
} 
else { 
ConDens -> flConfidence [ i ] = 0.0 ; 
} 
} 
else { 
ConDens -> flConfidence [ i ] = 0.0 ; 
} 
} 
//-------------------------------------------------------------------------- 

//
cvConDensUpdateByTime ( ConDens ) ; 
cvShowImage ( "Normal" , image ) ; 
c = cvWaitKey ( 20 ) ; 
if ( c == 27 ) { 
break ; 
} 
} 
//------------------------------------ 
cvReleaseImage ( &image ) ; 
cvReleaseImage ( &HSV ) ; 
cvReleaseConDensation ( &ConDens ) ; 
cvReleaseMat ( &lowerBound ) ; 
cvReleaseMat ( &upperBound ) ; 
cvReleaseCapture ( &capture ) ; 
cvDestroyWindow ( "Normal" ) ; 
//--------------------------------------------- 

return 0 ; 
} 
# ifdef _EiC 
main ( 1 , "condensation.cpp" ) ; 
# endif 

也当你注释这个

  for ( int i = 0 ; i < SamplesNum ; i++ ) { 
    X = ( int ) ConDens -> flSamples [ i ] [ 0 ] ; 
    Y = ( int ) ConDens -> flSamples [ i ] [ 1 ] ; 
    if ( X >= 0 && X <= 640 && Y >= 0 && Y <= 480 ) { //
    getpixel ( HSV , X , Y , &H , &S , & V ) ; 
    if ( H <= 19 && S >= 48 ) { // //H<=19 S>=48 
    cvCircle ( image , cvPoint ( X , Y ) , 4 , CV_RGB ( 255 , 0 , 0 ) , 1 ) ; 
    ConDens -> flConfidence [ i ] = 1.0 ; 
    } 
    else { 
    ConDens -> flConfidence [ i ] = 0.0 ; 
    } 
    } 
    else { 
    ConDens -> flConfidence [ i ] = 0.0 ; 
    } 
    } 

程序工作不做我的想法跟踪对象

我有Windows 8

如果有不明白的地方请评论

我认为问题与for loop里面的IplImage *frame申报有关。当你的视频长度增加时,你的内存就会被填满。因为您不断地在for loop中创建新的frames,而没有释放分配给它们的内存。

应该在for loop之外声明IplImage *frame,然后在for loop之外释放分配给它的内存。

建议:不要使用OpenCV的旧c标准。使用新的c++标准,必须将图像声明为Mat image。然后,您不需要考虑释放内存,因为它自己会做所有的事情。