如何停止for循环(OpenCV)

时间:2013-04-24 12:48:25

标签: opencv memory-management for-loop memory-leaks processing

我正在使用Processing(processing.org)来处理需要面部跟踪的项目。现在的问题是由于for循环,程序将耗尽内存。我想停止循环或至少解决内存不足的问题。这是代码。

import hypermedia.video.*;
import java.awt.Rectangle;


OpenCV opencv;

// contrast/brightness values
int contrast_value    = 0;
int brightness_value  = 0;



void setup() {

size( 900, 600 );

opencv = new OpenCV( this );
opencv.capture( width, height );                   // open video stream
opencv.cascade( OpenCV.CASCADE_FRONTALFACE_ALT );  // load detection description, here-> front face detection : "haarcascade_frontalface_alt.xml"


// print usage
println( "Drag mouse on X-axis inside this sketch window to change contrast" );
println( "Drag mouse on Y-axis inside this sketch window to change brightness" );

}


public void stop() {
    opencv.stop();
    super.stop();
}



void draw() {

// grab a new frame
// and convert to gray
opencv.read();
opencv.convert( GRAY );
opencv.contrast( contrast_value );
opencv.brightness( brightness_value );

// proceed detection
Rectangle[] faces = opencv.detect( 1.2, 2, OpenCV.HAAR_DO_CANNY_PRUNING, 40, 40 );

// display the image
image( opencv.image(), 0, 0 );

// draw face area(s)
noFill();
stroke(255,0,0);
for( int i=0; i<faces.length; i++ ) {
    rect( faces[i].x, faces[i].y, faces[i].width, faces[i].height ); 
}
}

void mouseDragged() {
contrast_value   = (int) map( mouseX, 0, width, -128, 128 );
brightness_value = (int) map( mouseY, 0, width, -128, 128 );
}

谢谢!

1 个答案:

答案 0 :(得分:1)

几点......

1正如George在评论中提到的,您可以减小捕获区域的大小,这将指数减少草图用于分析面部跟踪的RAM量。尝试制作两个名为CaptureWidth和CaptureHeight的全局变量,并将它们设置为320和240 - 这对此完全足够了。

2您可以在Java虚拟机中增加草图默认使用的内存量。我认为处理默认为128,但是如果你进入首选项,你会看到一个复选框“将最大可用内存增加到[x]”...我通常会将其设为1500 mb,但这取决于你的机器你能做什么处理。除非你在64位机器上并且在64位模式下使用Processing 2.0,否则不要试图使它大于1800mb ...

3要实际打破循环...使用'break'命令http://processing.org/reference/break.html ...但请理解为什么你想先使用它,因为这只会让你跳过离开你的循环。

4如果你只想显示一定数量的面,你可以测试面[i] == 1等等,这可能有帮助......

但我认为循环本身不是罪魁祸首,更可能是内存占用。从建议1开始2并报告回来......