Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Java (http://www.chiefdelphi.com/forums/forumdisplay.php?f=184)
-   -   [Snippet] Using 2+ USBCameras with minimal bandwidth usage (http://www.chiefdelphi.com/forums/showthread.php?t=143868)

kmodos 02-14-2016 06:50 PM

[Snippet] Using 2+ USBCameras with minimal bandwidth usage
 
Hey CD,

I updated my old code that worked with any type of camera to be a bit more extendable, but it only works with USBCameras now.

Imports:
Code:

import java.util.ArrayList;

import com.ni.vision.NIVision;
import com.ni.vision.NIVision.Image;

import edu.wpi.first.wpilibj.CameraServer;
import edu.wpi.first.wpilibj.vision.USBCamera;

Variables:
Code:

/**
 * The image to push to the CameraServer
 */
private Image frame;

/**
 * The list of all attached cameras
 */
private ArrayList<USBCamera> cams;

/**
 * The index of the current camera we are looking at
 */
private int currCam;

/**
 * The current camera we are viewing.
 */
private USBCamera cam;

/**
 * The maximum fps for all of the cameras
 */
private final int MAX_FPS = 15;

/**
 * The quality of image to push back to the driver station. Lower numbers save more bandwidth (0-100)
 */
private final int QUALITY = 10;
       
/**
 * Time to sleep after changing camera views. This is to prevent errors as USBCamera.startCapture() returns before it is ready to be seen
 */
private final long SLEEP_TIME = 100;

init Code:
Code:

cams = new ArrayList<USBCamera>();
frame = NIVision.imaqCreateImage(NIVision.ImageType.IMAGE_RGB, 0);
currCam = 0;
CameraServer.getInstance().setQuality(QUALITY);
for(String s: /*Array of camera names*/){
        addCamera(s);
}
cam = cams.get(currCam);
cam.openCamera();
cam.startCapture();

addCamera method:
Code:

/**
 * Adds the camera to our list to switch between and sets the FPS max
 * @param camName The name of the camera
 */
private void addCamera(String camName){
        USBCamera temp = new USBCamera(camName);
        temp.setFPS(MAX_FPS);
        cams.add(temp);
        temp = null;
}

Loop code:
Code:

cams.get(currCam).getImage(frame);
CameraServer.getInstance().setImage(frame);

Switching Method:
Code:

/**
 * Switch to the next camera in our ArrayList
 */
public void switchCamera(){
        try{
                cam.stopCapture();
                cam.closeCamera();
                currCam++;
                currCam %= cams.size();
                cam = cams.get(currCam);
                cam.openCamera();
                cam.startCapture();
                Thread.sleep(SLEEP_TIME);
        }catch(Exception e){
                e.printStackTrace();
        }
}

As always, feel free to post below or send me a PM if you need help!

zeldathegood 03-20-2016 03:45 PM

Re: [Snippet] Using 2+ USBCameras with minimal bandwidth usage
 
Thanks for posting the code. We gave this a try yesterday but kept getting no robot code after we deployed the code. We didn't have time to debug. We will try again on Monday.

::rtm::


All times are GMT -5. The time now is 07:54 AM.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi