From f55f68758ab091fd5aeef4f74afaa217f70ad613 Mon Sep 17 00:00:00 2001 From: Paul McMahon Date: Wed, 16 Oct 2013 13:16:37 +0900 Subject: [PATCH 01/12] example of using match template --- examples/match_template.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100755 examples/match_template.rb diff --git a/examples/match_template.rb b/examples/match_template.rb new file mode 100755 index 0000000..ce51c45 --- /dev/null +++ b/examples/match_template.rb @@ -0,0 +1,26 @@ +#!/usr/bin/env ruby + +# A demo of Ruby/OpenCV's match_template function + +require 'opencv' +include OpenCV + +puts 'This program demonstrates the match_template function' +puts 'Usage:' +puts "ruby #{__FILE__} " +puts + +template_filename = (ARGV.size == 2) ? ARGV[0] : File.expand_path(File.dirname(__FILE__) + '/../test/samples/lena-eyes.jpg') +match_image_filename = (ARGV.size == 2) ? ARGV[1] : File.expand_path(File.dirname(__FILE__) + '/../test/samples/lena-inpaint.jpg') + +template = CvMat.load(template_filename) +match_image = CvMat.load(match_image_filename) +result = match_image.match_template(template) + +pt1 = result.min_max_loc[2] # minimum location +pt2 = CvPoint.new(pt1.x + template.width, pt1.y + template.height) +match_image.rectangle!(pt1, pt2, :color => CvColor::Black, :thickness => 3) + +window = GUI::Window.new('Display window') # Create a window for display. +window.show(match_image) # Show our image inside it. +GUI::wait_key # Wait for a keystroke in the window. From 0a3295cf32b53ab91b28801938829f9f7a7ecd22 Mon Sep 17 00:00:00 2001 From: Tyler Kahn Date: Wed, 16 Oct 2013 14:08:10 -0400 Subject: [PATCH 02/12] add variation of predict that also returns the confidence --- ext/opencv/facerecognizer.cpp | 25 +++++++++++++++++++++++++ test/test_eigenfaces.rb | 13 +++++++++++++ test/test_fisherfaces.rb | 11 +++++++++++ 3 files changed, 49 insertions(+) diff --git a/ext/opencv/facerecognizer.cpp b/ext/opencv/facerecognizer.cpp index 4ecce45..371f843 100644 --- a/ext/opencv/facerecognizer.cpp +++ b/ext/opencv/facerecognizer.cpp @@ -106,6 +106,30 @@ rb_predict(VALUE self, VALUE src) return INT2NUM(label); } +/* + * call-seq: + * predict_with_confidence(src) + * + * Predicts a label and associated confidence (e.g. distance) for a given input image. + */ +VALUE +rb_predict_with_confidence(VALUE self, VALUE src) +{ + cv::Mat mat = cv::Mat(CVMAT_WITH_CHECK(src)); + cv::FaceRecognizer *self_ptr = FACERECOGNIZER(self); + int label; + double confidence; + try { + self_ptr->predict(mat, label, confidence); + } + catch (cv::Exception& e) { + raise_cverror(e); + } + + return rb_ary_new3(2, INT2NUM(label), DBL2NUM(confidence)); +} + + /* * call-seq: * save(filename) @@ -164,6 +188,7 @@ define_ruby_class() rb_klass = rb_define_class_under(opencv, "FaceRecognizer", cAlgorithm::rb_class()); rb_define_method(rb_klass, "train", RUBY_METHOD_FUNC(rb_train), 2); rb_define_method(rb_klass, "predict", RUBY_METHOD_FUNC(rb_predict), 1); + rb_define_method(rb_klass, "predict_with_confidence", RUBY_METHOD_FUNC(rb_predict_with_confidence), 1); rb_define_method(rb_klass, "save", RUBY_METHOD_FUNC(rb_save), 1); rb_define_method(rb_klass, "load", RUBY_METHOD_FUNC(rb_load), 1); } diff --git a/test/test_eigenfaces.rb b/test/test_eigenfaces.rb index 4e3453e..621891e 100755 --- a/test/test_eigenfaces.rb +++ b/test/test_eigenfaces.rb @@ -55,6 +55,19 @@ class TestEigenFaces < OpenCVTestCase } end + def test_predict_with_confidence + img = CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE) + label = 1 + @eigenfaces.train([img], [label]) + lbl, conf = @eigenfaces.predict_with_confidence(img) + assert_equal(label, lbl) + assert_equal(0.0, conf) + + assert_raise(TypeError) { + @eigenfaces.predict_with_confidence(DUMMY_OBJ) + } + end + def test_save img = CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE) label = 1 diff --git a/test/test_fisherfaces.rb b/test/test_fisherfaces.rb index 6849c13..8a9c154 100755 --- a/test/test_fisherfaces.rb +++ b/test/test_fisherfaces.rb @@ -52,6 +52,17 @@ class TestFisherFaces < OpenCVTestCase } end + def test_predict_with_confidence + label = 1 + lbl, conf = @fisherfaces_trained.predict_with_confidence(@images[0]) + assert_equal(1, lbl) + assert_equal(0.0, conf) + + assert_raise(TypeError) { + @fisherfaces_trained.predict_with_confidence(DUMMY_OBJ) + } + end + def test_save filename = "fisherfaces_save-#{DateTime.now.strftime('%Y%m%d%H%M%S')}.xml" begin From ff198b9f7afb946c3d45f2c6450be230a8aef2af Mon Sep 17 00:00:00 2001 From: ser1zw Date: Sun, 20 Oct 2013 23:22:46 +0900 Subject: [PATCH 03/12] update Manifest.txt and gemspec --- Manifest.txt | 1 + ruby-opencv.gemspec | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Manifest.txt b/Manifest.txt index 5c16255..a800325 100644 --- a/Manifest.txt +++ b/Manifest.txt @@ -29,6 +29,7 @@ examples/inpaint.rb examples/lenna-rotated.jpg examples/lenna.jpg examples/match_kdtree.rb +examples/match_template.rb examples/matching_to_many_images.rb examples/matching_to_many_images/query.png examples/matching_to_many_images/train/1.png diff --git a/ruby-opencv.gemspec b/ruby-opencv.gemspec index 4088f8f..d1a6733 100644 --- a/ruby-opencv.gemspec +++ b/ruby-opencv.gemspec @@ -1,26 +1,26 @@ # -*- encoding: utf-8 -*- -# stub: ruby-opencv 0.0.10.20131007024234 ruby lib +# stub: ruby-opencv 0.0.10.20131020232231 ruby lib Gem::Specification.new do |s| s.name = "ruby-opencv" - s.version = "0.0.10.20131007024234" + s.version = "0.0.10.20131020232231" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["lsxi", "ser1zw", "pcting"] - s.date = "2013-10-06" + s.date = "2013-10-20" 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." s.email = ["masakazu.yonekura@gmail.com", "azariahsawtikes@gmail.com", "pcting@gmail.com"] s.extensions = ["ext/opencv/extconf.rb"] s.extra_rdoc_files = ["DEVELOPERS_NOTE.md", "History.txt", "License.txt", "Manifest.txt", "README.md", "examples/facerec/readme.md", "examples/matching_to_many_images/train/trainImages.txt"] - s.files = [".gitignore", "DEVELOPERS_NOTE.md", "Gemfile", "History.txt", "License.txt", "Manifest.txt", "README.md", "Rakefile", "config.yml", "examples/alpha_blend.rb", "examples/box.png", "examples/box_in_scene.png", "examples/contours/bitmap-contours-with-labels.png", "examples/contours/bitmap-contours.png", "examples/contours/bounding-box-detect-canny.rb", "examples/contours/contour_retrieval_modes.rb", "examples/contours/rotated-boxes.jpg", "examples/convexhull.rb", "examples/face_detect.rb", "examples/facerec/create_csv.rb", "examples/facerec/facerec_eigenfaces.rb", "examples/facerec/facerec_fisherfaces.rb", "examples/facerec/facerec_lbph.rb", "examples/facerec/readme.md", "examples/find_obj.rb", "examples/houghcircle.rb", "examples/inpaint.png", "examples/inpaint.rb", "examples/lenna-rotated.jpg", "examples/lenna.jpg", "examples/match_kdtree.rb", "examples/matching_to_many_images.rb", "examples/matching_to_many_images/query.png", "examples/matching_to_many_images/train/1.png", "examples/matching_to_many_images/train/2.png", "examples/matching_to_many_images/train/3.png", "examples/matching_to_many_images/train/trainImages.txt", "examples/paint.rb", "examples/snake.rb", "examples/stuff.jpg", "examples/tiffany.jpg", "ext/opencv/algorithm.cpp", "ext/opencv/algorithm.h", "ext/opencv/curve.cpp", "ext/opencv/curve.h", "ext/opencv/cvavgcomp.cpp", "ext/opencv/cvavgcomp.h", "ext/opencv/cvbox2d.cpp", "ext/opencv/cvbox2d.h", "ext/opencv/cvcapture.cpp", "ext/opencv/cvcapture.h", "ext/opencv/cvchain.cpp", "ext/opencv/cvchain.h", "ext/opencv/cvcircle32f.cpp", "ext/opencv/cvcircle32f.h", "ext/opencv/cvcondensation.cpp", "ext/opencv/cvcondensation.h", "ext/opencv/cvconnectedcomp.cpp", "ext/opencv/cvconnectedcomp.h", "ext/opencv/cvcontour.cpp", "ext/opencv/cvcontour.h", "ext/opencv/cvcontourtree.cpp", "ext/opencv/cvcontourtree.h", "ext/opencv/cvconvexitydefect.cpp", "ext/opencv/cvconvexitydefect.h", "ext/opencv/cverror.cpp", "ext/opencv/cverror.h", "ext/opencv/cvfeaturetree.cpp", "ext/opencv/cvfeaturetree.h", "ext/opencv/cvfont.cpp", "ext/opencv/cvfont.h", "ext/opencv/cvhaarclassifiercascade.cpp", "ext/opencv/cvhaarclassifiercascade.h", "ext/opencv/cvhistogram.cpp", "ext/opencv/cvhistogram.h", "ext/opencv/cvhumoments.cpp", "ext/opencv/cvhumoments.h", "ext/opencv/cvline.cpp", "ext/opencv/cvline.h", "ext/opencv/cvmat.cpp", "ext/opencv/cvmat.h", "ext/opencv/cvmatnd.cpp", "ext/opencv/cvmatnd.h", "ext/opencv/cvmemstorage.cpp", "ext/opencv/cvmemstorage.h", "ext/opencv/cvmoments.cpp", "ext/opencv/cvmoments.h", "ext/opencv/cvpoint.cpp", "ext/opencv/cvpoint.h", "ext/opencv/cvpoint2d32f.cpp", "ext/opencv/cvpoint2d32f.h", "ext/opencv/cvpoint3d32f.cpp", "ext/opencv/cvpoint3d32f.h", "ext/opencv/cvrect.cpp", "ext/opencv/cvrect.h", "ext/opencv/cvscalar.cpp", "ext/opencv/cvscalar.h", "ext/opencv/cvseq.cpp", "ext/opencv/cvseq.h", "ext/opencv/cvsize.cpp", "ext/opencv/cvsize.h", "ext/opencv/cvsize2d32f.cpp", "ext/opencv/cvsize2d32f.h", "ext/opencv/cvslice.cpp", "ext/opencv/cvslice.h", "ext/opencv/cvsparsemat.cpp", "ext/opencv/cvsparsemat.h", "ext/opencv/cvsurfparams.cpp", "ext/opencv/cvsurfparams.h", "ext/opencv/cvsurfpoint.cpp", "ext/opencv/cvsurfpoint.h", "ext/opencv/cvtermcriteria.cpp", "ext/opencv/cvtermcriteria.h", "ext/opencv/cvtwopoints.cpp", "ext/opencv/cvtwopoints.h", "ext/opencv/cvutils.cpp", "ext/opencv/cvutils.h", "ext/opencv/cvvideowriter.cpp", "ext/opencv/cvvideowriter.h", "ext/opencv/eigenfaces.cpp", "ext/opencv/eigenfaces.h", "ext/opencv/extconf.rb", "ext/opencv/facerecognizer.cpp", "ext/opencv/facerecognizer.h", "ext/opencv/fisherfaces.cpp", "ext/opencv/fisherfaces.h", "ext/opencv/gui.cpp", "ext/opencv/gui.h", "ext/opencv/iplconvkernel.cpp", "ext/opencv/iplconvkernel.h", "ext/opencv/iplimage.cpp", "ext/opencv/iplimage.h", "ext/opencv/lbph.cpp", "ext/opencv/lbph.h", "ext/opencv/mouseevent.cpp", "ext/opencv/mouseevent.h", "ext/opencv/opencv.cpp", "ext/opencv/opencv.h", "ext/opencv/pointset.cpp", "ext/opencv/pointset.h", "ext/opencv/trackbar.cpp", "ext/opencv/trackbar.h", "ext/opencv/window.cpp", "ext/opencv/window.h", "images/CvMat_sobel.png", "images/CvMat_sub_rect.png", "images/CvSeq_relationmap.png", "images/face_detect_from_lena.jpg", "lib/opencv.rb", "lib/opencv/psyched_yaml.rb", "lib/opencv/version.rb", "ruby-opencv.gemspec", "test/eigenfaces_save.xml", "test/fisherfaces_save.xml", "test/helper.rb", "test/lbph_save.xml", "test/runner.rb", "test/samples/airplane.jpg", "test/samples/baboon.jpg", "test/samples/baboon200.jpg", "test/samples/baboon200_rotated.jpg", "test/samples/blank0.jpg", "test/samples/blank1.jpg", "test/samples/blank2.jpg", "test/samples/blank3.jpg", "test/samples/blank4.jpg", "test/samples/blank5.jpg", "test/samples/blank6.jpg", "test/samples/blank7.jpg", "test/samples/blank8.jpg", "test/samples/blank9.jpg", "test/samples/cat.jpg", "test/samples/chessboard.jpg", "test/samples/contours.jpg", "test/samples/fruits.jpg", "test/samples/haarcascade_frontalface_alt.xml.gz", "test/samples/inpaint-mask.bmp", "test/samples/lena-256x256.jpg", "test/samples/lena-32x32.jpg", "test/samples/lena-eyes.jpg", "test/samples/lena-inpaint.jpg", "test/samples/lena.jpg", "test/samples/lines.jpg", "test/samples/messy0.jpg", "test/samples/messy1.jpg", "test/samples/movie_sample.avi", "test/samples/one_way_train_0000.jpg", "test/samples/one_way_train_0001.jpg", "test/samples/partially_blank0.jpg", "test/samples/partially_blank1.jpg", "test/samples/smooth0.jpg", "test/samples/smooth1.jpg", "test/samples/smooth2.jpg", "test/samples/smooth3.jpg", "test/samples/smooth4.jpg", "test/samples/smooth5.jpg", "test/samples/smooth6.jpg", "test/samples/str-cv-rotated.jpg", "test/samples/str-cv.jpg", "test/samples/str-ov.jpg", "test/samples/stuff.jpg", "test/test_curve.rb", "test/test_cvavgcomp.rb", "test/test_cvbox2d.rb", "test/test_cvcapture.rb", "test/test_cvchain.rb", "test/test_cvcircle32f.rb", "test/test_cvconnectedcomp.rb", "test/test_cvcontour.rb", "test/test_cvcontourtree.rb", "test/test_cverror.rb", "test/test_cvfeaturetree.rb", "test/test_cvfont.rb", "test/test_cvhaarclassifiercascade.rb", "test/test_cvhistogram.rb", "test/test_cvhumoments.rb", "test/test_cvline.rb", "test/test_cvmat.rb", "test/test_cvmat_drawing.rb", "test/test_cvmat_dxt.rb", "test/test_cvmat_imageprocessing.rb", "test/test_cvmat_matching.rb", "test/test_cvmoments.rb", "test/test_cvpoint.rb", "test/test_cvpoint2d32f.rb", "test/test_cvpoint3d32f.rb", "test/test_cvrect.rb", "test/test_cvscalar.rb", "test/test_cvseq.rb", "test/test_cvsize.rb", "test/test_cvsize2d32f.rb", "test/test_cvslice.rb", "test/test_cvsurfparams.rb", "test/test_cvsurfpoint.rb", "test/test_cvtermcriteria.rb", "test/test_cvtwopoints.rb", "test/test_cvvideowriter.rb", "test/test_eigenfaces.rb", "test/test_fisherfaces.rb", "test/test_iplconvkernel.rb", "test/test_iplimage.rb", "test/test_lbph.rb", "test/test_mouseevent.rb", "test/test_opencv.rb", "test/test_pointset.rb", "test/test_preliminary.rb", "test/test_trackbar.rb", "test/test_window.rb"] + s.files = [".gitignore", "DEVELOPERS_NOTE.md", "Gemfile", "History.txt", "License.txt", "Manifest.txt", "README.md", "Rakefile", "config.yml", "examples/alpha_blend.rb", "examples/box.png", "examples/box_in_scene.png", "examples/contours/bitmap-contours-with-labels.png", "examples/contours/bitmap-contours.png", "examples/contours/bounding-box-detect-canny.rb", "examples/contours/contour_retrieval_modes.rb", "examples/contours/rotated-boxes.jpg", "examples/convexhull.rb", "examples/face_detect.rb", "examples/facerec/create_csv.rb", "examples/facerec/facerec_eigenfaces.rb", "examples/facerec/facerec_fisherfaces.rb", "examples/facerec/facerec_lbph.rb", "examples/facerec/readme.md", "examples/find_obj.rb", "examples/houghcircle.rb", "examples/inpaint.png", "examples/inpaint.rb", "examples/lenna-rotated.jpg", "examples/lenna.jpg", "examples/match_kdtree.rb", "examples/match_template.rb", "examples/matching_to_many_images.rb", "examples/matching_to_many_images/query.png", "examples/matching_to_many_images/train/1.png", "examples/matching_to_many_images/train/2.png", "examples/matching_to_many_images/train/3.png", "examples/matching_to_many_images/train/trainImages.txt", "examples/paint.rb", "examples/snake.rb", "examples/stuff.jpg", "examples/tiffany.jpg", "ext/opencv/algorithm.cpp", "ext/opencv/algorithm.h", "ext/opencv/curve.cpp", "ext/opencv/curve.h", "ext/opencv/cvavgcomp.cpp", "ext/opencv/cvavgcomp.h", "ext/opencv/cvbox2d.cpp", "ext/opencv/cvbox2d.h", "ext/opencv/cvcapture.cpp", "ext/opencv/cvcapture.h", "ext/opencv/cvchain.cpp", "ext/opencv/cvchain.h", "ext/opencv/cvcircle32f.cpp", "ext/opencv/cvcircle32f.h", "ext/opencv/cvcondensation.cpp", "ext/opencv/cvcondensation.h", "ext/opencv/cvconnectedcomp.cpp", "ext/opencv/cvconnectedcomp.h", "ext/opencv/cvcontour.cpp", "ext/opencv/cvcontour.h", "ext/opencv/cvcontourtree.cpp", "ext/opencv/cvcontourtree.h", "ext/opencv/cvconvexitydefect.cpp", "ext/opencv/cvconvexitydefect.h", "ext/opencv/cverror.cpp", "ext/opencv/cverror.h", "ext/opencv/cvfeaturetree.cpp", "ext/opencv/cvfeaturetree.h", "ext/opencv/cvfont.cpp", "ext/opencv/cvfont.h", "ext/opencv/cvhaarclassifiercascade.cpp", "ext/opencv/cvhaarclassifiercascade.h", "ext/opencv/cvhistogram.cpp", "ext/opencv/cvhistogram.h", "ext/opencv/cvhumoments.cpp", "ext/opencv/cvhumoments.h", "ext/opencv/cvline.cpp", "ext/opencv/cvline.h", "ext/opencv/cvmat.cpp", "ext/opencv/cvmat.h", "ext/opencv/cvmatnd.cpp", "ext/opencv/cvmatnd.h", "ext/opencv/cvmemstorage.cpp", "ext/opencv/cvmemstorage.h", "ext/opencv/cvmoments.cpp", "ext/opencv/cvmoments.h", "ext/opencv/cvpoint.cpp", "ext/opencv/cvpoint.h", "ext/opencv/cvpoint2d32f.cpp", "ext/opencv/cvpoint2d32f.h", "ext/opencv/cvpoint3d32f.cpp", "ext/opencv/cvpoint3d32f.h", "ext/opencv/cvrect.cpp", "ext/opencv/cvrect.h", "ext/opencv/cvscalar.cpp", "ext/opencv/cvscalar.h", "ext/opencv/cvseq.cpp", "ext/opencv/cvseq.h", "ext/opencv/cvsize.cpp", "ext/opencv/cvsize.h", "ext/opencv/cvsize2d32f.cpp", "ext/opencv/cvsize2d32f.h", "ext/opencv/cvslice.cpp", "ext/opencv/cvslice.h", "ext/opencv/cvsparsemat.cpp", "ext/opencv/cvsparsemat.h", "ext/opencv/cvsurfparams.cpp", "ext/opencv/cvsurfparams.h", "ext/opencv/cvsurfpoint.cpp", "ext/opencv/cvsurfpoint.h", "ext/opencv/cvtermcriteria.cpp", "ext/opencv/cvtermcriteria.h", "ext/opencv/cvtwopoints.cpp", "ext/opencv/cvtwopoints.h", "ext/opencv/cvutils.cpp", "ext/opencv/cvutils.h", "ext/opencv/cvvideowriter.cpp", "ext/opencv/cvvideowriter.h", "ext/opencv/eigenfaces.cpp", "ext/opencv/eigenfaces.h", "ext/opencv/extconf.rb", "ext/opencv/facerecognizer.cpp", "ext/opencv/facerecognizer.h", "ext/opencv/fisherfaces.cpp", "ext/opencv/fisherfaces.h", "ext/opencv/gui.cpp", "ext/opencv/gui.h", "ext/opencv/iplconvkernel.cpp", "ext/opencv/iplconvkernel.h", "ext/opencv/iplimage.cpp", "ext/opencv/iplimage.h", "ext/opencv/lbph.cpp", "ext/opencv/lbph.h", "ext/opencv/mouseevent.cpp", "ext/opencv/mouseevent.h", "ext/opencv/opencv.cpp", "ext/opencv/opencv.h", "ext/opencv/pointset.cpp", "ext/opencv/pointset.h", "ext/opencv/trackbar.cpp", "ext/opencv/trackbar.h", "ext/opencv/window.cpp", "ext/opencv/window.h", "images/CvMat_sobel.png", "images/CvMat_sub_rect.png", "images/CvSeq_relationmap.png", "images/face_detect_from_lena.jpg", "lib/opencv.rb", "lib/opencv/psyched_yaml.rb", "lib/opencv/version.rb", "ruby-opencv.gemspec", "test/eigenfaces_save.xml", "test/fisherfaces_save.xml", "test/helper.rb", "test/lbph_save.xml", "test/runner.rb", "test/samples/airplane.jpg", "test/samples/baboon.jpg", "test/samples/baboon200.jpg", "test/samples/baboon200_rotated.jpg", "test/samples/blank0.jpg", "test/samples/blank1.jpg", "test/samples/blank2.jpg", "test/samples/blank3.jpg", "test/samples/blank4.jpg", "test/samples/blank5.jpg", "test/samples/blank6.jpg", "test/samples/blank7.jpg", "test/samples/blank8.jpg", "test/samples/blank9.jpg", "test/samples/cat.jpg", "test/samples/chessboard.jpg", "test/samples/contours.jpg", "test/samples/fruits.jpg", "test/samples/haarcascade_frontalface_alt.xml.gz", "test/samples/inpaint-mask.bmp", "test/samples/lena-256x256.jpg", "test/samples/lena-32x32.jpg", "test/samples/lena-eyes.jpg", "test/samples/lena-inpaint.jpg", "test/samples/lena.jpg", "test/samples/lines.jpg", "test/samples/messy0.jpg", "test/samples/messy1.jpg", "test/samples/movie_sample.avi", "test/samples/one_way_train_0000.jpg", "test/samples/one_way_train_0001.jpg", "test/samples/partially_blank0.jpg", "test/samples/partially_blank1.jpg", "test/samples/smooth0.jpg", "test/samples/smooth1.jpg", "test/samples/smooth2.jpg", "test/samples/smooth3.jpg", "test/samples/smooth4.jpg", "test/samples/smooth5.jpg", "test/samples/smooth6.jpg", "test/samples/str-cv-rotated.jpg", "test/samples/str-cv.jpg", "test/samples/str-ov.jpg", "test/samples/stuff.jpg", "test/test_curve.rb", "test/test_cvavgcomp.rb", "test/test_cvbox2d.rb", "test/test_cvcapture.rb", "test/test_cvchain.rb", "test/test_cvcircle32f.rb", "test/test_cvconnectedcomp.rb", "test/test_cvcontour.rb", "test/test_cvcontourtree.rb", "test/test_cverror.rb", "test/test_cvfeaturetree.rb", "test/test_cvfont.rb", "test/test_cvhaarclassifiercascade.rb", "test/test_cvhistogram.rb", "test/test_cvhumoments.rb", "test/test_cvline.rb", "test/test_cvmat.rb", "test/test_cvmat_drawing.rb", "test/test_cvmat_dxt.rb", "test/test_cvmat_imageprocessing.rb", "test/test_cvmat_matching.rb", "test/test_cvmoments.rb", "test/test_cvpoint.rb", "test/test_cvpoint2d32f.rb", "test/test_cvpoint3d32f.rb", "test/test_cvrect.rb", "test/test_cvscalar.rb", "test/test_cvseq.rb", "test/test_cvsize.rb", "test/test_cvsize2d32f.rb", "test/test_cvslice.rb", "test/test_cvsurfparams.rb", "test/test_cvsurfpoint.rb", "test/test_cvtermcriteria.rb", "test/test_cvtwopoints.rb", "test/test_cvvideowriter.rb", "test/test_eigenfaces.rb", "test/test_fisherfaces.rb", "test/test_iplconvkernel.rb", "test/test_iplimage.rb", "test/test_lbph.rb", "test/test_mouseevent.rb", "test/test_opencv.rb", "test/test_pointset.rb", "test/test_preliminary.rb", "test/test_trackbar.rb", "test/test_window.rb"] s.homepage = "https://github.com/ruby-opencv/ruby-opencv/" s.licenses = ["The BSD License"] s.rdoc_options = ["--main", "README.md"] s.require_paths = ["lib"] s.rubyforge_project = "ruby-opencv" - s.rubygems_version = "2.1.4" + s.rubygems_version = "2.1.9" s.summary = "OpenCV wrapper for Ruby" - s.test_files = ["test/test_cvhistogram.rb", "test/test_cvconnectedcomp.rb", "test/test_mouseevent.rb", "test/test_lbph.rb", "test/test_opencv.rb", "test/test_cvmat_imageprocessing.rb", "test/test_cvmat.rb", "test/test_cvfeaturetree.rb", "test/test_iplconvkernel.rb", "test/test_cvchain.rb", "test/test_cvmat_drawing.rb", "test/test_cvpoint.rb", "test/test_trackbar.rb", "test/test_cvsize2d32f.rb", "test/test_cvsurfparams.rb", "test/test_cvscalar.rb", "test/test_cverror.rb", "test/test_cvhumoments.rb", "test/test_iplimage.rb", "test/test_cvslice.rb", "test/test_cvtwopoints.rb", "test/test_cvfont.rb", "test/test_eigenfaces.rb", "test/test_cvseq.rb", "test/test_cvcontour.rb", "test/test_curve.rb", "test/test_cvsize.rb", "test/test_window.rb", "test/test_cvbox2d.rb", "test/test_cvpoint2d32f.rb", "test/test_cvcapture.rb", "test/test_pointset.rb", "test/test_cvcontourtree.rb", "test/test_cvavgcomp.rb", "test/test_cvsurfpoint.rb", "test/test_cvrect.rb", "test/test_cvline.rb", "test/test_cvvideowriter.rb", "test/test_cvpoint3d32f.rb", "test/test_cvmat_matching.rb", "test/test_cvcircle32f.rb", "test/test_preliminary.rb", "test/test_cvmat_dxt.rb", "test/test_cvmoments.rb", "test/test_fisherfaces.rb", "test/test_cvtermcriteria.rb", "test/test_cvhaarclassifiercascade.rb"] + s.test_files = ["test/test_cvcontour.rb", "test/test_eigenfaces.rb", "test/test_cvmoments.rb", "test/test_cvseq.rb", "test/test_cvcontourtree.rb", "test/test_cvbox2d.rb", "test/test_iplimage.rb", "test/test_cvvideowriter.rb", "test/test_cvline.rb", "test/test_cvhumoments.rb", "test/test_cvfont.rb", "test/test_cvconnectedcomp.rb", "test/test_cvhistogram.rb", "test/test_trackbar.rb", "test/test_cvmat_imageprocessing.rb", "test/test_cvhaarclassifiercascade.rb", "test/test_cvcircle32f.rb", "test/test_cvcapture.rb", "test/test_cvmat_dxt.rb", "test/test_cvrect.rb", "test/test_iplconvkernel.rb", "test/test_cvsurfpoint.rb", "test/test_cvavgcomp.rb", "test/test_cvscalar.rb", "test/test_pointset.rb", "test/test_curve.rb", "test/test_cvtermcriteria.rb", "test/test_cvtwopoints.rb", "test/test_cvsurfparams.rb", "test/test_cvpoint2d32f.rb", "test/test_cvpoint3d32f.rb", "test/test_cvfeaturetree.rb", "test/test_mouseevent.rb", "test/test_cvchain.rb", "test/test_cvmat.rb", "test/test_fisherfaces.rb", "test/test_cvmat_matching.rb", "test/test_cverror.rb", "test/test_cvpoint.rb", "test/test_cvsize2d32f.rb", "test/test_preliminary.rb", "test/test_cvmat_drawing.rb", "test/test_lbph.rb", "test/test_cvsize.rb", "test/test_window.rb", "test/test_cvslice.rb", "test/test_opencv.rb"] if s.respond_to? :specification_version then s.specification_version = 4 From 61d54cb3f0996209c4a2476b37fddd3298c21c18 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Thu, 31 Oct 2013 03:14:40 +0900 Subject: [PATCH 04/12] update FaceRecognizer#predict to return both label and confidence --- ext/opencv/facerecognizer.cpp | 23 ----------------------- ext/opencv/facerecognizer.h | 1 + test/test_eigenfaces.rb | 17 +++-------------- test/test_fisherfaces.rb | 16 +++------------- test/test_lbph.rb | 4 +++- 5 files changed, 10 insertions(+), 51 deletions(-) diff --git a/ext/opencv/facerecognizer.cpp b/ext/opencv/facerecognizer.cpp index 371f843..d52a448 100644 --- a/ext/opencv/facerecognizer.cpp +++ b/ext/opencv/facerecognizer.cpp @@ -92,28 +92,6 @@ rb_train(VALUE self, VALUE src, VALUE labels) */ VALUE rb_predict(VALUE self, VALUE src) -{ - cv::Mat mat = cv::Mat(CVMAT_WITH_CHECK(src)); - cv::FaceRecognizer *self_ptr = FACERECOGNIZER(self); - int label; - try { - label = self_ptr->predict(mat); - } - catch (cv::Exception& e) { - raise_cverror(e); - } - - return INT2NUM(label); -} - -/* - * call-seq: - * predict_with_confidence(src) - * - * Predicts a label and associated confidence (e.g. distance) for a given input image. - */ -VALUE -rb_predict_with_confidence(VALUE self, VALUE src) { cv::Mat mat = cv::Mat(CVMAT_WITH_CHECK(src)); cv::FaceRecognizer *self_ptr = FACERECOGNIZER(self); @@ -188,7 +166,6 @@ define_ruby_class() rb_klass = rb_define_class_under(opencv, "FaceRecognizer", cAlgorithm::rb_class()); rb_define_method(rb_klass, "train", RUBY_METHOD_FUNC(rb_train), 2); rb_define_method(rb_klass, "predict", RUBY_METHOD_FUNC(rb_predict), 1); - rb_define_method(rb_klass, "predict_with_confidence", RUBY_METHOD_FUNC(rb_predict_with_confidence), 1); rb_define_method(rb_klass, "save", RUBY_METHOD_FUNC(rb_save), 1); rb_define_method(rb_klass, "load", RUBY_METHOD_FUNC(rb_load), 1); } diff --git a/ext/opencv/facerecognizer.h b/ext/opencv/facerecognizer.h index 7112bba..e662b9b 100644 --- a/ext/opencv/facerecognizer.h +++ b/ext/opencv/facerecognizer.h @@ -22,6 +22,7 @@ VALUE rb_class(); void define_ruby_class(); VALUE rb_train(VALUE self, VALUE src, VALUE labels); +VALUE rb_predict(VALUE self, VALUE src); VALUE rb_save(VALUE self, VALUE filename); VALUE rb_load(VALUE self, VALUE filename); diff --git a/test/test_eigenfaces.rb b/test/test_eigenfaces.rb index 621891e..d16e953 100755 --- a/test/test_eigenfaces.rb +++ b/test/test_eigenfaces.rb @@ -48,26 +48,15 @@ class TestEigenFaces < OpenCVTestCase img = CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE) label = 1 @eigenfaces.train([img], [label]) - assert_equal(label, @eigenfaces.predict(img)) + predicted_label, predicted_confidence = @eigenfaces.predict(img) + assert_equal(1, predicted_label) + assert_in_delta(0.0, predicted_confidence, 0.01) assert_raise(TypeError) { @eigenfaces.predict(DUMMY_OBJ) } end - def test_predict_with_confidence - img = CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE) - label = 1 - @eigenfaces.train([img], [label]) - lbl, conf = @eigenfaces.predict_with_confidence(img) - assert_equal(label, lbl) - assert_equal(0.0, conf) - - assert_raise(TypeError) { - @eigenfaces.predict_with_confidence(DUMMY_OBJ) - } - end - def test_save img = CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE) label = 1 diff --git a/test/test_fisherfaces.rb b/test/test_fisherfaces.rb index 8a9c154..4eda0aa 100755 --- a/test/test_fisherfaces.rb +++ b/test/test_fisherfaces.rb @@ -44,25 +44,15 @@ class TestFisherFaces < OpenCVTestCase end def test_predict - label = 1 - assert_equal(1, @fisherfaces_trained.predict(@images[0])) + predicted_label, predicted_confidence = @fisherfaces_trained.predict(@images[0]) + assert_equal(1, predicted_label) + assert_in_delta(0.0, predicted_confidence, 0.01) assert_raise(TypeError) { @fisherfaces_trained.predict(DUMMY_OBJ) } end - def test_predict_with_confidence - label = 1 - lbl, conf = @fisherfaces_trained.predict_with_confidence(@images[0]) - assert_equal(1, lbl) - assert_equal(0.0, conf) - - assert_raise(TypeError) { - @fisherfaces_trained.predict_with_confidence(DUMMY_OBJ) - } - end - def test_save filename = "fisherfaces_save-#{DateTime.now.strftime('%Y%m%d%H%M%S')}.xml" begin diff --git a/test/test_lbph.rb b/test/test_lbph.rb index 64b818b..20cb433 100755 --- a/test/test_lbph.rb +++ b/test/test_lbph.rb @@ -52,7 +52,9 @@ class TestLBPH < OpenCVTestCase end def test_predict - assert_equal(1, @lbph_trained.predict(@images[0])) + predicted_label, predicted_confidence = @lbph_trained.predict(@images[0]) + assert_equal(1, predicted_label) + assert_in_delta(0.0, predicted_confidence, 0.01) assert_raise(TypeError) { @lbph_trained.predict(DUMMY_OBJ) From e2e9b1a382ddf8de273c0a2988f4689accda0b91 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Thu, 31 Oct 2013 03:26:41 +0900 Subject: [PATCH 05/12] update tests --- test/test_eigenfaces.rb | 32 +++++++++++++------------------- test/test_fisherfaces.rb | 9 +++++---- test/test_lbph.rb | 9 +++++---- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/test/test_eigenfaces.rb b/test/test_eigenfaces.rb index d16e953..3552cc2 100755 --- a/test/test_eigenfaces.rb +++ b/test/test_eigenfaces.rb @@ -13,8 +13,9 @@ class TestEigenFaces < OpenCVTestCase @eigenfaces = EigenFaces.new @eigenfaces_trained = EigenFaces.new - img = CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE) - @eigenfaces_trained.train([img], [1]) + @images = [CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE)] * 2 + @labels = [1, 2] + @eigenfaces_trained.train(@images, @labels) end def test_initialize @@ -32,53 +33,46 @@ class TestEigenFaces < OpenCVTestCase end def test_train - img = CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE) - assert_nil(@eigenfaces.train([img], [1])) + assert_nil(@eigenfaces.train(@images, @labels)) assert_raise(TypeError) { - @eigenfaces.train(DUMMY_OBJ, [1]) + @eigenfaces.train(DUMMY_OBJ, @labels) } assert_raise(TypeError) { - @eigenfaces.train([img], DUMMY_OBJ) + @eigenfaces.train(@images, DUMMY_OBJ) } end def test_predict - img = CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE) - label = 1 - @eigenfaces.train([img], [label]) - predicted_label, predicted_confidence = @eigenfaces.predict(img) - assert_equal(1, predicted_label) + predicted_label, predicted_confidence = @eigenfaces_trained.predict(@images[0]) + assert_equal(@labels[0], predicted_label) assert_in_delta(0.0, predicted_confidence, 0.01) assert_raise(TypeError) { - @eigenfaces.predict(DUMMY_OBJ) + @eigenfaces_trained.predict(DUMMY_OBJ) } end def test_save - img = CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE) - label = 1 - @eigenfaces.train([img], [label]) filename = "eigenfaces_save-#{DateTime.now.strftime('%Y%m%d%H%M%S')}.xml" begin - @eigenfaces.save(filename) + @eigenfaces_trained.save(filename) assert(File.exist? filename) ensure File.delete filename end assert_raise(TypeError) { - @eigenfaces.save(DUMMY_OBJ) + @eigenfaces_trained.save(DUMMY_OBJ) } end def test_load assert_nothing_raised { - @eigenfaces.load('eigenfaces_save.xml') + @eigenfaces_trained.load('eigenfaces_save.xml') } assert_raise(TypeError) { - @eigenfaces.load(DUMMY_OBJ) + @eigenfaces_trained.load(DUMMY_OBJ) } end diff --git a/test/test_fisherfaces.rb b/test/test_fisherfaces.rb index 4eda0aa..298bfdd 100755 --- a/test/test_fisherfaces.rb +++ b/test/test_fisherfaces.rb @@ -14,7 +14,8 @@ class TestFisherFaces < OpenCVTestCase @fisherfaces_trained = FisherFaces.new @images = [CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE)] * 2 - @fisherfaces_trained.train(@images, [1, 2]) + @labels = [1, 2] + @fisherfaces_trained.train(@images, @labels) end def test_initialize @@ -32,10 +33,10 @@ class TestFisherFaces < OpenCVTestCase end def test_train - assert_nil(@fisherfaces.train(@images, [1, 2])) + assert_nil(@fisherfaces.train(@images, @labels)) assert_raise(TypeError) { - @fisherfaces.train(DUMMY_OBJ, [1]) + @fisherfaces.train(DUMMY_OBJ, @labels) } assert_raise(TypeError) { @@ -45,7 +46,7 @@ class TestFisherFaces < OpenCVTestCase def test_predict predicted_label, predicted_confidence = @fisherfaces_trained.predict(@images[0]) - assert_equal(1, predicted_label) + assert_equal(@labels[0], predicted_label) assert_in_delta(0.0, predicted_confidence, 0.01) assert_raise(TypeError) { diff --git a/test/test_lbph.rb b/test/test_lbph.rb index 20cb433..8cbc3e4 100755 --- a/test/test_lbph.rb +++ b/test/test_lbph.rb @@ -14,7 +14,8 @@ class TestLBPH < OpenCVTestCase @lbph_trained = LBPH.new @images = [CvMat.load(FILENAME_LENA256x256, CV_LOAD_IMAGE_GRAYSCALE)] * 2 - @lbph_trained.train(@images, [1, 1]) + @labels = [1, 2] + @lbph_trained.train(@images, @labels) end def test_initialize @@ -40,10 +41,10 @@ class TestLBPH < OpenCVTestCase end def test_train - assert_nil(@lbph.train(@images, [1, 1])) + assert_nil(@lbph.train(@images, @labels)) assert_raise(TypeError) { - @lbph.train(DUMMY_OBJ, [1, 1]) + @lbph.train(DUMMY_OBJ, @labels) } assert_raise(TypeError) { @@ -53,7 +54,7 @@ class TestLBPH < OpenCVTestCase def test_predict predicted_label, predicted_confidence = @lbph_trained.predict(@images[0]) - assert_equal(1, predicted_label) + assert_equal(@labels[0], predicted_label) assert_in_delta(0.0, predicted_confidence, 0.01) assert_raise(TypeError) { From 96d9baff3930fd581c9302cd0d32e3c8948f0da4 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Thu, 31 Oct 2013 03:48:41 +0900 Subject: [PATCH 06/12] update face recognition examples --- examples/facerec/facerec_eigenfaces.rb | 2 +- examples/facerec/facerec_fisherfaces.rb | 2 +- examples/facerec/facerec_lbph.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/facerec/facerec_eigenfaces.rb b/examples/facerec/facerec_eigenfaces.rb index c7e52f1..866529b 100755 --- a/examples/facerec/facerec_eigenfaces.rb +++ b/examples/facerec/facerec_eigenfaces.rb @@ -74,7 +74,7 @@ model = EigenFaces.new model.train(images, labels) # The following line predicts the label of a given test image: -predicted_label = model.predict(test_sample) +predicted_label, predicted_confidence = model.predict(test_sample) puts "Predicted class: #{predicted_label} / Actual class: #{test_label}" diff --git a/examples/facerec/facerec_fisherfaces.rb b/examples/facerec/facerec_fisherfaces.rb index 6fa455e..f2f9a4a 100755 --- a/examples/facerec/facerec_fisherfaces.rb +++ b/examples/facerec/facerec_fisherfaces.rb @@ -73,7 +73,7 @@ model = FisherFaces.new model.train(images, labels) # The following line predicts the label of a given test image: -predicted_label = model.predict(test_sample) +predicted_label, predicted_confidence = model.predict(test_sample) puts "Predicted class: #{predicted_label} / Actual class: #{test_label}" diff --git a/examples/facerec/facerec_lbph.rb b/examples/facerec/facerec_lbph.rb index 4ecaa50..4fee5d5 100755 --- a/examples/facerec/facerec_lbph.rb +++ b/examples/facerec/facerec_lbph.rb @@ -75,7 +75,7 @@ model = LBPH.new model.train(images, labels) # The following line predicts the label of a given test image: -predicted_label = model.predict(test_sample) +predicted_label, predicted_confidence = model.predict(test_sample) # To get the confidence of a prediction call the model with: # From abd42c578b1a5e680bae639e94dcdfe009745e89 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Thu, 31 Oct 2013 04:20:39 +0900 Subject: [PATCH 07/12] move sample data --- examples/alpha_blend.rb | 4 ++-- examples/find_obj.rb | 4 ++-- examples/houghcircle.rb | 2 +- examples/{ => images}/box.png | Bin examples/{ => images}/box_in_scene.png | Bin examples/{ => images}/inpaint.png | Bin examples/images/lena-256x256.jpg | Bin 0 -> 12369 bytes examples/images/lena-eyes.jpg | Bin 0 -> 3174 bytes examples/{ => images}/lenna-rotated.jpg | Bin examples/{ => images}/lenna.jpg | Bin examples/{ => images}/stuff.jpg | Bin examples/{ => images}/tiffany.jpg | Bin examples/inpaint.rb | 2 +- examples/match_kdtree.rb | 4 ++-- examples/match_template.rb | 4 ++-- .../matching_to_many_images.rb | 2 +- ruby-opencv.gemspec | 8 ++++---- 17 files changed, 15 insertions(+), 15 deletions(-) rename examples/{ => images}/box.png (100%) rename examples/{ => images}/box_in_scene.png (100%) rename examples/{ => images}/inpaint.png (100%) create mode 100644 examples/images/lena-256x256.jpg create mode 100644 examples/images/lena-eyes.jpg rename examples/{ => images}/lenna-rotated.jpg (100%) rename examples/{ => images}/lenna.jpg (100%) rename examples/{ => images}/stuff.jpg (100%) rename examples/{ => images}/tiffany.jpg (100%) rename examples/{ => matching_to_many_images}/matching_to_many_images.rb (86%) diff --git a/examples/alpha_blend.rb b/examples/alpha_blend.rb index 1539830..e65331a 100755 --- a/examples/alpha_blend.rb +++ b/examples/alpha_blend.rb @@ -6,8 +6,8 @@ require 'opencv' include OpenCV -img1 = IplImage.load('lenna.jpg', CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH) -img2 = IplImage.load('tiffany.jpg', CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH) +img1 = IplImage.load('images/lenna.jpg', CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH) +img2 = IplImage.load('images/tiffany.jpg', CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH) window = GUI::Window.new('Alpha blend') max = 100.0 diff --git a/examples/find_obj.rb b/examples/find_obj.rb index 5d0ca04..ac8f8a6 100755 --- a/examples/find_obj.rb +++ b/examples/find_obj.rb @@ -100,8 +100,8 @@ puts 'Usage:' puts "ruby #{__FILE__} , default is box.png and box_in_scene.png" puts -object_filename = (ARGV.size == 2) ? ARGV[0] : 'box.png' -scene_filename = (ARGV.size == 2) ? ARGV[1] : 'box_in_scene.png' +object_filename = (ARGV.size == 2) ? ARGV[0] : 'images/box.png' +scene_filename = (ARGV.size == 2) ? ARGV[1] : 'images/box_in_scene.png' object, image = nil, nil begin diff --git a/examples/houghcircle.rb b/examples/houghcircle.rb index 26aa997..226377f 100755 --- a/examples/houghcircle.rb +++ b/examples/houghcircle.rb @@ -7,7 +7,7 @@ include OpenCV original_window = GUI::Window.new "original" hough_window = GUI::Window.new "hough circles" -image = IplImage::load "stuff.jpg" +image = IplImage::load "images/stuff.jpg" gray = image.BGR2GRAY result = image.clone diff --git a/examples/box.png b/examples/images/box.png similarity index 100% rename from examples/box.png rename to examples/images/box.png diff --git a/examples/box_in_scene.png b/examples/images/box_in_scene.png similarity index 100% rename from examples/box_in_scene.png rename to examples/images/box_in_scene.png diff --git a/examples/inpaint.png b/examples/images/inpaint.png similarity index 100% rename from examples/inpaint.png rename to examples/images/inpaint.png diff --git a/examples/images/lena-256x256.jpg b/examples/images/lena-256x256.jpg new file mode 100644 index 0000000000000000000000000000000000000000..349f8e9d03db4a0e4e57ef4d74b8222796d119e2 GIT binary patch literal 12369 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 OQLAkZtP6Pg``-Y^WAjx2 literal 0 HcmV?d00001 diff --git a/examples/images/lena-eyes.jpg b/examples/images/lena-eyes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3f2caa70827ce58e128dd54522c3d5d3d284a9e GIT binary patch literal 3174 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 " puts -template_filename = (ARGV.size == 2) ? ARGV[0] : File.expand_path(File.dirname(__FILE__) + '/../test/samples/lena-eyes.jpg') -match_image_filename = (ARGV.size == 2) ? ARGV[1] : File.expand_path(File.dirname(__FILE__) + '/../test/samples/lena-inpaint.jpg') +template_filename = (ARGV.size == 2) ? ARGV[0] : File.expand_path(File.dirname(__FILE__) + '/images/lena-eyes.jpg') +match_image_filename = (ARGV.size == 2) ? ARGV[1] : File.expand_path(File.dirname(__FILE__) + '/images/lena-256x256.jpg') template = CvMat.load(template_filename) match_image = CvMat.load(match_image_filename) diff --git a/examples/matching_to_many_images.rb b/examples/matching_to_many_images/matching_to_many_images.rb similarity index 86% rename from examples/matching_to_many_images.rb rename to examples/matching_to_many_images/matching_to_many_images.rb index 301570d..0d70b1f 100644 --- a/examples/matching_to_many_images.rb +++ b/examples/matching_to_many_images/matching_to_many_images.rb @@ -2,7 +2,7 @@ require 'opencv' require 'benchmark' include OpenCV -data = File.join(File.dirname(__FILE__), 'matching_to_many_images') +data = File.dirname(__FILE__) query = IplImage.load File.join(data, 'query.png'), CV_LOAD_IMAGE_GRAYSCALE image_files = ['1.png', '2.png', '3.png'].map{|f| File.join(data, 'train', f)} diff --git a/ruby-opencv.gemspec b/ruby-opencv.gemspec index d1a6733..7322e05 100644 --- a/ruby-opencv.gemspec +++ b/ruby-opencv.gemspec @@ -1,13 +1,13 @@ # -*- encoding: utf-8 -*- -# stub: ruby-opencv 0.0.10.20131020232231 ruby lib +# stub: ruby-opencv 0.0.10.20131031042012 ruby lib Gem::Specification.new do |s| s.name = "ruby-opencv" - s.version = "0.0.10.20131020232231" + s.version = "0.0.10.20131031042012" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["lsxi", "ser1zw", "pcting"] - s.date = "2013-10-20" + s.date = "2013-10-30" 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." s.email = ["masakazu.yonekura@gmail.com", "azariahsawtikes@gmail.com", "pcting@gmail.com"] s.extensions = ["ext/opencv/extconf.rb"] @@ -18,7 +18,7 @@ Gem::Specification.new do |s| s.rdoc_options = ["--main", "README.md"] s.require_paths = ["lib"] s.rubyforge_project = "ruby-opencv" - s.rubygems_version = "2.1.9" + s.rubygems_version = "2.1.10" s.summary = "OpenCV wrapper for Ruby" s.test_files = ["test/test_cvcontour.rb", "test/test_eigenfaces.rb", "test/test_cvmoments.rb", "test/test_cvseq.rb", "test/test_cvcontourtree.rb", "test/test_cvbox2d.rb", "test/test_iplimage.rb", "test/test_cvvideowriter.rb", "test/test_cvline.rb", "test/test_cvhumoments.rb", "test/test_cvfont.rb", "test/test_cvconnectedcomp.rb", "test/test_cvhistogram.rb", "test/test_trackbar.rb", "test/test_cvmat_imageprocessing.rb", "test/test_cvhaarclassifiercascade.rb", "test/test_cvcircle32f.rb", "test/test_cvcapture.rb", "test/test_cvmat_dxt.rb", "test/test_cvrect.rb", "test/test_iplconvkernel.rb", "test/test_cvsurfpoint.rb", "test/test_cvavgcomp.rb", "test/test_cvscalar.rb", "test/test_pointset.rb", "test/test_curve.rb", "test/test_cvtermcriteria.rb", "test/test_cvtwopoints.rb", "test/test_cvsurfparams.rb", "test/test_cvpoint2d32f.rb", "test/test_cvpoint3d32f.rb", "test/test_cvfeaturetree.rb", "test/test_mouseevent.rb", "test/test_cvchain.rb", "test/test_cvmat.rb", "test/test_fisherfaces.rb", "test/test_cvmat_matching.rb", "test/test_cverror.rb", "test/test_cvpoint.rb", "test/test_cvsize2d32f.rb", "test/test_preliminary.rb", "test/test_cvmat_drawing.rb", "test/test_lbph.rb", "test/test_cvsize.rb", "test/test_window.rb", "test/test_cvslice.rb", "test/test_opencv.rb"] From 42af5d63273f95f5673efa44a15a326369087f23 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Thu, 31 Oct 2013 05:24:56 +0900 Subject: [PATCH 08/12] update Manifest.txt and gemspec --- Manifest.txt | 18 ++++++++++-------- ruby-opencv.gemspec | 6 +++--- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Manifest.txt b/Manifest.txt index a800325..503c58e 100644 --- a/Manifest.txt +++ b/Manifest.txt @@ -8,8 +8,6 @@ README.md Rakefile config.yml examples/alpha_blend.rb -examples/box.png -examples/box_in_scene.png examples/contours/bitmap-contours-with-labels.png examples/contours/bitmap-contours.png examples/contours/bounding-box-detect-canny.rb @@ -24,13 +22,19 @@ examples/facerec/facerec_lbph.rb examples/facerec/readme.md examples/find_obj.rb examples/houghcircle.rb -examples/inpaint.png +examples/images/box.png +examples/images/box_in_scene.png +examples/images/inpaint.png +examples/images/lena-256x256.jpg +examples/images/lena-eyes.jpg +examples/images/lenna-rotated.jpg +examples/images/lenna.jpg +examples/images/stuff.jpg +examples/images/tiffany.jpg examples/inpaint.rb -examples/lenna-rotated.jpg -examples/lenna.jpg examples/match_kdtree.rb examples/match_template.rb -examples/matching_to_many_images.rb +examples/matching_to_many_images/matching_to_many_images.rb examples/matching_to_many_images/query.png examples/matching_to_many_images/train/1.png examples/matching_to_many_images/train/2.png @@ -38,8 +42,6 @@ examples/matching_to_many_images/train/3.png examples/matching_to_many_images/train/trainImages.txt examples/paint.rb examples/snake.rb -examples/stuff.jpg -examples/tiffany.jpg ext/opencv/algorithm.cpp ext/opencv/algorithm.h ext/opencv/curve.cpp diff --git a/ruby-opencv.gemspec b/ruby-opencv.gemspec index 7322e05..ce4283a 100644 --- a/ruby-opencv.gemspec +++ b/ruby-opencv.gemspec @@ -1,9 +1,9 @@ # -*- encoding: utf-8 -*- -# stub: ruby-opencv 0.0.10.20131031042012 ruby lib +# stub: ruby-opencv 0.0.10.20131031052436 ruby lib Gem::Specification.new do |s| s.name = "ruby-opencv" - s.version = "0.0.10.20131031042012" + s.version = "0.0.10.20131031052436" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["lsxi", "ser1zw", "pcting"] @@ -12,7 +12,7 @@ Gem::Specification.new do |s| s.email = ["masakazu.yonekura@gmail.com", "azariahsawtikes@gmail.com", "pcting@gmail.com"] s.extensions = ["ext/opencv/extconf.rb"] s.extra_rdoc_files = ["DEVELOPERS_NOTE.md", "History.txt", "License.txt", "Manifest.txt", "README.md", "examples/facerec/readme.md", "examples/matching_to_many_images/train/trainImages.txt"] - s.files = [".gitignore", "DEVELOPERS_NOTE.md", "Gemfile", "History.txt", "License.txt", "Manifest.txt", "README.md", "Rakefile", "config.yml", "examples/alpha_blend.rb", "examples/box.png", "examples/box_in_scene.png", "examples/contours/bitmap-contours-with-labels.png", "examples/contours/bitmap-contours.png", "examples/contours/bounding-box-detect-canny.rb", "examples/contours/contour_retrieval_modes.rb", "examples/contours/rotated-boxes.jpg", "examples/convexhull.rb", "examples/face_detect.rb", "examples/facerec/create_csv.rb", "examples/facerec/facerec_eigenfaces.rb", "examples/facerec/facerec_fisherfaces.rb", "examples/facerec/facerec_lbph.rb", "examples/facerec/readme.md", "examples/find_obj.rb", "examples/houghcircle.rb", "examples/inpaint.png", "examples/inpaint.rb", "examples/lenna-rotated.jpg", "examples/lenna.jpg", "examples/match_kdtree.rb", "examples/match_template.rb", "examples/matching_to_many_images.rb", "examples/matching_to_many_images/query.png", "examples/matching_to_many_images/train/1.png", "examples/matching_to_many_images/train/2.png", "examples/matching_to_many_images/train/3.png", "examples/matching_to_many_images/train/trainImages.txt", "examples/paint.rb", "examples/snake.rb", "examples/stuff.jpg", "examples/tiffany.jpg", "ext/opencv/algorithm.cpp", "ext/opencv/algorithm.h", "ext/opencv/curve.cpp", "ext/opencv/curve.h", "ext/opencv/cvavgcomp.cpp", "ext/opencv/cvavgcomp.h", "ext/opencv/cvbox2d.cpp", "ext/opencv/cvbox2d.h", "ext/opencv/cvcapture.cpp", "ext/opencv/cvcapture.h", "ext/opencv/cvchain.cpp", "ext/opencv/cvchain.h", "ext/opencv/cvcircle32f.cpp", "ext/opencv/cvcircle32f.h", "ext/opencv/cvcondensation.cpp", "ext/opencv/cvcondensation.h", "ext/opencv/cvconnectedcomp.cpp", "ext/opencv/cvconnectedcomp.h", "ext/opencv/cvcontour.cpp", "ext/opencv/cvcontour.h", "ext/opencv/cvcontourtree.cpp", "ext/opencv/cvcontourtree.h", "ext/opencv/cvconvexitydefect.cpp", "ext/opencv/cvconvexitydefect.h", "ext/opencv/cverror.cpp", "ext/opencv/cverror.h", "ext/opencv/cvfeaturetree.cpp", "ext/opencv/cvfeaturetree.h", "ext/opencv/cvfont.cpp", "ext/opencv/cvfont.h", "ext/opencv/cvhaarclassifiercascade.cpp", "ext/opencv/cvhaarclassifiercascade.h", "ext/opencv/cvhistogram.cpp", "ext/opencv/cvhistogram.h", "ext/opencv/cvhumoments.cpp", "ext/opencv/cvhumoments.h", "ext/opencv/cvline.cpp", "ext/opencv/cvline.h", "ext/opencv/cvmat.cpp", "ext/opencv/cvmat.h", "ext/opencv/cvmatnd.cpp", "ext/opencv/cvmatnd.h", "ext/opencv/cvmemstorage.cpp", "ext/opencv/cvmemstorage.h", "ext/opencv/cvmoments.cpp", "ext/opencv/cvmoments.h", "ext/opencv/cvpoint.cpp", "ext/opencv/cvpoint.h", "ext/opencv/cvpoint2d32f.cpp", "ext/opencv/cvpoint2d32f.h", "ext/opencv/cvpoint3d32f.cpp", "ext/opencv/cvpoint3d32f.h", "ext/opencv/cvrect.cpp", "ext/opencv/cvrect.h", "ext/opencv/cvscalar.cpp", "ext/opencv/cvscalar.h", "ext/opencv/cvseq.cpp", "ext/opencv/cvseq.h", "ext/opencv/cvsize.cpp", "ext/opencv/cvsize.h", "ext/opencv/cvsize2d32f.cpp", "ext/opencv/cvsize2d32f.h", "ext/opencv/cvslice.cpp", "ext/opencv/cvslice.h", "ext/opencv/cvsparsemat.cpp", "ext/opencv/cvsparsemat.h", "ext/opencv/cvsurfparams.cpp", "ext/opencv/cvsurfparams.h", "ext/opencv/cvsurfpoint.cpp", "ext/opencv/cvsurfpoint.h", "ext/opencv/cvtermcriteria.cpp", "ext/opencv/cvtermcriteria.h", "ext/opencv/cvtwopoints.cpp", "ext/opencv/cvtwopoints.h", "ext/opencv/cvutils.cpp", "ext/opencv/cvutils.h", "ext/opencv/cvvideowriter.cpp", "ext/opencv/cvvideowriter.h", "ext/opencv/eigenfaces.cpp", "ext/opencv/eigenfaces.h", "ext/opencv/extconf.rb", "ext/opencv/facerecognizer.cpp", "ext/opencv/facerecognizer.h", "ext/opencv/fisherfaces.cpp", "ext/opencv/fisherfaces.h", "ext/opencv/gui.cpp", "ext/opencv/gui.h", "ext/opencv/iplconvkernel.cpp", "ext/opencv/iplconvkernel.h", "ext/opencv/iplimage.cpp", "ext/opencv/iplimage.h", "ext/opencv/lbph.cpp", "ext/opencv/lbph.h", "ext/opencv/mouseevent.cpp", "ext/opencv/mouseevent.h", "ext/opencv/opencv.cpp", "ext/opencv/opencv.h", "ext/opencv/pointset.cpp", "ext/opencv/pointset.h", "ext/opencv/trackbar.cpp", "ext/opencv/trackbar.h", "ext/opencv/window.cpp", "ext/opencv/window.h", "images/CvMat_sobel.png", "images/CvMat_sub_rect.png", "images/CvSeq_relationmap.png", "images/face_detect_from_lena.jpg", "lib/opencv.rb", "lib/opencv/psyched_yaml.rb", "lib/opencv/version.rb", "ruby-opencv.gemspec", "test/eigenfaces_save.xml", "test/fisherfaces_save.xml", "test/helper.rb", "test/lbph_save.xml", "test/runner.rb", "test/samples/airplane.jpg", "test/samples/baboon.jpg", "test/samples/baboon200.jpg", "test/samples/baboon200_rotated.jpg", "test/samples/blank0.jpg", "test/samples/blank1.jpg", "test/samples/blank2.jpg", "test/samples/blank3.jpg", "test/samples/blank4.jpg", "test/samples/blank5.jpg", "test/samples/blank6.jpg", "test/samples/blank7.jpg", "test/samples/blank8.jpg", "test/samples/blank9.jpg", "test/samples/cat.jpg", "test/samples/chessboard.jpg", "test/samples/contours.jpg", "test/samples/fruits.jpg", "test/samples/haarcascade_frontalface_alt.xml.gz", "test/samples/inpaint-mask.bmp", "test/samples/lena-256x256.jpg", "test/samples/lena-32x32.jpg", "test/samples/lena-eyes.jpg", "test/samples/lena-inpaint.jpg", "test/samples/lena.jpg", "test/samples/lines.jpg", "test/samples/messy0.jpg", "test/samples/messy1.jpg", "test/samples/movie_sample.avi", "test/samples/one_way_train_0000.jpg", "test/samples/one_way_train_0001.jpg", "test/samples/partially_blank0.jpg", "test/samples/partially_blank1.jpg", "test/samples/smooth0.jpg", "test/samples/smooth1.jpg", "test/samples/smooth2.jpg", "test/samples/smooth3.jpg", "test/samples/smooth4.jpg", "test/samples/smooth5.jpg", "test/samples/smooth6.jpg", "test/samples/str-cv-rotated.jpg", "test/samples/str-cv.jpg", "test/samples/str-ov.jpg", "test/samples/stuff.jpg", "test/test_curve.rb", "test/test_cvavgcomp.rb", "test/test_cvbox2d.rb", "test/test_cvcapture.rb", "test/test_cvchain.rb", "test/test_cvcircle32f.rb", "test/test_cvconnectedcomp.rb", "test/test_cvcontour.rb", "test/test_cvcontourtree.rb", "test/test_cverror.rb", "test/test_cvfeaturetree.rb", "test/test_cvfont.rb", "test/test_cvhaarclassifiercascade.rb", "test/test_cvhistogram.rb", "test/test_cvhumoments.rb", "test/test_cvline.rb", "test/test_cvmat.rb", "test/test_cvmat_drawing.rb", "test/test_cvmat_dxt.rb", "test/test_cvmat_imageprocessing.rb", "test/test_cvmat_matching.rb", "test/test_cvmoments.rb", "test/test_cvpoint.rb", "test/test_cvpoint2d32f.rb", "test/test_cvpoint3d32f.rb", "test/test_cvrect.rb", "test/test_cvscalar.rb", "test/test_cvseq.rb", "test/test_cvsize.rb", "test/test_cvsize2d32f.rb", "test/test_cvslice.rb", "test/test_cvsurfparams.rb", "test/test_cvsurfpoint.rb", "test/test_cvtermcriteria.rb", "test/test_cvtwopoints.rb", "test/test_cvvideowriter.rb", "test/test_eigenfaces.rb", "test/test_fisherfaces.rb", "test/test_iplconvkernel.rb", "test/test_iplimage.rb", "test/test_lbph.rb", "test/test_mouseevent.rb", "test/test_opencv.rb", "test/test_pointset.rb", "test/test_preliminary.rb", "test/test_trackbar.rb", "test/test_window.rb"] + s.files = [".gitignore", "DEVELOPERS_NOTE.md", "Gemfile", "History.txt", "License.txt", "Manifest.txt", "README.md", "Rakefile", "config.yml", "examples/alpha_blend.rb", "examples/contours/bitmap-contours-with-labels.png", "examples/contours/bitmap-contours.png", "examples/contours/bounding-box-detect-canny.rb", "examples/contours/contour_retrieval_modes.rb", "examples/contours/rotated-boxes.jpg", "examples/convexhull.rb", "examples/face_detect.rb", "examples/facerec/create_csv.rb", "examples/facerec/facerec_eigenfaces.rb", "examples/facerec/facerec_fisherfaces.rb", "examples/facerec/facerec_lbph.rb", "examples/facerec/readme.md", "examples/find_obj.rb", "examples/houghcircle.rb", "examples/images/box.png", "examples/images/box_in_scene.png", "examples/images/inpaint.png", "examples/images/lena-256x256.jpg", "examples/images/lena-eyes.jpg", "examples/images/lenna-rotated.jpg", "examples/images/lenna.jpg", "examples/images/stuff.jpg", "examples/images/tiffany.jpg", "examples/inpaint.rb", "examples/match_kdtree.rb", "examples/match_template.rb", "examples/matching_to_many_images/matching_to_many_images.rb", "examples/matching_to_many_images/query.png", "examples/matching_to_many_images/train/1.png", "examples/matching_to_many_images/train/2.png", "examples/matching_to_many_images/train/3.png", "examples/matching_to_many_images/train/trainImages.txt", "examples/paint.rb", "examples/snake.rb", "ext/opencv/algorithm.cpp", "ext/opencv/algorithm.h", "ext/opencv/curve.cpp", "ext/opencv/curve.h", "ext/opencv/cvavgcomp.cpp", "ext/opencv/cvavgcomp.h", "ext/opencv/cvbox2d.cpp", "ext/opencv/cvbox2d.h", "ext/opencv/cvcapture.cpp", "ext/opencv/cvcapture.h", "ext/opencv/cvchain.cpp", "ext/opencv/cvchain.h", "ext/opencv/cvcircle32f.cpp", "ext/opencv/cvcircle32f.h", "ext/opencv/cvcondensation.cpp", "ext/opencv/cvcondensation.h", "ext/opencv/cvconnectedcomp.cpp", "ext/opencv/cvconnectedcomp.h", "ext/opencv/cvcontour.cpp", "ext/opencv/cvcontour.h", "ext/opencv/cvcontourtree.cpp", "ext/opencv/cvcontourtree.h", "ext/opencv/cvconvexitydefect.cpp", "ext/opencv/cvconvexitydefect.h", "ext/opencv/cverror.cpp", "ext/opencv/cverror.h", "ext/opencv/cvfeaturetree.cpp", "ext/opencv/cvfeaturetree.h", "ext/opencv/cvfont.cpp", "ext/opencv/cvfont.h", "ext/opencv/cvhaarclassifiercascade.cpp", "ext/opencv/cvhaarclassifiercascade.h", "ext/opencv/cvhistogram.cpp", "ext/opencv/cvhistogram.h", "ext/opencv/cvhumoments.cpp", "ext/opencv/cvhumoments.h", "ext/opencv/cvline.cpp", "ext/opencv/cvline.h", "ext/opencv/cvmat.cpp", "ext/opencv/cvmat.h", "ext/opencv/cvmatnd.cpp", "ext/opencv/cvmatnd.h", "ext/opencv/cvmemstorage.cpp", "ext/opencv/cvmemstorage.h", "ext/opencv/cvmoments.cpp", "ext/opencv/cvmoments.h", "ext/opencv/cvpoint.cpp", "ext/opencv/cvpoint.h", "ext/opencv/cvpoint2d32f.cpp", "ext/opencv/cvpoint2d32f.h", "ext/opencv/cvpoint3d32f.cpp", "ext/opencv/cvpoint3d32f.h", "ext/opencv/cvrect.cpp", "ext/opencv/cvrect.h", "ext/opencv/cvscalar.cpp", "ext/opencv/cvscalar.h", "ext/opencv/cvseq.cpp", "ext/opencv/cvseq.h", "ext/opencv/cvsize.cpp", "ext/opencv/cvsize.h", "ext/opencv/cvsize2d32f.cpp", "ext/opencv/cvsize2d32f.h", "ext/opencv/cvslice.cpp", "ext/opencv/cvslice.h", "ext/opencv/cvsparsemat.cpp", "ext/opencv/cvsparsemat.h", "ext/opencv/cvsurfparams.cpp", "ext/opencv/cvsurfparams.h", "ext/opencv/cvsurfpoint.cpp", "ext/opencv/cvsurfpoint.h", "ext/opencv/cvtermcriteria.cpp", "ext/opencv/cvtermcriteria.h", "ext/opencv/cvtwopoints.cpp", "ext/opencv/cvtwopoints.h", "ext/opencv/cvutils.cpp", "ext/opencv/cvutils.h", "ext/opencv/cvvideowriter.cpp", "ext/opencv/cvvideowriter.h", "ext/opencv/eigenfaces.cpp", "ext/opencv/eigenfaces.h", "ext/opencv/extconf.rb", "ext/opencv/facerecognizer.cpp", "ext/opencv/facerecognizer.h", "ext/opencv/fisherfaces.cpp", "ext/opencv/fisherfaces.h", "ext/opencv/gui.cpp", "ext/opencv/gui.h", "ext/opencv/iplconvkernel.cpp", "ext/opencv/iplconvkernel.h", "ext/opencv/iplimage.cpp", "ext/opencv/iplimage.h", "ext/opencv/lbph.cpp", "ext/opencv/lbph.h", "ext/opencv/mouseevent.cpp", "ext/opencv/mouseevent.h", "ext/opencv/opencv.cpp", "ext/opencv/opencv.h", "ext/opencv/pointset.cpp", "ext/opencv/pointset.h", "ext/opencv/trackbar.cpp", "ext/opencv/trackbar.h", "ext/opencv/window.cpp", "ext/opencv/window.h", "images/CvMat_sobel.png", "images/CvMat_sub_rect.png", "images/CvSeq_relationmap.png", "images/face_detect_from_lena.jpg", "lib/opencv.rb", "lib/opencv/psyched_yaml.rb", "lib/opencv/version.rb", "ruby-opencv.gemspec", "test/eigenfaces_save.xml", "test/fisherfaces_save.xml", "test/helper.rb", "test/lbph_save.xml", "test/runner.rb", "test/samples/airplane.jpg", "test/samples/baboon.jpg", "test/samples/baboon200.jpg", "test/samples/baboon200_rotated.jpg", "test/samples/blank0.jpg", "test/samples/blank1.jpg", "test/samples/blank2.jpg", "test/samples/blank3.jpg", "test/samples/blank4.jpg", "test/samples/blank5.jpg", "test/samples/blank6.jpg", "test/samples/blank7.jpg", "test/samples/blank8.jpg", "test/samples/blank9.jpg", "test/samples/cat.jpg", "test/samples/chessboard.jpg", "test/samples/contours.jpg", "test/samples/fruits.jpg", "test/samples/haarcascade_frontalface_alt.xml.gz", "test/samples/inpaint-mask.bmp", "test/samples/lena-256x256.jpg", "test/samples/lena-32x32.jpg", "test/samples/lena-eyes.jpg", "test/samples/lena-inpaint.jpg", "test/samples/lena.jpg", "test/samples/lines.jpg", "test/samples/messy0.jpg", "test/samples/messy1.jpg", "test/samples/movie_sample.avi", "test/samples/one_way_train_0000.jpg", "test/samples/one_way_train_0001.jpg", "test/samples/partially_blank0.jpg", "test/samples/partially_blank1.jpg", "test/samples/smooth0.jpg", "test/samples/smooth1.jpg", "test/samples/smooth2.jpg", "test/samples/smooth3.jpg", "test/samples/smooth4.jpg", "test/samples/smooth5.jpg", "test/samples/smooth6.jpg", "test/samples/str-cv-rotated.jpg", "test/samples/str-cv.jpg", "test/samples/str-ov.jpg", "test/samples/stuff.jpg", "test/test_curve.rb", "test/test_cvavgcomp.rb", "test/test_cvbox2d.rb", "test/test_cvcapture.rb", "test/test_cvchain.rb", "test/test_cvcircle32f.rb", "test/test_cvconnectedcomp.rb", "test/test_cvcontour.rb", "test/test_cvcontourtree.rb", "test/test_cverror.rb", "test/test_cvfeaturetree.rb", "test/test_cvfont.rb", "test/test_cvhaarclassifiercascade.rb", "test/test_cvhistogram.rb", "test/test_cvhumoments.rb", "test/test_cvline.rb", "test/test_cvmat.rb", "test/test_cvmat_drawing.rb", "test/test_cvmat_dxt.rb", "test/test_cvmat_imageprocessing.rb", "test/test_cvmat_matching.rb", "test/test_cvmoments.rb", "test/test_cvpoint.rb", "test/test_cvpoint2d32f.rb", "test/test_cvpoint3d32f.rb", "test/test_cvrect.rb", "test/test_cvscalar.rb", "test/test_cvseq.rb", "test/test_cvsize.rb", "test/test_cvsize2d32f.rb", "test/test_cvslice.rb", "test/test_cvsurfparams.rb", "test/test_cvsurfpoint.rb", "test/test_cvtermcriteria.rb", "test/test_cvtwopoints.rb", "test/test_cvvideowriter.rb", "test/test_eigenfaces.rb", "test/test_fisherfaces.rb", "test/test_iplconvkernel.rb", "test/test_iplimage.rb", "test/test_lbph.rb", "test/test_mouseevent.rb", "test/test_opencv.rb", "test/test_pointset.rb", "test/test_preliminary.rb", "test/test_trackbar.rb", "test/test_window.rb"] s.homepage = "https://github.com/ruby-opencv/ruby-opencv/" s.licenses = ["The BSD License"] s.rdoc_options = ["--main", "README.md"] From d271751e44438ca0eaafd19cb8433ab66e4d6772 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Sat, 9 Nov 2013 00:54:29 +0900 Subject: [PATCH 09/12] fix issue #38 --- examples/match_template.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/match_template.rb b/examples/match_template.rb index ce51c45..e56cc84 100755 --- a/examples/match_template.rb +++ b/examples/match_template.rb @@ -15,7 +15,7 @@ match_image_filename = (ARGV.size == 2) ? ARGV[1] : File.expand_path(File.dirnam template = CvMat.load(template_filename) match_image = CvMat.load(match_image_filename) -result = match_image.match_template(template) +result = match_image.match_template(template, :sqdiff_normed) pt1 = result.min_max_loc[2] # minimum location pt2 = CvPoint.new(pt1.x + template.width, pt1.y + template.height) From fff9b499b8ae039c6ca6cfc3b6bc39cb0d990cc1 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Mon, 25 Nov 2013 01:51:27 +0900 Subject: [PATCH 10/12] support OpenCV 2.4.7 --- README.md | 2 +- ruby-opencv.gemspec | 8 ++++---- test/test_opencv.rb | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 3de548b..11fcac9 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ An OpenCV wrapper for Ruby. * Web site: -* Ruby 1.9.3, 2.0.0 and OpenCV 2.4.6.1 are supported. +* Ruby 1.9.3, 2.0.0 and OpenCV 2.4.7 are supported. ## Requirement diff --git a/ruby-opencv.gemspec b/ruby-opencv.gemspec index ce4283a..b92339f 100644 --- a/ruby-opencv.gemspec +++ b/ruby-opencv.gemspec @@ -1,13 +1,13 @@ # -*- encoding: utf-8 -*- -# stub: ruby-opencv 0.0.10.20131031052436 ruby lib +# stub: ruby-opencv 0.0.10.20131125011902 ruby lib Gem::Specification.new do |s| s.name = "ruby-opencv" - s.version = "0.0.10.20131031052436" + s.version = "0.0.10.20131125011902" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["lsxi", "ser1zw", "pcting"] - s.date = "2013-10-30" + s.date = "2013-11-24" 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." s.email = ["masakazu.yonekura@gmail.com", "azariahsawtikes@gmail.com", "pcting@gmail.com"] s.extensions = ["ext/opencv/extconf.rb"] @@ -18,7 +18,7 @@ Gem::Specification.new do |s| s.rdoc_options = ["--main", "README.md"] s.require_paths = ["lib"] s.rubyforge_project = "ruby-opencv" - s.rubygems_version = "2.1.10" + s.rubygems_version = "2.1.11" s.summary = "OpenCV wrapper for Ruby" s.test_files = ["test/test_cvcontour.rb", "test/test_eigenfaces.rb", "test/test_cvmoments.rb", "test/test_cvseq.rb", "test/test_cvcontourtree.rb", "test/test_cvbox2d.rb", "test/test_iplimage.rb", "test/test_cvvideowriter.rb", "test/test_cvline.rb", "test/test_cvhumoments.rb", "test/test_cvfont.rb", "test/test_cvconnectedcomp.rb", "test/test_cvhistogram.rb", "test/test_trackbar.rb", "test/test_cvmat_imageprocessing.rb", "test/test_cvhaarclassifiercascade.rb", "test/test_cvcircle32f.rb", "test/test_cvcapture.rb", "test/test_cvmat_dxt.rb", "test/test_cvrect.rb", "test/test_iplconvkernel.rb", "test/test_cvsurfpoint.rb", "test/test_cvavgcomp.rb", "test/test_cvscalar.rb", "test/test_pointset.rb", "test/test_curve.rb", "test/test_cvtermcriteria.rb", "test/test_cvtwopoints.rb", "test/test_cvsurfparams.rb", "test/test_cvpoint2d32f.rb", "test/test_cvpoint3d32f.rb", "test/test_cvfeaturetree.rb", "test/test_mouseevent.rb", "test/test_cvchain.rb", "test/test_cvmat.rb", "test/test_fisherfaces.rb", "test/test_cvmat_matching.rb", "test/test_cverror.rb", "test/test_cvpoint.rb", "test/test_cvsize2d32f.rb", "test/test_preliminary.rb", "test/test_cvmat_drawing.rb", "test/test_lbph.rb", "test/test_cvsize.rb", "test/test_window.rb", "test/test_cvslice.rb", "test/test_opencv.rb"] diff --git a/test/test_opencv.rb b/test/test_opencv.rb index 034e493..0a8230d 100755 --- a/test/test_opencv.rb +++ b/test/test_opencv.rb @@ -9,15 +9,15 @@ include OpenCV class TestOpenCV < OpenCVTestCase def test_constants # OpenCV version - assert_equal('2.4.6.1', CV_VERSION) + assert_equal('2.4.7', CV_VERSION) assert_equal(2, CV_MAJOR_VERSION) assert_equal(4, CV_MINOR_VERSION) - assert_equal(6, CV_SUBMINOR_VERSION) + assert_equal(7, CV_SUBMINOR_VERSION) assert_equal(2, CV_VERSION_EPOCH) assert_equal(4, CV_VERSION_MAJOR) - assert_equal(6, CV_VERSION_MINOR) - assert_equal(1, CV_VERSION_REVISION) + assert_equal(7, CV_VERSION_MINOR) + assert_equal(0, CV_VERSION_REVISION) # Depths assert_equal(0, CV_8U) From 0bd0f342c4f44027c9f0cbb1529561e04bd8579d Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 3 Dec 2013 14:24:31 -0800 Subject: [PATCH 11/12] add a wrapper around getPerspectiveTransform --- ext/opencv/cvmat.cpp | 35 ++++++++++++++++++++++++++++++ ext/opencv/cvmat.h | 1 + test/test_cvmat_imageprocessing.rb | 34 +++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/ext/opencv/cvmat.cpp b/ext/opencv/cvmat.cpp index 159d7ed..2f6dccc 100644 --- a/ext/opencv/cvmat.cpp +++ b/ext/opencv/cvmat.cpp @@ -352,6 +352,7 @@ void define_ruby_class() rb_define_method(rb_klass, "resize", RUBY_METHOD_FUNC(rb_resize), -1); rb_define_method(rb_klass, "warp_affine", RUBY_METHOD_FUNC(rb_warp_affine), -1); rb_define_singleton_method(rb_klass, "rotation_matrix2D", RUBY_METHOD_FUNC(rb_rotation_matrix2D), 3); + rb_define_singleton_method(rb_klass, "get_perspective_transform", RUBY_METHOD_FUNC(rb_get_perspective_transform), 2); rb_define_method(rb_klass, "warp_perspective", RUBY_METHOD_FUNC(rb_warp_perspective), -1); rb_define_singleton_method(rb_klass, "find_homography", RUBY_METHOD_FUNC(rb_find_homograpy), -1); rb_define_method(rb_klass, "remap", RUBY_METHOD_FUNC(rb_remap), -1); @@ -4053,6 +4054,40 @@ rb_rotation_matrix2D(VALUE self, VALUE center, VALUE angle, VALUE scale) return map_matrix; } +/* + * call-seq: + * CvMat.get_perspective_transform(from_points,to_points) -> cvmat + * + * Calculates a perspective transform from four pairs of the corresponding points. + * Returns a matrix suitable for use with warp_perspective + */ +VALUE +rb_get_perspective_transform(VALUE self, VALUE source, VALUE dest) +{ + Check_Type(source, T_ARRAY); + Check_Type(dest, T_ARRAY); + + int count = RARRAY_LEN(source); + + CvPoint2D32f* source_buff = ALLOCA_N(CvPoint2D32f, count); + CvPoint2D32f* dest_buff = ALLOCA_N(CvPoint2D32f, count); + + for (int i = 0; i < count; i++) { + source_buff[i] = *(CVPOINT2D32F(RARRAY_PTR(source)[i])); + dest_buff[i] = *(CVPOINT2D32F(RARRAY_PTR(dest)[i])); + } + + VALUE map_matrix = new_object(cvSize(3, 3), CV_MAKETYPE(CV_32F, 1)); + + try { + cvGetPerspectiveTransform(source_buff, dest_buff, CVMAT(map_matrix)); + } + catch (cv::Exception& e) { + raise_cverror(e); + } + return map_matrix; +} + /* * call-seq: * warp_perspective(map_matrix[,flags = CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS][,fillval=0])) -> cvmat diff --git a/ext/opencv/cvmat.h b/ext/opencv/cvmat.h index a65bb2a..900be16 100644 --- a/ext/opencv/cvmat.h +++ b/ext/opencv/cvmat.h @@ -175,6 +175,7 @@ VALUE rb_quadrangle_sub_pix(int argc, VALUE *argv, VALUE self); VALUE rb_resize(int argc, VALUE *argv, VALUE self); VALUE rb_warp_affine(int argc, VALUE *argv, VALUE self); VALUE rb_rotation_matrix2D(VALUE self, VALUE center, VALUE angle, VALUE scale); +VALUE rb_get_perspective_transform(VALUE self, VALUE source, VALUE dest); VALUE rb_warp_perspective(int argc, VALUE *argv, VALUE self); VALUE rb_find_homograpy(int argc, VALUE *argv, VALUE self); VALUE rb_remap(int argc, VALUE *argv, VALUE self); diff --git a/test/test_cvmat_imageprocessing.rb b/test/test_cvmat_imageprocessing.rb index e3bc9f0..05a4019 100755 --- a/test/test_cvmat_imageprocessing.rb +++ b/test/test_cvmat_imageprocessing.rb @@ -450,6 +450,40 @@ class TestCvMat_imageprocessing < OpenCVTestCase # snap mat0, mat1, mat2, mat3, mat4 end + def test_get_perspective_transform + from = [ + OpenCV::CvPoint2D32f.new(540, 382), + OpenCV::CvPoint2D32f.new(802, 400), + OpenCV::CvPoint2D32f.new(850, 731), + OpenCV::CvPoint2D32f.new(540, 731), + ] + to = [ + OpenCV::CvPoint2D32f.new(0, 0), + OpenCV::CvPoint2D32f.new(233, 0), + OpenCV::CvPoint2D32f.new(233, 310), + OpenCV::CvPoint2D32f.new(0, 310), + ] + transform = OpenCV::CvMat.get_perspective_transform(from, to) + assert_equal 3, transform.rows + assert_equal 3, transform.columns + expected = [ + 0.923332154750824, + 0.0, + 0.0, + 1.4432899320127035e-15, + 0.0, + 0.0, + -498.599365234375, + 0.0, + 0.0, + ] + 3.times do |i| + 3.times do |j| + assert_in_delta(expected.shift, transform[i][j], 0.001) + end + end + end + def test_rotation_matrix2D mat1 = CvMat.rotation_matrix2D(CvPoint2D32f.new(10, 20), 60, 2.0) expected = [1.0, 1.73205, -34.64102, From 6991e2b6e4c453326aa6fc9eb5e4d4cde0ae1395 Mon Sep 17 00:00:00 2001 From: ser1zw Date: Sat, 7 Dec 2013 22:34:08 +0900 Subject: [PATCH 12/12] fix uncaught exception in CvMat#match_descriptors on OSX Mavericks --- .../matching_to_many_images.rb | 4 +- ext/opencv/cvmat.cpp | 95 ++++++++++--------- test/test_cvmat_matching.rb | 2 +- 3 files changed, 52 insertions(+), 49 deletions(-) diff --git a/examples/matching_to_many_images/matching_to_many_images.rb b/examples/matching_to_many_images/matching_to_many_images.rb index 0d70b1f..72d0a1c 100644 --- a/examples/matching_to_many_images/matching_to_many_images.rb +++ b/examples/matching_to_many_images/matching_to_many_images.rb @@ -4,9 +4,9 @@ include OpenCV data = File.dirname(__FILE__) -query = IplImage.load File.join(data, 'query.png'), CV_LOAD_IMAGE_GRAYSCALE +query = CvMat.load File.join(data, 'query.png'), CV_LOAD_IMAGE_GRAYSCALE image_files = ['1.png', '2.png', '3.png'].map{|f| File.join(data, 'train', f)} -images = image_files.map{|f| IplImage.load f, CV_LOAD_IMAGE_GRAYSCALE} +images = image_files.map{|f| CvMat.load f, CV_LOAD_IMAGE_GRAYSCALE} matchs = query.match_descriptors(images) diff --git a/ext/opencv/cvmat.cpp b/ext/opencv/cvmat.cpp index 2f6dccc..6ac93da 100644 --- a/ext/opencv/cvmat.cpp +++ b/ext/opencv/cvmat.cpp @@ -5386,7 +5386,6 @@ rb_match_descriptors(int argc, VALUE *argv, VALUE self) { VALUE images, detector_type, descriptor_type, matcher_type; rb_scan_args(argc, argv, "13", &images, &detector_type, &descriptor_type, &matcher_type); - if (RARRAY_LEN(images) == 0) { return rb_hash_new(); } @@ -5400,54 +5399,58 @@ rb_match_descriptors(int argc, VALUE *argv, VALUE self) matcher_type = rb_str_new2("FlannBased"); } - cv::Mat queryImage = CVMAT(self); - std::vector trainImages; - for(int i=0; i < RARRAY_LEN(images); i++) { - trainImages.push_back(CVMAT_WITH_CHECK(RARRAY_PTR(images)[i])); - } - - cv::Ptr featureDetector = cv::FeatureDetector::create(RSTRING_PTR(detector_type)); - if (featureDetector.empty()) { - rb_raise(rb_eArgError, "Could not create feature detector by given detector type: %s", RSTRING_PTR(detector_type)); - } - cv::Ptr descriptorExtractor = cv::DescriptorExtractor::create(RSTRING_PTR(descriptor_type)); - if (descriptorExtractor.empty()) { - rb_raise(rb_eArgError, "Could not create descriptor extractor by given descriptor type: %s", RSTRING_PTR(descriptor_type)); - } - cv::Ptr descriptorMatcher; - try { - descriptorMatcher = cv::DescriptorMatcher::create(RSTRING_PTR(matcher_type)); - } - catch(cv::Exception& e) { - rb_raise(rb_eArgError, "Could not create descriptor matcher by given matcher type: %s", RSTRING_PTR(matcher_type)); - } - - std::vector queryKeypoints; - std::vector > trainKeypoints; - featureDetector->detect(queryImage, queryKeypoints); - featureDetector->detect(trainImages, trainKeypoints); - - cv::Mat queryDescriptors; - std::vector trainDescriptors; - descriptorExtractor->compute(queryImage, queryKeypoints, queryDescriptors); - descriptorExtractor->compute(trainImages, trainKeypoints, trainDescriptors); - - std::vector matches; - descriptorMatcher->add(trainDescriptors); - descriptorMatcher->train(); - descriptorMatcher->match(queryDescriptors, matches); - VALUE _matches = rb_hash_new(); - for (size_t i=0; i trainImages; + for(int i = 0, n = RARRAY_LEN(images); i < n; i++) { + trainImages.push_back(CVMAT_WITH_CHECK(RARRAY_PTR(images)[i])); + } + + cv::Ptr featureDetector = cv::FeatureDetector::create(StringValueCStr(detector_type)); + if (featureDetector.empty()) { + rb_raise(rb_eArgError, "Could not create feature detector by given detector type: %s", StringValueCStr(detector_type)); + } + cv::Ptr descriptorExtractor = cv::DescriptorExtractor::create(StringValueCStr(descriptor_type)); + if (descriptorExtractor.empty()) { + rb_raise(rb_eArgError, "Could not create descriptor extractor by given descriptor type: %s", StringValueCStr(descriptor_type)); + } + cv::Ptr descriptorMatcher; + try { + descriptorMatcher = cv::DescriptorMatcher::create(StringValueCStr(matcher_type)); + } + catch(cv::Exception& e) { + rb_raise(rb_eArgError, "Could not create descriptor matcher by given matcher type: %s", StringValueCStr(matcher_type)); + } + + std::vector queryKeypoints; + std::vector > trainKeypoints; + featureDetector->detect(queryImage, queryKeypoints); + featureDetector->detect(trainImages, trainKeypoints); + cv::Mat queryDescriptors; + std::vector trainDescriptors; + descriptorExtractor->compute(queryImage, queryKeypoints, queryDescriptors); + descriptorExtractor->compute(trainImages, trainKeypoints, trainDescriptors); + std::vector matches; + descriptorMatcher->add(trainDescriptors); + descriptorMatcher->train(); + descriptorMatcher->match(queryDescriptors, matches); + + for (size_t i = 0, n = matches.size(); i < n; i++) { + VALUE match = INT2FIX(matches[i].imgIdx); + VALUE count = rb_hash_lookup(_matches, match); + if (NIL_P(count)) { + count = INT2FIX(1); + } else { + count = INT2FIX(FIX2INT(count) + 1); + } + rb_hash_aset(_matches, match, count); } - rb_hash_aset(_matches, match, count); } + catch (cv::Exception& e) { + raise_cverror(e); + } + return _matches; } diff --git a/test/test_cvmat_matching.rb b/test/test_cvmat_matching.rb index cd50016..27d8006 100755 --- a/test/test_cvmat_matching.rb +++ b/test/test_cvmat_matching.rb @@ -18,7 +18,7 @@ class TestCvMat_matching < OpenCVTestCase end def read_test_image(*path) - IplImage.load File.join(data_dir, *path), CV_LOAD_IMAGE_GRAYSCALE + CvMat.load File.join(data_dir, *path), CV_LOAD_IMAGE_GRAYSCALE end def test_match_descriptors