Software

What you will find here is some of the software that I have developed through the years. Unfortunately I was unable to update and maintain them all, so downloading is in fact not always useful anymore. Maybe, someday, I will have time to continue some of the projects...

The Mesopotamian Cylinder Seal - iOS App

This is an iOS App for iPod, iPad and iPhone whicht lets you interactively rotate a seal on your mobile touch device.
You can go to the App store, and download using iTunes [5Mb]
or read more information here.

Web based sequence viewer

Download the code version 0.4 [~1Mb zip file],
includes small example.


This JavaScript (jQuery plugins) alows you to view the images of the rotating object as acquired by the Syracuse software above.

View the example.

Note: You can also view the same example images using a Java Applet. I discontinued the development of this applet because of the tight memory constrains and image access restictions.


Using the Javascript code for your own sequences

You can see how it works by reading the example code, which is also included in the download.
For an existing html page to include the sequence, the following steps are needed.
  1. Add the style and script elements to the top of the head section
    <!-- use Google Code to load jQuery -->
    <script src="http://www.google.com/jsapi"></script>  
    <script type="text/javascript">
    	google.load("jquery", "1.2.6"); // jQuery basis
    	google.load("jqueryui", "1.5.2"); // jQuery UI - for the slider 
    </script>
    <!-- style sheets and js-code for the plugins, 
    you need to have these files -->
    <link rel="stylesheet" href="js/css/jquery-objectsequencecontrol.css" 
    type="text/css" media="screen"/>
    <script type="text/javascript" src="js/jquery.objectsequencecontrol.js">
    </script>
    <link rel="stylesheet" href="js/css/jquery-objectsequenceviewer.css" 
    type="text/css" media="screen"/>
    <script type="text/javascript" src="js/jquery.objectsequenceviewer.js">
    </script>
    

  2. Add the jQuery code (inside script tags) which sets up the plugins.
    Note that "#id_control1" and "#id_view1" correspond to the id's of the div elements described by the next step.
    jQuery.noConflict(); 
    // Alows you to work with other libraries without naming conflicts
    
    // jQuery main entrance
    jQuery(document).ready(function(){
    	var control1 = jQuery("#id_control1").objectsequencecontrol({
    		maxcounter: 59, 
    		delay: 30, 
    		animationtype: "swing"});
    	var view1 = jQuery('#id_view1').objectsequenceviewer({
    		folder: "small/",
    		basename: "scan_",
    		maxcounter: 60, 
    		initialposition: 30, 
    		rotationaxis: "horizontal",
    		pixelsperimage: 2, 
    		animationtype: "swing"}).
    		bind("initialized", function(event){
    			control1.setindex(view1.getindex());
    			control1.width(view1.width()); 
    		});
    	control1.setindex(view1.getindex());	
    	control1.width(view1.width()); 
    	
    	control1.bind("changed", function(event,i){
    		view1.setindex(i);
    	});
    	view1.bind("changed", function(event,i){
    		control1.setindex(i);
    	});
    });
    

  3. Add the div elements inside your html body
    <!-- the div's used by the plugins-->
    <div id="id_control1"></div>
    <div id="id_view1"></div> 
    

  4. Change the options inside the script code of step 2.
    Objectsequencecontrol options
    nametypedescription
    maxcounterintegerThe maximum counter number.
    It is a zero based index , for 60 images it must be 59.
    delayintegerThe number of millisecond to pause between two succesive images while animating.
    Larger slows animation dow, lower speeds it up.
    animationtypeStringSpecifies how to traverse the images when animating.(with the play button)
    With "swing" the animation direction reverses when the end or beginning of the sequence is reached..
    With "loop" the animation continues at the start when the end is reached, usefull for full 360 degrees rotating objects.

    Objectsequenceviewer options
    nametypedescription
    folderStringThe path to the folder containing the image files.
    It must end with a slash like in the example: "small/"
    basenameStringSpecifies the base or first part of the image filenames.
    The file name is assumed to be composed of a base followed by a zero padded counter, a dot and then the extension which must be jpg.
    For example in "scan_0002.jpg", the basename is "scan_".
    Note that the numbering must also start at 1 and the counter must be padded up to 4 digits.
    maxcounterintegerThe maximum counter number used for the image filename.
    It is a one based index , for 60 images it must be 60.
    initialpositionintegerThe counter of the initial image to show while loading all other images.
    For instance, to start with an image in the middle, the example uses 30
    rotationaxisStringSpecify dragging behaviour by indicating the objects rotational axis.
    With "horizontal", dragging up and down results in change of image sugesting rotation. With a "vertical" rotation axis you need to drag sideways.
    pixelsperimageintegerThe number of pixels to drag for the viewer to show the next image.
    If this is small the view is more sensitive to dragging and if larger it is less sensitieve. It depends on the image size and the original rotation angle between two succesive images
    animationtypeStringSpecifies how to traverse the images when dragging.
    Similar to Objectsequencecontrol option above.
