HornetsEye
m (→Software Engineering) |
m (→Simple Webcam Application) |
||
Line 20: | Line 20: | ||
The webcam application uses [[Hornetseye|HornetsEye-1.5]], [http://rubyforge.org/projects/rmagick/ RMagick], and [http://rubyforge.org/projects/korundum/ qt4-ruby]. | The webcam application uses [[Hornetseye|HornetsEye-1.5]], [http://rubyforge.org/projects/rmagick/ RMagick], and [http://rubyforge.org/projects/korundum/ qt4-ruby]. | ||
− | To install [http://rubyforge.org/frs/shownotes.php?release_id=7630 qt4-qtruby-1.4.7] I had to [http://rubyforge.org/forum/message.php?msg_id=19132 change the script ./smoke/qt/qtguess.pl.in]. Otherwise on gets an error message like this: | + | You need to install qt4-qtruby-1.4.8 or later because there was a memory leak in Qt::ByteArray of qt4-qtruby-1.4.7. Many thanks to [http://rubyforge.org/users/rdale/ Richard Dale] for fixing the problem! |
+ | |||
+ | <!-- To install [http://rubyforge.org/frs/shownotes.php?release_id=7630 qt4-qtruby-1.4.7] I had to [http://rubyforge.org/forum/message.php?msg_id=19132 change the script ./smoke/qt/qtguess.pl.in]. Otherwise on gets an error message like this: | ||
problem with QListWidget missing parent at ../../kalyptus/kalyptusCxxToSmoke.pm line 2207. | problem with QListWidget missing parent at ../../kalyptus/kalyptusCxxToSmoke.pm line 2207. | ||
− | Also [http://rubyforge.org/frs/shownotes.php?release_id=7630 qt4-qtruby-1.4.7] seems to have a [http://rubyforge.org/forum/message.php?msg_id=19077 memory leak in Qt::ByteArray]. Thanks to [http://rubyforge.org/users/rdale/ Richard Dale] the problem was solved and the bugfix will be included in the next release of qt4-qtruby. The modified code already is [http://websvn.kde.org/trunk/KDE/kdebindings/qtruby/ available via the KDE source repository]. | + | Also [http://rubyforge.org/frs/shownotes.php?release_id=7630 qt4-qtruby-1.4.7] seems to have a [http://rubyforge.org/forum/message.php?msg_id=19077 memory leak in Qt::ByteArray]. Thanks to [http://rubyforge.org/users/rdale/ Richard Dale] the problem was solved and the bugfix will be included in the next release of qt4-qtruby. The modified code already is [http://websvn.kde.org/trunk/KDE/kdebindings/qtruby/ available via the KDE source repository]. --> |
Once the required software is installed, one can develop sophisticated applications within a very short time. | Once the required software is installed, one can develop sophisticated applications within a very short time. |
Revision as of 16:20, 3 August 2007
420px |
Contents |
Introduction
HornetsEye is a Ruby-extension for real-time computer vision under GNU/Linux offering interfaces to do image- and video-I/O with RMagick, Xine, IIDC/DCAM-compatible firewire digital camera (DC1394) and video for Linux (V4L).
HornetsEye also is an attempt to use the Mimas library and create a minimalistic and consistent real-time computer vision library.
- minimalistic: The library is focused on real-time computer vision. Existing libraries are being made used of.
- consistent:: A non-redundant set of data-types is used. Also the library tries to stay consistent with existing libraries.
The logo was created using GIMP and it is based on a nice photo published by Olivander. A hornet is capable of navigating and detecting objects with the limited resolution of its compound eyes.
Examples
See Hornetseye homepage for more examples.
Simple Webcam Application
The webcam application uses HornetsEye-1.5, RMagick, and qt4-ruby.
You need to install qt4-qtruby-1.4.8 or later because there was a memory leak in Qt::ByteArray of qt4-qtruby-1.4.7. Many thanks to Richard Dale for fixing the problem!
Once the required software is installed, one can develop sophisticated applications within a very short time.
As an example here is the source code of the webcam application. Note that you need the user-interface description file as well (which was created with Qt4 designer). You need to compile the user-interface file with rbuic4 to get ui_webcamwindow.rb.
#!/usr/bin/ruby # Qt webcam (requires Qt4-Ruby) require 'Qt' require 'hornetseye' require 'ui_webcamwindow' app=Qt::Application.new(ARGV) class WebcamWindow < Qt::Dialog slots 'open_camera()' slots 'set_value(int)' def initialize( parent = nil ) super @ui = Ui::WebcamWindow.new @ui.setupUi( self ) Qt::Object.connect( @ui.reconnectButton, SIGNAL('clicked()'), self, SLOT('open_camera()')) Qt::Object.connect( @ui.brightnessSlider, SIGNAL('valueChanged(int)'), self, SLOT('set_value(int)')) Qt::Object.connect( @ui.hueSlider, SIGNAL('valueChanged(int)'), self, SLOT('set_value(int)')) Qt::Object.connect( @ui.colourSlider, SIGNAL('valueChanged(int)'), self, SLOT('set_value(int)')) Qt::Object.connect( @ui.contrastSlider, SIGNAL('valueChanged(int)'), self, SLOT('set_value(int)')) @timer = 0 open_camera end def open_camera @ui.errorLabel.text = "" begin @input.close if @input != nil @input = nil @input = Hornetseye::V4LInput.new( @ui.deviceEdit.text ) @timer = startTimer( 0 ) if @timer == 0 rescue RuntimeError => e @ui.errorLabel.text = e.to_s @input = nil end @input end def set_value( value ) puts "hi" @input.set_sensivity( @ui.brightnessSlider.value, @ui.hueSlider.value, @ui.colourSlider.value, @ui.contrastSlider.value ) if @input != nil end def timerEvent( e ) begin raise "No input available" if @input == nil str = @input.read.to_magick.to_blob { self.format = "PPM" self.depth = 8 } pix = Qt::Pixmap.new pix.loadFromData( Qt::ByteArray.fromRawData( str, str.size ) ) @ui.displayLabel.setPixmap( pix ) @ui.displayLabel.update rescue RuntimeError => e killTimer( @timer ) @timer = 0 end end end win = WebcamWindow.new win.show app.exec
Also see project documentation.
Phase Correlation
This is an implementation of the phase correlation for aligning images. The code depends on HornetsEye-1.5 and NArray-fftw3.
#!/usr/bin/ruby require 'hornetseye' require 'fftw3' include Hornetseye syntax = <<END_OF_STRING Shift estimation Syntax: registration.rb <image1> <image2> Example: registration.rb astronaut.jpg apollo-16.jpg Example: registration.rb apollo_left.jpg apollo_right.jpg END_OF_STRING if ARGV.size != 2 puts syntax raise "Wrong number of command-line arguments." end image = (0...2).collect { |i| NArray.load_grey8( ARGV[i] ) } # TODO: Apply windowing function? # Force images to have same size. Make image twice as big to avoid cyclical # correlation. maxwidth = [ image[0].shape[0], image[1].shape[0] ].max * 2 maxheight = [ image[0].shape[1], image[1].shape[1] ].max * 2 limage = image.collect { |img| nimg = NArray.new( NArray::BYTE, maxwidth, maxheight ) nimg[ 0...img.shape[0], 0...img.shape[1] ] = img nimg } fimage = limage.collect { |img| FFTW3.dft( img.to_type( NArray::DCOMPLEX ), +1 ) } limage = nil fshift = ( fimage[0] * fimage[1].conj ) / ( fimage[0].abs * fimage[1].abs ) fimage = nil # TODO: Replace with native implementation for higher performance. fshift = fshift.collect { |value| if value.real.nan? or value.imag.nan? 0 else value end } shift = FFTW3.dft( fshift, -1 ) width = shift.shape[0] height = shift.shape[1] shiftx = nil shifty = nil maxvalue = 0 for i in 0...width for j in 0...height if shift[i,j] > maxvalue shiftx = i shifty = j maxvalue = shift[i,j] end end end shiftx = shiftx - width if shiftx > width / 2 shifty = shifty - height if shifty > height / 2 shift = nil puts "shift-x = #{shiftx}" puts "shift-y = #{shifty}" minx = [ 0, shiftx ].min miny = [ 0, shifty ].min maxx = [ image[0].shape[0], image[1].shape[0] + shiftx ].max - 1 maxy = [ image[0].shape[1], image[1].shape[1] + shifty ].max - 1 offsetx = -minx offsety = -miny resultwidth = maxx + 1 - minx resultheight = maxy + 1 - miny result1 = NArray.new( NArray::BYTE, resultwidth, resultheight ) result1[ offsetx...( offsetx + image[0].shape[0] ), offsety...( offsety + image[0].shape[1] ) ] = image[0] / 2 result2 = NArray.new( NArray::BYTE, resultwidth, resultheight ) result2[ ( shiftx + offsetx )...( shiftx + offsetx + image[1].shape[0] ), ( shifty + offsety )...( shifty + offsety + image[1].shape[1] ) ] = image[1] / 2 result = result1 + result2 result.display
Downloads
Hornetseye-0.16
- Download HornetsEye-0.16 released on Jul 25th 2007
Release Notes
See HornetsEye homepage for installation instructions.
Change log
- Split up this code into multiple files because g++ compiler needs a lot of memory otherwise.
- Implemented instantiation of array operations using templates.
- Modified the CSS stylesheet for the HTML documentation.
- Only creating a single shared library now.
- Flattened the directory structure.
- Added vendorarchdir directory to include path.
- Added implementations for MultiArray, MultiArrayScalar, and Sequence.
- Methods for getting width and height of default screen.
- Commented out code for synchronisation with monitor since it does not compile on some platforms.
Hornetseye-0.15
- Download HornetsEye-0.15 released on Jun 4th 2007
Release Notes
See HornetsEye homepage for installation instructions.
Change log
- Renamed loading and saving methods to 'save_grey8', 'load_grey8', 'save_rgb24', and 'load_rgb24'.
- Renamed "XineInput::seek" to "XineInput::pos=" and implemented "XineInput::pos".
- Test for 'ruby/narray' if 'narray' is not found.
- hornetseye/ruby/hornetseye.cc: Bug! Red and blue channel where swapped in numerical array.
- hornetseye/base/colourspace.cc: Using slightly different colourspace conversions more suitable for YUV <-> RGB (ITU-R BT.709 standard). This allows YUV to grey conversion by simply stripping of the chroma components.
- hornetseye/ruby/hornetseye_ext.rb: Added methods for clipping grey values. Renamed method 'threshold' to 'binarise'.
- Implemented colour conversions RGB24-to-YV12 and Grey8-to-YV12.
Older releases
Older releases are available here.
See Also
Software Engineering
HornetsEye brings the power of large existing free software solutions into Ruby. HornetsEye also tries to make existing Ruby extension operate with each other to enable the development of novel solutions:
- QtRuby, Korundum: QtRuby and Korundum can be used to develop graphical user interfaces and desktop applications.
- Xine: Using Xine one can read virtually any video file and it is even possible to read streaming videos.
- NArray: Masahiro Tanaka's NArray is an implementation of n-dimensional arrays for Ruby.
- RMagick: The RMagick Ruby-extension allows to use the powerful Magick++ library in Ruby for loading and saving images.
- libdc1394: Using libdc1394 one can make use of a large choice of firewire digital cameras.
- OpenEXR: The OpenEXR library is used for saving and loading high dynamic range images.
- Boost: The Boost Library offers smart pointers to do exception safe programming, multi-dimensional arrays, template meta-programming, abstract data types for linear algebra and many other programming concepts. The Boost library is going to be part of a future C++ standard.
- STL: The software makes use of the Standard Template Library
- Ruby programming language
- gnu-arch: gnu-arch is being used for version control.
- Gcc: gcc is the C++ compiler of the GNU project.
- autoconf, automake and make: make, autoconf and automake are used to configure and perform the build of the software on various distributions of the Linux operating system.
- Natural Docs: Natural Docs is used to create the HTML documentation.
See Also
External Links
- Hornetseye homepage
- Hornetseye at Rubyforge
- Hornetseye at Sourceforge
- SWIG (Simplified Wrapper and Interface Generator)
- Moments in image processing