ruby-opencv 0.0.8-x86-mingw32 → 0.0.9.pre2-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/DEVELOPERS_NOTE.md +29 -12
- data/Gemfile +1 -2
- data/License.txt +30 -30
- data/Manifest.txt +5 -4
- data/README.md +1 -1
- data/Rakefile +62 -4
- data/config.yml +7 -0
- data/examples/alpha_blend.rb +21 -21
- data/examples/find_obj.rb +169 -169
- data/examples/match_kdtree.rb +88 -88
- data/ext/opencv/cvcapture.cpp +19 -12
- data/ext/opencv/cvutils.cpp +192 -194
- data/ext/opencv/cvutils.h +30 -29
- data/{extconf.rb → ext/opencv/extconf.rb} +12 -4
- data/lib/opencv.rb +12 -3
- data/lib/opencv/psyched_yaml.rb +22 -22
- data/lib/opencv/version.rb +1 -1
- data/ruby-opencv.gemspec +17 -16
- data/test/helper.rb +1 -1
- data/test/runner.rb +30 -30
- data/test/test_curve.rb +1 -1
- data/test/test_cvavgcomp.rb +24 -24
- data/test/test_cvbox2d.rb +76 -76
- data/test/test_cvcapture.rb +183 -183
- data/test/test_cvchain.rb +108 -108
- data/test/test_cvcircle32f.rb +41 -41
- data/test/test_cvconnectedcomp.rb +61 -61
- data/test/test_cvcontour.rb +150 -150
- data/test/test_cvcontourtree.rb +43 -43
- data/test/test_cverror.rb +1 -1
- data/test/test_cvfeaturetree.rb +65 -65
- data/test/test_cvfont.rb +58 -58
- data/test/test_cvhaarclassifiercascade.rb +63 -63
- data/test/test_cvhistogram.rb +1 -1
- data/test/test_cvhumoments.rb +83 -83
- data/test/test_cvline.rb +50 -50
- data/test/test_cvmat.rb +1 -1
- data/test/test_cvmat_drawing.rb +1 -1
- data/test/test_cvmat_dxt.rb +1 -1
- data/test/test_cvmat_imageprocessing.rb +1 -1
- data/test/test_cvmat_matching.rb +1 -1
- data/test/test_cvmoments.rb +180 -180
- data/test/test_cvpoint.rb +75 -75
- data/test/test_cvpoint2d32f.rb +75 -75
- data/test/test_cvpoint3d32f.rb +93 -93
- data/test/test_cvrect.rb +144 -144
- data/test/test_cvscalar.rb +113 -113
- data/test/test_cvseq.rb +295 -295
- data/test/test_cvsize.rb +75 -75
- data/test/test_cvsize2d32f.rb +75 -75
- data/test/test_cvslice.rb +31 -31
- data/test/test_cvsurfparams.rb +57 -57
- data/test/test_cvsurfpoint.rb +66 -66
- data/test/test_cvtermcriteria.rb +56 -56
- data/test/test_cvtwopoints.rb +40 -40
- data/test/test_cvvideowriter.rb +58 -58
- data/test/test_iplconvkernel.rb +54 -54
- data/test/test_iplimage.rb +1 -1
- data/test/test_mouseevent.rb +17 -17
- data/test/test_opencv.rb +1 -1
- data/test/test_pointset.rb +1 -1
- data/test/test_preliminary.rb +130 -130
- data/test/test_trackbar.rb +47 -47
- data/test/test_window.rb +115 -115
- metadata +26 -54
- data/ext/opencv/lib/opencv.rb +0 -3
- data/ext/opencv/lib/opencv/psyched_yaml.rb +0 -22
- data/ext/opencv/lib/opencv/version.rb +0 -3
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0a4168af4998ed69e69f9cc4f65cc4823f0bc5b9
|
4
|
+
data.tar.gz: 9cc4ad8a1fe60f3ae95c70837151381f4a6f9d13
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1f78f622de1d449ce2d9882887f04ed35181a9394d8e856a6f939fa4a28892c6311a2996d5992cd59353e81ea07e661d81086d2ae5c8d5b77d83ad1c5f522931
|
7
|
+
data.tar.gz: 94ecb941ed131422d4ba69c0d067907c569915ca70817b62852ed6d5d34b16c6bbc645e35ddd553575781d23496c253adebd27df63f863ee840ba8f01a2f1c2c
|
data/DEVELOPERS_NOTE.md
CHANGED
@@ -14,12 +14,11 @@
|
|
14
14
|
* [hoe](https://github.com/seattlerb/hoe)
|
15
15
|
* [hoe-gemspec](https://github.com/flavorjones/hoe-gemspec)
|
16
16
|
* [rake-compiler](https://github.com/luislavena/rake-compiler)
|
17
|
-
* [gem-compile](https://github.com/frsyuki/gem-compile)
|
18
17
|
|
19
18
|
|
20
19
|
## Create ruby-opencv gem
|
21
20
|
Run the following commands.
|
22
|
-
When you use mingw32, use **MSYS console**, or when you use mswin32,
|
21
|
+
When you use mingw32, use **MSYS console**, or when you use mswin32,
|
23
22
|
use [**Visual Studio Command Prompt**](http://msdn.microsoft.com/en-us/library/ms229859.aspx)
|
24
23
|
instead of cmd.exe.
|
25
24
|
|
@@ -32,16 +31,34 @@ $ git ls-files > Manifest.txt
|
|
32
31
|
$ rake gem:spec
|
33
32
|
$ rake gem
|
34
33
|
```
|
35
|
-
**ruby-opencv-x.y.z.gem** will be created in pkg
|
34
|
+
**ruby-opencv-x.y.z.gem** will be created in **pkg** directory.
|
36
35
|
|
37
|
-
To create pre-build binaries,
|
36
|
+
To create pre-build binaries, create a config file firstly:
|
38
37
|
|
38
|
+
```yml
|
39
|
+
# config.yml
|
40
|
+
platform: mingw32
|
41
|
+
rubies:
|
42
|
+
- C:/ruby-1.9.3-p392-mingw32/bin/ruby.exe
|
43
|
+
- C:/ruby-2.0.0-p0-mingw32/bin/ruby.exe
|
44
|
+
extopts:
|
45
|
+
- --with-opencv-include=C:/opencv/build/include
|
46
|
+
- --with-opencv-lib=C:/opencv/build/x86/mingw/lib
|
39
47
|
```
|
40
|
-
|
41
|
-
|
48
|
+
|
49
|
+
Entries are below:
|
50
|
+
|
51
|
+
- **platform**: Target platform (e.g. mingw32, mswin32)
|
52
|
+
- **rubies**: Array of target versions of ruby's paths (You can create fat gems if you specify multiple versions of ruby)
|
53
|
+
- **extopts**: Array of options to be passed to **extconf.rb**
|
54
|
+
|
55
|
+
Then, run the following command:
|
56
|
+
|
57
|
+
```
|
58
|
+
$ rake gem:precompile CONFIG=config.yml
|
42
59
|
```
|
43
60
|
|
44
|
-
**ruby-opencv-x.y.z-
|
61
|
+
**ruby-opencv-x.y.z-mingw32.gem** will be created when you use mingw32, or
|
45
62
|
**ruby-opencv-x.y.z-x86-mswin32.gem** when you use mswin32.
|
46
63
|
|
47
64
|
|
@@ -52,7 +69,7 @@ $ gem compile ruby-opencv-*.gem
|
|
52
69
|
$ git clone git://github.com/ruby-opencv/ruby-opencv.git
|
53
70
|
$ cd ruby-opencv
|
54
71
|
$ git checkout master
|
55
|
-
$ ruby extconf.rb --with-opencv-dir=/path/to/opencvdir
|
72
|
+
$ ruby ext/opencv/extconf.rb --with-opencv-dir=/path/to/opencvdir
|
56
73
|
$ make
|
57
74
|
$ make install
|
58
75
|
```
|
@@ -68,7 +85,7 @@ Run the following commands on [**Visual Studio Command Prompt**](http://msdn.mic
|
|
68
85
|
$ git clone git://github.com/ruby-opencv/ruby-opencv.git
|
69
86
|
$ cd ruby-opencv
|
70
87
|
$ git checkout master
|
71
|
-
$ ruby extconf.rb --with-opencv-dir=C:\path\to\opencvdir\install # for your own built OpenCV library
|
88
|
+
$ ruby ext/opencv/extconf.rb --with-opencv-dir=C:\path\to\opencvdir\install # for your own built OpenCV library
|
72
89
|
$ nmake
|
73
90
|
$ nmake install
|
74
91
|
```
|
@@ -76,7 +93,7 @@ $ nmake install
|
|
76
93
|
To use pre-built OpenCV libraries, set the following option to extconf.rb.
|
77
94
|
|
78
95
|
```
|
79
|
-
$ ruby extconf.rb --with-opencv-include=C:\path\to\opencvdir\build\include --with-opencv-lib=C:\path\to\opencvdir\build\x86\vc10\lib
|
96
|
+
$ ruby ext/opencv/extconf.rb --with-opencv-include=C:\path\to\opencvdir\build\include --with-opencv-lib=C:\path\to\opencvdir\build\x86\vc10\lib
|
80
97
|
```
|
81
98
|
|
82
99
|
|
@@ -88,7 +105,7 @@ Run the following commands on **MSYS console**.
|
|
88
105
|
$ git clone git://github.com/ruby-opencv/ruby-opencv.git
|
89
106
|
$ cd ruby-opencv
|
90
107
|
$ git checkout master
|
91
|
-
$ ruby extconf.rb --with-opencv-dir=/C/path/to/opencvdir/install # for your own built OpenCV library
|
108
|
+
$ ruby ext/opencv/extconf.rb --with-opencv-dir=/C/path/to/opencvdir/install # for your own built OpenCV library
|
92
109
|
$ make
|
93
110
|
$ make install
|
94
111
|
```
|
@@ -96,7 +113,7 @@ $ make install
|
|
96
113
|
To use pre-built OpenCV libraries, set the following option to extconf.rb.
|
97
114
|
|
98
115
|
```
|
99
|
-
$ ruby extconf.rb --with-opencv-include=/c/path/to/opencvdir/build/include --with-opencv-lib=/c/path/to/opencvdir/build/x86/mingw/lib
|
116
|
+
$ ruby ext/opencv/extconf.rb --with-opencv-include=/c/path/to/opencvdir/build/include --with-opencv-lib=/c/path/to/opencvdir/build/x86/mingw/lib
|
100
117
|
```
|
101
118
|
|
102
119
|
|
data/Gemfile
CHANGED
data/License.txt
CHANGED
@@ -1,30 +1,30 @@
|
|
1
|
-
The BSD
|
2
|
-
|
3
|
-
Copyright (c) 2008, Masakazu Yonekura
|
4
|
-
All rights reserved.
|
5
|
-
|
6
|
-
Redistribution and use of this software in source and binary forms, with or without modification, are
|
7
|
-
permitted provided that the following conditions are met:
|
8
|
-
|
9
|
-
* Redistributions of source code must retain the above
|
10
|
-
copyright notice, this list of conditions and the
|
11
|
-
following disclaimer.
|
12
|
-
|
13
|
-
* Redistributions in binary form must reproduce the above
|
14
|
-
copyright notice, this list of conditions and the
|
15
|
-
following disclaimer in the documentation and/or other
|
16
|
-
materials provided with the distribution.
|
17
|
-
|
18
|
-
* Neither the name of Masakazu Yonekura. nor the names of its
|
19
|
-
contributors may be used to endorse or promote products
|
20
|
-
derived from this software without specific prior
|
21
|
-
written permission of Masakazu Yonekura.
|
22
|
-
|
23
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
|
24
|
-
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
25
|
-
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
26
|
-
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
27
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
28
|
-
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
29
|
-
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
30
|
-
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
1
|
+
The BSD License
|
2
|
+
|
3
|
+
Copyright (c) 2008, Masakazu Yonekura
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use of this software in source and binary forms, with or without modification, are
|
7
|
+
permitted provided that the following conditions are met:
|
8
|
+
|
9
|
+
* Redistributions of source code must retain the above
|
10
|
+
copyright notice, this list of conditions and the
|
11
|
+
following disclaimer.
|
12
|
+
|
13
|
+
* Redistributions in binary form must reproduce the above
|
14
|
+
copyright notice, this list of conditions and the
|
15
|
+
following disclaimer in the documentation and/or other
|
16
|
+
materials provided with the distribution.
|
17
|
+
|
18
|
+
* Neither the name of Masakazu Yonekura. nor the names of its
|
19
|
+
contributors may be used to endorse or promote products
|
20
|
+
derived from this software without specific prior
|
21
|
+
written permission of Masakazu Yonekura.
|
22
|
+
|
23
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
|
24
|
+
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
25
|
+
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
26
|
+
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
27
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
28
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
29
|
+
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
30
|
+
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/Manifest.txt
CHANGED
@@ -6,6 +6,7 @@ License.txt
|
|
6
6
|
Manifest.txt
|
7
7
|
README.md
|
8
8
|
Rakefile
|
9
|
+
config.yml
|
9
10
|
examples/alpha_blend.rb
|
10
11
|
examples/box.png
|
11
12
|
examples/box_in_scene.png
|
@@ -109,15 +110,13 @@ ext/opencv/cvutils.cpp
|
|
109
110
|
ext/opencv/cvutils.h
|
110
111
|
ext/opencv/cvvideowriter.cpp
|
111
112
|
ext/opencv/cvvideowriter.h
|
113
|
+
ext/opencv/extconf.rb
|
112
114
|
ext/opencv/gui.cpp
|
113
115
|
ext/opencv/gui.h
|
114
116
|
ext/opencv/iplconvkernel.cpp
|
115
117
|
ext/opencv/iplconvkernel.h
|
116
118
|
ext/opencv/iplimage.cpp
|
117
119
|
ext/opencv/iplimage.h
|
118
|
-
ext/opencv/lib/opencv.rb
|
119
|
-
ext/opencv/lib/opencv/psyched_yaml.rb
|
120
|
-
ext/opencv/lib/opencv/version.rb
|
121
120
|
ext/opencv/mouseevent.cpp
|
122
121
|
ext/opencv/mouseevent.h
|
123
122
|
ext/opencv/opencv.cpp
|
@@ -128,11 +127,13 @@ ext/opencv/trackbar.cpp
|
|
128
127
|
ext/opencv/trackbar.h
|
129
128
|
ext/opencv/window.cpp
|
130
129
|
ext/opencv/window.h
|
131
|
-
extconf.rb
|
132
130
|
images/CvMat_sobel.png
|
133
131
|
images/CvMat_sub_rect.png
|
134
132
|
images/CvSeq_relationmap.png
|
135
133
|
images/face_detect_from_lena.jpg
|
134
|
+
lib/opencv.rb
|
135
|
+
lib/opencv/psyched_yaml.rb
|
136
|
+
lib/opencv/version.rb
|
136
137
|
ruby-opencv.gemspec
|
137
138
|
test/helper.rb
|
138
139
|
test/runner.rb
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -1,27 +1,36 @@
|
|
1
|
-
# -*- mode: ruby; coding: utf-8
|
1
|
+
# -*- mode: ruby; coding: utf-8 -*-
|
2
2
|
require 'rubygems'
|
3
|
-
require
|
3
|
+
require "rubygems/ext"
|
4
|
+
require "rubygems/installer"
|
4
5
|
require 'hoe'
|
5
6
|
require 'rake/extensiontask'
|
7
|
+
require 'fileutils'
|
8
|
+
require './lib/opencv/psyched_yaml'
|
9
|
+
|
10
|
+
SO_FILE = 'opencv.so'
|
6
11
|
|
7
12
|
Hoe.plugin :gemspec
|
8
13
|
|
9
14
|
hoespec = Hoe.spec 'ruby-opencv' do |s|
|
10
15
|
s.summary = 'OpenCV wrapper for Ruby'
|
16
|
+
s.description = 'ruby-opencv is a wrapper of OpenCV for Ruby. It helps you to write computer vision programs (e.g. detecting faces from pictures) with Ruby.'
|
17
|
+
s.licenses = ['The BSD License']
|
11
18
|
s.developer('lsxi', 'masakazu.yonekura@gmail.com')
|
12
19
|
s.developer('ser1zw', 'azariahsawtikes@gmail.com')
|
13
20
|
s.developer('pcting', 'pcting@gmail.com')
|
14
21
|
|
15
22
|
s.readme_file = 'README.md'
|
16
23
|
s.history_file = 'History.txt'
|
17
|
-
|
24
|
+
|
25
|
+
s.spec_extras = { :extensions => ['ext/opencv/extconf.rb'] }
|
26
|
+
|
18
27
|
s.test_globs = ['test/test_*.rb']
|
19
28
|
s.urls = ['https://github.com/ruby-opencv/ruby-opencv/']
|
20
29
|
|
21
30
|
s.extra_dev_deps << ['rake-compiler', '>= 0'] << ['hoe-gemspec']
|
22
31
|
|
23
32
|
Rake::ExtensionTask.new('opencv', spec) do |ext|
|
24
|
-
ext.lib_dir =
|
33
|
+
ext.lib_dir = 'lib'
|
25
34
|
end
|
26
35
|
end
|
27
36
|
|
@@ -29,4 +38,53 @@ hoespec.spec.files.delete('.gemtest')
|
|
29
38
|
|
30
39
|
Rake::Task[:test].prerequisites << :compile
|
31
40
|
|
41
|
+
desc 'Create a pre-compiled gem'
|
42
|
+
task 'gem:precompile' => ['gem'] do
|
43
|
+
tmp_dir = Dir.mktmpdir('tmp', '.')
|
44
|
+
gemfile = Dir.glob("pkg/*.gem")[0]
|
45
|
+
target_dir = File.join(tmp_dir, File.basename(gemfile, '.gem'))
|
46
|
+
|
47
|
+
installer = Gem::Installer.new(gemfile)
|
48
|
+
installer.unpack(target_dir)
|
49
|
+
|
50
|
+
gemspec = installer.spec
|
51
|
+
extension = gemspec.extensions[0]
|
52
|
+
gemspec.extensions.clear
|
53
|
+
|
54
|
+
config = ENV['CONFIG'] ? YAML.load_file(ENV['CONFIG']) : {}
|
55
|
+
rubies = config['rubies'] || [Gem.ruby]
|
56
|
+
args = config['extopts'] || []
|
57
|
+
gemspec.platform = config['platform'] || Gem::Platform::CURRENT
|
58
|
+
|
59
|
+
multi = rubies.size > 1
|
60
|
+
rubies.each { |ruby|
|
61
|
+
lib_dir = 'lib'
|
62
|
+
if multi
|
63
|
+
major, minor, _ = `#{ruby} -e "print RUBY_VERSION"`.chomp.split('.')
|
64
|
+
lib_dir = File.join(lib_dir, [major, minor].join('.'))
|
65
|
+
end
|
66
|
+
|
67
|
+
make_cmd = (`#{ruby} -e "print RUBY_PLATFORM"` =~ /mswin/) ? 'nmake' : 'make'
|
68
|
+
Dir.chdir(target_dir) {
|
69
|
+
cmd = [ruby, extension, *args].join(' ')
|
70
|
+
results = []
|
71
|
+
Gem::Ext::ExtConfBuilder.run(cmd, results)
|
72
|
+
Gem::Ext::ExtConfBuilder.make('', results)
|
73
|
+
|
74
|
+
FileUtils.mkdir_p lib_dir
|
75
|
+
FileUtils.mv SO_FILE, lib_dir
|
76
|
+
sh "#{make_cmd} clean"
|
77
|
+
}
|
78
|
+
|
79
|
+
gemspec.files << File.join(lib_dir, SO_FILE)
|
80
|
+
}
|
81
|
+
|
82
|
+
Dir.chdir(target_dir) {
|
83
|
+
gemfile = Gem::Package.build(gemspec)
|
84
|
+
FileUtils.mv gemfile, File.dirname(__FILE__)
|
85
|
+
}
|
86
|
+
|
87
|
+
FileUtils.rm_rf tmp_dir
|
88
|
+
end
|
89
|
+
|
32
90
|
# vim: syntax=ruby
|
data/config.yml
ADDED
data/examples/alpha_blend.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# -*- mode: ruby; coding: utf-8
|
3
|
-
|
4
|
-
# Alpha blending sample with GUI
|
5
|
-
|
6
|
-
require 'opencv'
|
7
|
-
include OpenCV
|
8
|
-
|
9
|
-
img1 = IplImage.load('lenna.jpg', CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH)
|
10
|
-
img2 = IplImage.load('tiffany.jpg', CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH)
|
11
|
-
|
12
|
-
window = GUI::Window.new('Alpha blend')
|
13
|
-
max = 100.0
|
14
|
-
val = max / 2.0
|
15
|
-
window.set_trackbar("Alpha", max, val) { |v|
|
16
|
-
a = v.to_f / max
|
17
|
-
window.show CvMat.add_weighted(img1, a, img2, 1.0 - a, 0)
|
18
|
-
}
|
19
|
-
window.show CvMat.add_weighted(img1, val / max, img2, 1.0 - val / max, 0)
|
20
|
-
GUI::wait_key
|
21
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- mode: ruby; coding: utf-8 -*-
|
3
|
+
|
4
|
+
# Alpha blending sample with GUI
|
5
|
+
|
6
|
+
require 'opencv'
|
7
|
+
include OpenCV
|
8
|
+
|
9
|
+
img1 = IplImage.load('lenna.jpg', CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH)
|
10
|
+
img2 = IplImage.load('tiffany.jpg', CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH)
|
11
|
+
|
12
|
+
window = GUI::Window.new('Alpha blend')
|
13
|
+
max = 100.0
|
14
|
+
val = max / 2.0
|
15
|
+
window.set_trackbar("Alpha", max, val) { |v|
|
16
|
+
a = v.to_f / max
|
17
|
+
window.show CvMat.add_weighted(img1, a, img2, 1.0 - a, 0)
|
18
|
+
}
|
19
|
+
window.show CvMat.add_weighted(img1, val / max, img2, 1.0 - val / max, 0)
|
20
|
+
GUI::wait_key
|
21
|
+
|
data/examples/find_obj.rb
CHANGED
@@ -1,169 +1,169 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# -*- mode: ruby; coding: utf-8
|
3
|
-
|
4
|
-
# A Demo Ruby/OpenCV Implementation of SURF
|
5
|
-
# See https://code.ros.org/trac/opencv/browser/tags/2.3.1/opencv/samples/c/find_obj.cpp
|
6
|
-
require 'opencv'
|
7
|
-
require 'benchmark'
|
8
|
-
include OpenCV
|
9
|
-
|
10
|
-
def compare_surf_descriptors(d1, d2, best, length)
|
11
|
-
raise ArgumentError unless (length % 4) == 0
|
12
|
-
total_cost = 0
|
13
|
-
0.step(length - 1, 4) { |i|
|
14
|
-
t0 = d1[i] - d2[i]
|
15
|
-
t1 = d1[i + 1] - d2[i + 1]
|
16
|
-
t2 = d1[i + 2] - d2[i + 2]
|
17
|
-
t3 = d1[i + 3] - d2[i + 3]
|
18
|
-
total_cost += t0 * t0 + t1 * t1 + t2 * t2 + t3 * t3
|
19
|
-
break if total_cost > best
|
20
|
-
}
|
21
|
-
total_cost
|
22
|
-
end
|
23
|
-
|
24
|
-
def naive_nearest_neighbor(vec, laplacian, model_keypoints, model_descriptors)
|
25
|
-
length = model_descriptors[0].size
|
26
|
-
neighbor = nil
|
27
|
-
dist1 = 1e6
|
28
|
-
dist2 = 1e6
|
29
|
-
|
30
|
-
model_descriptors.size.times { |i|
|
31
|
-
kp = model_keypoints[i]
|
32
|
-
mvec = model_descriptors[i]
|
33
|
-
next if laplacian != kp.laplacian
|
34
|
-
|
35
|
-
d = compare_surf_descriptors(vec, mvec, dist2, length)
|
36
|
-
if d < dist1
|
37
|
-
dist2 = dist1
|
38
|
-
dist1 = d
|
39
|
-
neighbor = i
|
40
|
-
elsif d < dist2
|
41
|
-
dist2 = d
|
42
|
-
end
|
43
|
-
}
|
44
|
-
|
45
|
-
return (dist1 < 0.6 * dist2) ? neighbor : nil
|
46
|
-
end
|
47
|
-
|
48
|
-
def find_pairs(object_keypoints, object_descriptors,
|
49
|
-
image_keypoints, image_descriptors)
|
50
|
-
ptpairs = []
|
51
|
-
object_descriptors.size.times { |i|
|
52
|
-
kp = object_keypoints[i]
|
53
|
-
descriptor = object_descriptors[i]
|
54
|
-
nearest_neighbor = naive_nearest_neighbor(descriptor, kp.laplacian, image_keypoints, image_descriptors)
|
55
|
-
unless nearest_neighbor.nil?
|
56
|
-
ptpairs << i
|
57
|
-
ptpairs << nearest_neighbor
|
58
|
-
end
|
59
|
-
}
|
60
|
-
ptpairs
|
61
|
-
end
|
62
|
-
|
63
|
-
def locate_planar_object(object_keypoints, object_descriptors,
|
64
|
-
image_keypoints, image_descriptors, src_corners)
|
65
|
-
ptpairs = find_pairs(object_keypoints, object_descriptors, image_keypoints, image_descriptors)
|
66
|
-
n = ptpairs.size / 2
|
67
|
-
return nil if n < 4
|
68
|
-
|
69
|
-
pt1 = []
|
70
|
-
pt2 = []
|
71
|
-
n.times { |i|
|
72
|
-
pt1 << object_keypoints[ptpairs[i * 2]].pt
|
73
|
-
pt2 << image_keypoints[ptpairs[i * 2 + 1]].pt
|
74
|
-
}
|
75
|
-
|
76
|
-
_pt1 = CvMat.new(1, n, CV_32F, 2)
|
77
|
-
_pt2 = CvMat.new(1, n, CV_32F, 2)
|
78
|
-
_pt1.set_data(pt1)
|
79
|
-
_pt2.set_data(pt2)
|
80
|
-
h = CvMat.find_homography(_pt1, _pt2, :ransac, 5)
|
81
|
-
|
82
|
-
dst_corners = []
|
83
|
-
4.times { |i|
|
84
|
-
x = src_corners[i].x
|
85
|
-
y = src_corners[i].y
|
86
|
-
z = 1.0 / (h[6][0] * x + h[7][0] * y + h[8][0])
|
87
|
-
x = (h[0][0] * x + h[1][0] * y + h[2][0]) * z
|
88
|
-
y = (h[3][0] * x + h[4][0] * y + h[5][0]) * z
|
89
|
-
dst_corners << CvPoint.new(x.to_i, y.to_i)
|
90
|
-
}
|
91
|
-
|
92
|
-
dst_corners
|
93
|
-
end
|
94
|
-
|
95
|
-
|
96
|
-
##### Main #####
|
97
|
-
puts 'This program demonstrated the use of the SURF Detector and Descriptor using'
|
98
|
-
puts 'brute force matching on planar objects.'
|
99
|
-
puts 'Usage:'
|
100
|
-
puts "ruby #{__FILE__} <object_filename> <scene_filename>, default is box.png and box_in_scene.png"
|
101
|
-
puts
|
102
|
-
|
103
|
-
object_filename = (ARGV.size == 2) ? ARGV[0] : 'box.png'
|
104
|
-
scene_filename = (ARGV.size == 2) ? ARGV[1] : 'box_in_scene.png'
|
105
|
-
|
106
|
-
object, image = nil, nil
|
107
|
-
begin
|
108
|
-
object = IplImage.load(object_filename, CV_LOAD_IMAGE_GRAYSCALE)
|
109
|
-
image = IplImage.load(scene_filename, CV_LOAD_IMAGE_GRAYSCALE)
|
110
|
-
rescue
|
111
|
-
puts "Can not load #{object_filename} and/or #{scene_filename}"
|
112
|
-
puts "Usage: ruby #{__FILE__} [<object_filename> <scene_filename>]"
|
113
|
-
exit
|
114
|
-
end
|
115
|
-
object_color = object.GRAY2BGR
|
116
|
-
|
117
|
-
param = CvSURFParams.new(1500)
|
118
|
-
|
119
|
-
object_keypoints, object_descriptors = nil, nil
|
120
|
-
image_keypoints, image_descriptors = nil, nil
|
121
|
-
tms = Benchmark.measure {
|
122
|
-
object_keypoints, object_descriptors = object.extract_surf(param)
|
123
|
-
puts "Object Descriptors: #{object_descriptors.size}"
|
124
|
-
|
125
|
-
image_keypoints, image_descriptors = image.extract_surf(param)
|
126
|
-
puts "Image Descriptors: #{image_descriptors.size}"
|
127
|
-
}
|
128
|
-
puts "Extraction time = #{tms.real * 1000} ms"
|
129
|
-
|
130
|
-
correspond = IplImage.new(image.width, object.height + image.height, CV_8U, 1);
|
131
|
-
correspond.set_roi(CvRect.new(0, 0, object.width, object.height))
|
132
|
-
object.copy(correspond)
|
133
|
-
correspond.set_roi(CvRect.new(0, object.height, image.width, image.height))
|
134
|
-
image.copy(correspond)
|
135
|
-
correspond.reset_roi
|
136
|
-
|
137
|
-
src_corners = [CvPoint.new(0, 0), CvPoint.new(object.width, 0),
|
138
|
-
CvPoint.new(object.width, object.height), CvPoint.new(0, object.height)]
|
139
|
-
dst_corners = locate_planar_object(object_keypoints, object_descriptors,
|
140
|
-
image_keypoints, image_descriptors, src_corners)
|
141
|
-
|
142
|
-
correspond = correspond.GRAY2BGR
|
143
|
-
if dst_corners
|
144
|
-
4.times { |i|
|
145
|
-
r1 = dst_corners[i % 4]
|
146
|
-
r2 = dst_corners[(i + 1) % 4]
|
147
|
-
correspond.line!(CvPoint.new(r1.x, r1.y + object.height), CvPoint.new(r2.x, r2.y + object.height),
|
148
|
-
:color => CvColor::Red, :thickness => 2, :line_type => :aa)
|
149
|
-
}
|
150
|
-
end
|
151
|
-
|
152
|
-
ptpairs = find_pairs(object_keypoints, object_descriptors, image_keypoints, image_descriptors)
|
153
|
-
|
154
|
-
0.step(ptpairs.size - 1, 2) { |i|
|
155
|
-
r1 = object_keypoints[ptpairs[i]]
|
156
|
-
r2 = image_keypoints[ptpairs[i + 1]]
|
157
|
-
correspond.line!(r1.pt, CvPoint.new(r2.pt.x, r2.pt.y + object.height),
|
158
|
-
:color => CvColor::Red, :line_type => :aa)
|
159
|
-
}
|
160
|
-
|
161
|
-
object_keypoints.each { |r|
|
162
|
-
radius = (r.size * 1.2 / 9.0 * 2).to_i
|
163
|
-
object_color.circle!(r.pt, radius, :color => CvColor::Red, :line_type => :aa)
|
164
|
-
}
|
165
|
-
|
166
|
-
GUI::Window.new('Object Correspond').show correspond
|
167
|
-
GUI::Window.new('Object').show object_color
|
168
|
-
GUI::wait_key
|
169
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- mode: ruby; coding: utf-8 -*-
|
3
|
+
|
4
|
+
# A Demo Ruby/OpenCV Implementation of SURF
|
5
|
+
# See https://code.ros.org/trac/opencv/browser/tags/2.3.1/opencv/samples/c/find_obj.cpp
|
6
|
+
require 'opencv'
|
7
|
+
require 'benchmark'
|
8
|
+
include OpenCV
|
9
|
+
|
10
|
+
def compare_surf_descriptors(d1, d2, best, length)
|
11
|
+
raise ArgumentError unless (length % 4) == 0
|
12
|
+
total_cost = 0
|
13
|
+
0.step(length - 1, 4) { |i|
|
14
|
+
t0 = d1[i] - d2[i]
|
15
|
+
t1 = d1[i + 1] - d2[i + 1]
|
16
|
+
t2 = d1[i + 2] - d2[i + 2]
|
17
|
+
t3 = d1[i + 3] - d2[i + 3]
|
18
|
+
total_cost += t0 * t0 + t1 * t1 + t2 * t2 + t3 * t3
|
19
|
+
break if total_cost > best
|
20
|
+
}
|
21
|
+
total_cost
|
22
|
+
end
|
23
|
+
|
24
|
+
def naive_nearest_neighbor(vec, laplacian, model_keypoints, model_descriptors)
|
25
|
+
length = model_descriptors[0].size
|
26
|
+
neighbor = nil
|
27
|
+
dist1 = 1e6
|
28
|
+
dist2 = 1e6
|
29
|
+
|
30
|
+
model_descriptors.size.times { |i|
|
31
|
+
kp = model_keypoints[i]
|
32
|
+
mvec = model_descriptors[i]
|
33
|
+
next if laplacian != kp.laplacian
|
34
|
+
|
35
|
+
d = compare_surf_descriptors(vec, mvec, dist2, length)
|
36
|
+
if d < dist1
|
37
|
+
dist2 = dist1
|
38
|
+
dist1 = d
|
39
|
+
neighbor = i
|
40
|
+
elsif d < dist2
|
41
|
+
dist2 = d
|
42
|
+
end
|
43
|
+
}
|
44
|
+
|
45
|
+
return (dist1 < 0.6 * dist2) ? neighbor : nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def find_pairs(object_keypoints, object_descriptors,
|
49
|
+
image_keypoints, image_descriptors)
|
50
|
+
ptpairs = []
|
51
|
+
object_descriptors.size.times { |i|
|
52
|
+
kp = object_keypoints[i]
|
53
|
+
descriptor = object_descriptors[i]
|
54
|
+
nearest_neighbor = naive_nearest_neighbor(descriptor, kp.laplacian, image_keypoints, image_descriptors)
|
55
|
+
unless nearest_neighbor.nil?
|
56
|
+
ptpairs << i
|
57
|
+
ptpairs << nearest_neighbor
|
58
|
+
end
|
59
|
+
}
|
60
|
+
ptpairs
|
61
|
+
end
|
62
|
+
|
63
|
+
def locate_planar_object(object_keypoints, object_descriptors,
|
64
|
+
image_keypoints, image_descriptors, src_corners)
|
65
|
+
ptpairs = find_pairs(object_keypoints, object_descriptors, image_keypoints, image_descriptors)
|
66
|
+
n = ptpairs.size / 2
|
67
|
+
return nil if n < 4
|
68
|
+
|
69
|
+
pt1 = []
|
70
|
+
pt2 = []
|
71
|
+
n.times { |i|
|
72
|
+
pt1 << object_keypoints[ptpairs[i * 2]].pt
|
73
|
+
pt2 << image_keypoints[ptpairs[i * 2 + 1]].pt
|
74
|
+
}
|
75
|
+
|
76
|
+
_pt1 = CvMat.new(1, n, CV_32F, 2)
|
77
|
+
_pt2 = CvMat.new(1, n, CV_32F, 2)
|
78
|
+
_pt1.set_data(pt1)
|
79
|
+
_pt2.set_data(pt2)
|
80
|
+
h = CvMat.find_homography(_pt1, _pt2, :ransac, 5)
|
81
|
+
|
82
|
+
dst_corners = []
|
83
|
+
4.times { |i|
|
84
|
+
x = src_corners[i].x
|
85
|
+
y = src_corners[i].y
|
86
|
+
z = 1.0 / (h[6][0] * x + h[7][0] * y + h[8][0])
|
87
|
+
x = (h[0][0] * x + h[1][0] * y + h[2][0]) * z
|
88
|
+
y = (h[3][0] * x + h[4][0] * y + h[5][0]) * z
|
89
|
+
dst_corners << CvPoint.new(x.to_i, y.to_i)
|
90
|
+
}
|
91
|
+
|
92
|
+
dst_corners
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
##### Main #####
|
97
|
+
puts 'This program demonstrated the use of the SURF Detector and Descriptor using'
|
98
|
+
puts 'brute force matching on planar objects.'
|
99
|
+
puts 'Usage:'
|
100
|
+
puts "ruby #{__FILE__} <object_filename> <scene_filename>, default is box.png and box_in_scene.png"
|
101
|
+
puts
|
102
|
+
|
103
|
+
object_filename = (ARGV.size == 2) ? ARGV[0] : 'box.png'
|
104
|
+
scene_filename = (ARGV.size == 2) ? ARGV[1] : 'box_in_scene.png'
|
105
|
+
|
106
|
+
object, image = nil, nil
|
107
|
+
begin
|
108
|
+
object = IplImage.load(object_filename, CV_LOAD_IMAGE_GRAYSCALE)
|
109
|
+
image = IplImage.load(scene_filename, CV_LOAD_IMAGE_GRAYSCALE)
|
110
|
+
rescue
|
111
|
+
puts "Can not load #{object_filename} and/or #{scene_filename}"
|
112
|
+
puts "Usage: ruby #{__FILE__} [<object_filename> <scene_filename>]"
|
113
|
+
exit
|
114
|
+
end
|
115
|
+
object_color = object.GRAY2BGR
|
116
|
+
|
117
|
+
param = CvSURFParams.new(1500)
|
118
|
+
|
119
|
+
object_keypoints, object_descriptors = nil, nil
|
120
|
+
image_keypoints, image_descriptors = nil, nil
|
121
|
+
tms = Benchmark.measure {
|
122
|
+
object_keypoints, object_descriptors = object.extract_surf(param)
|
123
|
+
puts "Object Descriptors: #{object_descriptors.size}"
|
124
|
+
|
125
|
+
image_keypoints, image_descriptors = image.extract_surf(param)
|
126
|
+
puts "Image Descriptors: #{image_descriptors.size}"
|
127
|
+
}
|
128
|
+
puts "Extraction time = #{tms.real * 1000} ms"
|
129
|
+
|
130
|
+
correspond = IplImage.new(image.width, object.height + image.height, CV_8U, 1);
|
131
|
+
correspond.set_roi(CvRect.new(0, 0, object.width, object.height))
|
132
|
+
object.copy(correspond)
|
133
|
+
correspond.set_roi(CvRect.new(0, object.height, image.width, image.height))
|
134
|
+
image.copy(correspond)
|
135
|
+
correspond.reset_roi
|
136
|
+
|
137
|
+
src_corners = [CvPoint.new(0, 0), CvPoint.new(object.width, 0),
|
138
|
+
CvPoint.new(object.width, object.height), CvPoint.new(0, object.height)]
|
139
|
+
dst_corners = locate_planar_object(object_keypoints, object_descriptors,
|
140
|
+
image_keypoints, image_descriptors, src_corners)
|
141
|
+
|
142
|
+
correspond = correspond.GRAY2BGR
|
143
|
+
if dst_corners
|
144
|
+
4.times { |i|
|
145
|
+
r1 = dst_corners[i % 4]
|
146
|
+
r2 = dst_corners[(i + 1) % 4]
|
147
|
+
correspond.line!(CvPoint.new(r1.x, r1.y + object.height), CvPoint.new(r2.x, r2.y + object.height),
|
148
|
+
:color => CvColor::Red, :thickness => 2, :line_type => :aa)
|
149
|
+
}
|
150
|
+
end
|
151
|
+
|
152
|
+
ptpairs = find_pairs(object_keypoints, object_descriptors, image_keypoints, image_descriptors)
|
153
|
+
|
154
|
+
0.step(ptpairs.size - 1, 2) { |i|
|
155
|
+
r1 = object_keypoints[ptpairs[i]]
|
156
|
+
r2 = image_keypoints[ptpairs[i + 1]]
|
157
|
+
correspond.line!(r1.pt, CvPoint.new(r2.pt.x, r2.pt.y + object.height),
|
158
|
+
:color => CvColor::Red, :line_type => :aa)
|
159
|
+
}
|
160
|
+
|
161
|
+
object_keypoints.each { |r|
|
162
|
+
radius = (r.size * 1.2 / 9.0 * 2).to_i
|
163
|
+
object_color.circle!(r.pt, radius, :color => CvColor::Red, :line_type => :aa)
|
164
|
+
}
|
165
|
+
|
166
|
+
GUI::Window.new('Object Correspond').show correspond
|
167
|
+
GUI::Window.new('Object').show object_color
|
168
|
+
GUI::wait_key
|
169
|
+
|