Code:
while (camRunning) {
This is something I've seen quite a lot of and I'm not really sure why people are doing it. The callback is called after the pipeline runs. It's intended to copy the outputs to variables the rest of the robot program can use, and maybe do a little processing on the outputs (like the bounding rects). Putting in a loop will make the vision thread run the pipeline
exactly once and then enter the loop. In your case, the loop only exits if the vision thread was interrupted, which will very likely never happen. So the pipeline will never run again after that first time.
So why did you decide to add a loop? I'd like to improve the documentation so that it's clearer that this is not the right way to do this.
The Javadoc for VisionRunner.Listener, which is what that lambda is