diff --git a/ext/opencv/cvhaarclassifiercascade.cpp b/ext/opencv/cvhaarclassifiercascade.cpp index 27cf28a..e2d88ff 100644 --- a/ext/opencv/cvhaarclassifiercascade.cpp +++ b/ext/opencv/cvhaarclassifiercascade.cpp @@ -52,6 +52,15 @@ rb_allocate(VALUE klass) return OPENCV_OBJECT(klass, 0); } +VALUE +cvhaarclassifiercascade_free(void* ptr) +{ + if (ptr) { + CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)ptr; + cvReleaseHaarClassifierCascade(&cascade); + } +} + /* * call-seq: * CvHaarClassiferCascade.load(path) -> object-detector @@ -71,14 +80,8 @@ rb_load(VALUE klass, VALUE path) { CvHaarClassifierCascade *cascade = (CvHaarClassifierCascade*)cvLoad(StringValueCStr(path), 0, 0, 0); if(!CV_IS_HAAR_CLASSIFIER(cascade)) - rb_raise(rb_eTypeError, "invalid format haar classifier cascade file."); - return OPENCV_OBJECT(rb_klass, cascade); -} - -VALUE -rb_save(VALUE self, VALUE path) -{ - rb_raise(rb_eNotImpError, ""); + rb_raise(rb_eArgError, "invalid format haar classifier cascade file."); + return Data_Wrap_Struct(klass, 0, cvhaarclassifiercascade_free, cascade); } /* diff --git a/ext/opencv/cvhaarclassifiercascade.h b/ext/opencv/cvhaarclassifiercascade.h index c0fce6c..baa8f9d 100644 --- a/ext/opencv/cvhaarclassifiercascade.h +++ b/ext/opencv/cvhaarclassifiercascade.h @@ -23,15 +23,13 @@ VALUE rb_class(); void define_ruby_class(); VALUE rb_allocate(VALUE klass); -VALUE rb_initialize(int argc, VALUE *argv, VALUE self); VALUE rb_load(VALUE klass, VALUE path); -VALUE rb_save(VALUE self, VALUE name); VALUE rb_detect_objects(int argc, VALUE *argv, VALUE self); VALUE rb_detect_objects_with_pruning(int argc, VALUE *argv, VALUE self); __NAMESPACE_END_CVHAARCLASSIFERCASCADE -inline CvHaarClassifierCascade *CVHAARCLASSIFIERCASCADE(VALUE object){ +inline CvHaarClassifierCascade *CVHAARCLASSIFIERCASCADE(VALUE object) { CvHaarClassifierCascade *ptr; Data_Get_Struct(object, CvHaarClassifierCascade, ptr); return ptr; diff --git a/test/samples/haarcascade_frontalface_alt.xml.gz b/test/samples/haarcascade_frontalface_alt.xml.gz new file mode 100644 index 0000000..cfc54a8 Binary files /dev/null and b/test/samples/haarcascade_frontalface_alt.xml.gz differ diff --git a/test/test_cvhaarclassifiercascade.rb b/test/test_cvhaarclassifiercascade.rb new file mode 100755 index 0000000..cf479a9 --- /dev/null +++ b/test/test_cvhaarclassifiercascade.rb @@ -0,0 +1,49 @@ +#!/usr/bin/env ruby +# -*- mode: ruby; coding: utf-8-unix -*- +require 'test/unit' +require 'opencv' +require File.expand_path(File.dirname(__FILE__)) + '/helper' + +include OpenCV + +# Tests for OpenCV::CvHaarClassifierCascade +class TestCvHaarClassifierCascade < OpenCVTestCase + FILENAME_LENA256x256 = File.expand_path(File.dirname(__FILE__)) + '/samples/lena-256x256.jpg' + HAARCASCADE_FRONTALFACE_ALT = File.expand_path(File.dirname(__FILE__)) + '/samples/haarcascade_frontalface_alt.xml.gz' + def setup + @cascade = CvHaarClassifierCascade.load(HAARCASCADE_FRONTALFACE_ALT) + end + + def test_load + assert_equal(CvHaarClassifierCascade, @cascade.class) + assert_raise(ArgumentError) { + CvHaarClassifierCascade.load('not/exist.xml') + } + end + + def test_detect_objects + img = CvMat.load(FILENAME_LENA256x256) + + detected = @cascade.detect_objects(img) + assert_equal(CvSeq, detected.class) + assert_equal(1, detected.size) + assert_equal(CvAvgComp, detected[0].class) + assert_equal(106, detected[0].x) + assert_equal(100, detected[0].y) + assert_equal(89, detected[0].width) + assert_equal(89, detected[0].height) + assert_equal(48, detected[0].neighbors) + + detected = @cascade.detect_objects(img) { |face| + assert_equal(106, face.x) + assert_equal(100, face.y) + assert_equal(89, face.width) + assert_equal(89, face.height) + assert_equal(48, face.neighbors) + } + assert_equal(CvSeq, detected.class) + assert_equal(1, detected.size) + assert_equal(CvAvgComp, detected[0].class) + end +end +