jueves, 13 septiembre 2007

Viewing and storing images from an IP Camera

« java.lang.OutOfMemoryError: PermGen space // More memory for Tomcat under windows | Main | Reading UTF-8 encoded documents in java »

So you bought an IP camera and would like to store/see images from the camera using java. Recently I bought a couple of IP Cameras for testing purposes. I noticed that each IP camera has different surveillance tools and web interfaces. But most of them have in common that you can access the actual picture by entering an url in your browser.

In this post I'll show you how to see that image and store it using a very simple jav application. The camera I'll use for the test is a LinkSys WVC200 "Wireless PTZ Internet Camera with Audio". This is the cheapest wireless IPcam I found with at least
some decent features.

WVC200

This camera has a nice web interface but for visualization purposes you will need to be sitting in front of a windows desktop. This camera as many others uses an activeX control to show/control the image. The thing is that LinkSys is kind enough to offer the camera's Firmware source code.

If you analyze the source code you can find some clues to get the URL where the static image is served (there's an url for video too ASF format, with some time you can develop an app to store and play the video). In the case of this camera is "http://CAMERAIP/img/snapshot.cgi?size=640x480".

With this information we can build an application to grab the image and show/store the image. If you have another type of camera, you can adapt the program by specifying the url.

>try {
    /* Build a new URL specifying the path to where the image
    * is served */
    URL url = new URL ("http://192.168.10.80/img/snapshot.cgi?size=640x480");
    /*String with the user and password to access the camera interface
    *(userName and password that you would enter in the browser*/
    String userPassword =  "USER:PASSWORD";
    /* We must encode with Base64 to supply it with the header.*/
    String encoding = new Base64Encoder(userPassword).processString();
    /*Open the connection*/
    URLConnection uc = url.openConnection();
    /* Specify the authorization*/
    uc.setRequestProperty ("Authorization", "Basic " + encoding);
    /* Load a copy of the image into memmory */
    BufferedImage img = ImageIO.read(uc.getInputStream());
    /* Show the image in a JLabel */
    jLImagen.setIcon(new ImageIcon(img));
    /* Store the image in the specified path*/
    ImageIO.write(img, "jpg", new File("pathToFile"));
} catch (MalformedURLException ex) {
    ex.printStackTrace();
} catch (IOException ex) {
    ex.printStackTrace();
}

Extending this simple application or adding some functionality can bring a very good surveillance application. If you analyze most commercial surveillance applications to use with different ipCameras you'll notice that although they are very expensive the core of the application is similar to the 10 lines of code above.

Technorati Tags:

Posted by admin at 12:19 PM in Java

 

[Trackback URL for this entry]

Comment: cc at jue, 27 sep 11:15 PM

What kind of performance can you get with
the above code?
Can you get 15fps?

Thanks.

Comment: Marc at vie, 28 sep 8:37 AM

Hi 'CC'
The problem with the above code is that each time you get a photo you must open a new connection/request which takes some time, depending on the network (but even with good Intranets, it's slow). It would be the same as pressing the refresh [F5] button in your browser. This is why most cameras offer another type of stream, normally an mjpg (aka many jpg images joint together in one file). If you need such a quick refresh rate (15 fps) you can study capturing the mjpg stream and then separating each jpg from the stream. It's more complicated but possible.
To do this you should analayze the input stream and search for the BOMof a jpg then save that part of the stream to a separate jpg file.
You can also try to find a library that can process mjpg or any other type of stream.

Regards

Comment: IP Camera Guru at mar, 11 nov 8:52 PM

This is a great tool. The only problem is the static image can sometimes be password protected along with viewing the camera video. The way to get around this is via the FTP feature of the camera.

Your comment:

(not displayed)
 

SCode

Please enter the code as seen in the image above to post your comment.

 
 

Live Comment Preview:

 
Google
 
« September »
SunMonTueWedThuFriSat
      1
2345678
9101112131415
16171819202122
23242526272829
30