As you may have noticed, there is still lot's of room for improvement.

Syracuse


Syracuse is an image acquisition program for Windows XP.

With Syracuse you can obtain a sequence of images of a rotating object using your photo camera and a rotation device. Syracuse supports the addition of plugins for camera's and rotation devices. The plugins supplied with the current version supports most Canon digital camera's and some Nikon's.

Check the camera compatibility list to see if your camera is supported



Try Syracuse: Even without a supported camera or rotation table you can try Syracuse by selecting a fake camera and table.
  1. After Syracuse has been installed, start it by double clicking the desktop icon or by selecting the Syracuse start menu item.
  2. When Syracuse starts, a dialog is shown which lets you select a camera and a table. Select the <fake camera> and the <fake table>
  3. Wait fot the fake table to initialize and then you can change the camera settings, grab an image rotate the table and even acquire a fake sequence.


Web based size measuring on an image

Download the NetBeans6.5 Java project [~16kb zip file]
or download the jar file only [~21kb jar file].

This Java Applet alows you to view an image and measure sizes using an interactive ruler or 'line measurer'.

View the example.

Note: I want to develop the same functionality using an jQuery plugin, baseds on an early Javascript/VML implementation.
Note: VML needs IE5 or higher


There are only to parameters you need to provide:

<applet code="nwocatch.rich.MeasurementApplet" archive="MeasurementApplet.jar"
width=400 height=400>
  <param name="pixelsize" value="0.000257"/>
  <param name="image-url" 
  value="http://www.xs4all.nl/~pnm/paul/software/measurementapplet/glas.png"/>
</applet>

Web based image annotation

Download the NetBeans6.5 Java project [~26kb zip file]
or download the jar file only [~49kb jar file].

The image annotation applet provides an on-line interactive ‘drawing canvas’ for making graphical annotations on an image. For now, only rectangular regions can be specified and annotated.

View the example.


Using the annotation applet

Parameters
NameDescriptionPossible valuesDefault
image-url Specifies the url to the image data; the file Any valid url string referring to an image (jpg, png, gif). Must be specified!
controlpannel Indicates if the applet displays the control panel. This panel; has an Add and Remove button and is used for testing. ‘off’ or ‘on’ ‘off’
Note: The applet must be able to read the image and due to security measures for Java Applets, the image must be on the same server where the applet was loaded from.

The applet is made scriptable. The following member function can be called.
Member functions
NameDescription
addAnnotation(id, label, text, type, region) All parameters are described by the 'getters' below.
If an annotation exists with the given id, it is replaced.
When all parameters are ommitted the values will be generated and a new annotation will be placed at the center of the canvas.
This is useful when the user needs to start a new annotation.
getAnnotationLabel(id) Returns the label (short title) string.
getAnnotationText(id) Returns the text (complete description) string.
getAnnotationType(id) Returns the type string. For this demo only "rectregion" is supported.
getAnnotationRegion(id) Comma separated list of numbers, indicating coordinates or dimensions. For a rectregion type the meaning is:
x-coordinate of topleft corner, y-coordinate of topleft corner, width, height.
All specified in image pixels.
setAnnotationLabel(id, label) Set the label of the annotation with the given id.
setAnnotationText(id, text) Set the text of the annotation with the given id.
setAnnotationRegion(id, region) Set the region of the annotation with the given id. See: getAnnotationRegion for a description of the region string
selectAnnotation(id) Select the annotation with the given id. Only one annotation can be selected at the same tine, so no multiple-selection supported.
getAnnotationId() Returns the id string of the selected annotation, empty string if no annotation was selected.
removeAnnotation(id) Remove annotation with given id from the applet. If no id is given it removes selected annotation.


The applet also calls the following Javascript functions.
Events
NameDescription
<applet id>_onSelectionChanged()
Where <applet id> should be replaced by the actual applet element id.
Called when a selected annotation changes. Either by select/deselect or move/resize.
top
P.J. Boon, updated March 9, 2012
top