Recently I've been whiling away the time creating my very own bag of words image classifier and I've been learning how to scale it up to handle a large (100k+) number of images with a reasonable accuracy on my modest machine (2.66Gz Core 2 Duo & 4GB of RAM). While doing this I shied away from the SIFT descriptor because it's license is controlled by from UBC, despite it's de facto status as the descriptor to use in every bag of words paper ever written.
The next best option seemed to be the SURF descriptor, so because I'm kind of a putz and I am used to programming in Java, I took the hard way out and ported an existing implementation to Java.
At the time, the only implementation I was able to get to work properly on my machine was Chris Evan's opensurf project. I essentially copied it line for line and made notes to try and understand the process along the way. I also tried to reorganize a couple things into class files, but on the whole it's a faithful reproduction of opensurf, but in Java.
It doesn't have the OpenCV dependency that it's C++ brethren has, but it does require the Apache Commons Math library to do some matrix operations. I'll try to keep it up to date with changes to the opensurf library as they come up, if anyone finds any issues please feel free to contact me!
P.S. Chris was kind enough to let me license this under the 3 clause BSD license instead of the GPL, thanks!
The project code is going to be hosted at Google Code so people can just get the most recent version of it.