opencv and c++ visual studio 2012
opencv and c++ visual studio 2012
我有这个代码,它工作良好。
当视频长度小于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
。然后,您不需要考虑释放内存,因为它自己会做所有的事情。
相关文章:
- 使用Visual Studio 2012编译时,此代码会给我错误,但是使用代码块就可以了
- 在 Visual Studio 2012 中未命中断点
- C Visual Studio 2012 Express命令窗口怪异行为
- Visual Studio 2012静态图书馆与Visual Studio 2017
- C 11魔术静态在Visual Studio 2012中的解决方法
- 在 Visual Studio 2012 中使用 "= delete" 时出现编译器错误
- Visual Studio (2012) 更改 dll 以导出类和变量
- 资源窗口在其他系统上无法正常工作 (Visual Studio 2012)
- C++函数中的内存泄漏,Visual Studio 2012,链表
- 两个不同的标题GCC,Visual Studio 2012
- gdal201.dll在Visual Studio 2012上的计算机错误中缺少
- Visual Studio 2012中可用覆盖的列表
- Windows 10中的Visual Studio 2012:找不到或打开PDB文件
- 在 64 位 Windows 8 机器上使用 Visual Studio 2012 构建 opencv 的绝对解决方案
- 如何在 Visual Studio 2012 中禁用大括号完成
- 如何在Visual Studio 2012中使用sqlite
- GLFW 链接问题 Visual Studio 2012.
- 使用Visual Studio 2012针对Windows XP构建Boost 1.52库
- 特定于域的语言工具 Visual Studio 2012 输出C++
- 生产力 Microsoft Visual Studio 2012 的电源工具不起作用