Hopefully this isn’t old news to everyone…
Our code was running fine at SFR but once we got the robot unbagged at SVR it kept crashing every ~30 seconds after code start with an OpenCV memory allocation error. Thanks to the wonderful CSAs here, we figured out that we had a memory leak in our custom camera streaming/ switching code (cscore’s UsbCameras, etc…). If you’re doing anything with Mats for camera streaming or vision, make sure you use
mat.release();
once you’re done with it. You can check your free roboRIO RAM in the second tab of driver station.
You will see in my previous post to the java-2-lifecams thread that it is feasible to resuse a mat. Not certain, perhaps because I avoided ever calling .setSource() ?
Here’s a fragment of our Java code where we create a Mat before entering the loop, then use imageSink.grabFrame to populate the Mat on each iteration:
CvSink imageSink = new CvSink("CV Image Grabber");
imageSink.setSource(camera);
// All Mats and Lists should be stored outside the loop to avoid allocations
// as they are expensive to create
Mat inputImage = new Mat();
GripPipeline pipe = new GripPipeline();
// Infinitely process image
while (true) {
// Grab a frame. If it has a frame time of 0, there was an error.
// Just skip and continue
long frameTime = imageSink.grabFrame(inputImage);