From 22ceeb045cfd091ce8017cbbf463e09f8b89a75f Mon Sep 17 00:00:00 2001 From: ser1zw Date: Sun, 10 Apr 2016 18:52:55 +0900 Subject: [PATCH] add haarclassifier's legacy interface --- lib/opencv.rb | 1 + lib/opencv/cvhaarclassifiercascade.rb | 15 +++++ test/legacy/test_cvhaarclassifiercascade.rb | 69 +++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 lib/opencv/cvhaarclassifiercascade.rb create mode 100755 test/legacy/test_cvhaarclassifiercascade.rb diff --git a/lib/opencv.rb b/lib/opencv.rb index efe07a7..6885ca4 100644 --- a/lib/opencv.rb +++ b/lib/opencv.rb @@ -2,3 +2,4 @@ require_relative "opencv/version" require "opencv.so" require_relative "opencv/basic_structs" require_relative "opencv/cvmat" +require_relative "opencv/cvhaarclassifiercascade" diff --git a/lib/opencv/cvhaarclassifiercascade.rb b/lib/opencv/cvhaarclassifiercascade.rb new file mode 100644 index 0000000..922579a --- /dev/null +++ b/lib/opencv/cvhaarclassifiercascade.rb @@ -0,0 +1,15 @@ +module Cv + CV_HAAR_DO_CANNY_PRUNING = 1 + + class CvHaarClassifierCascade < CascadeClassifier + def self.load(filename) + new(filename) + end + + def detect_objects(image, options = {}) + rects = detect_multi_scale(image, options) + rects.each { |rect| yield rect } if block_given? + rects + end + end +end diff --git a/test/legacy/test_cvhaarclassifiercascade.rb b/test/legacy/test_cvhaarclassifiercascade.rb new file mode 100755 index 0000000..ace0fae --- /dev/null +++ b/test/legacy/test_cvhaarclassifiercascade.rb @@ -0,0 +1,69 @@ +#!/usr/bin/env ruby +# -*- mode: ruby; coding: utf-8 -*- +require 'test/unit' +require 'opencv' +require File.expand_path(File.dirname(__FILE__)) + '/../helper' + +include OpenCV + +# Tests for OpenCV::CvHaarClassifierCascade +class TestCvHaarClassifierCascade < OpenCVTestCase + def setup + @cascade = CvHaarClassifierCascade.load(HAARCASCADE_FRONTALFACE_ALT) + end + + def test_load + assert_equal(CvHaarClassifierCascade, @cascade.class) + assert_raise(TypeError) { + CvHaarClassifierCascade.load(DUMMY_OBJ) + } + end + + def test_detect_objects + img = CvMat.load(FILENAME_LENA256x256) + + detected = @cascade.detect_objects(img) + assert_equal(Array, detected.class) + assert_equal(1, detected.size) + assert_equal(Rect, detected[0].class) + assert_in_delta(100, detected[0].x, 20) + assert_in_delta(100, detected[0].y, 20) + assert_in_delta(85, detected[0].width, 20) + assert_in_delta(85, detected[0].height, 20) + + detected = @cascade.detect_objects(img) { |face| + assert_in_delta(100, detected[0].x, 20) + assert_in_delta(100, detected[0].y, 20) + assert_in_delta(85, detected[0].width, 20) + assert_in_delta(85, detected[0].height, 20) + } + assert_equal(Array, detected.class) + assert_equal(1, detected.size) + assert_equal(Rect, detected[0].class) + + detected = @cascade.detect_objects(img, :scale_factor => 2.0, :flags => CV_HAAR_DO_CANNY_PRUNING, + :min_neighbors => 5, :min_size => CvSize.new(10, 10), + :max_size => CvSize.new(100, 100)) + assert_equal(Array, detected.class) + assert_equal(1, detected.size) + assert_equal(Rect, detected[0].class) + assert_in_delta(100, detected[0].x, 20) + assert_in_delta(100, detected[0].y, 20) + assert_in_delta(85, detected[0].width, 20) + assert_in_delta(85, detected[0].height, 20) + + assert_raise(TypeError) { + @cascade.detect_objects(DUMMY_OBJ) + } + + # Uncomment the following lines to show the result + # + # detected.each { |r| + # pt1 = Point.new(r.x, r.y) + # pt2 = Point.new(r.x + r.width, r.y + r.height) + # img.rectangle!(pt1, pt2, Scalar.new(0, 255, 255), thickness: 3, line_type: Cv::CV_AA) + # } + # snap(['Test', img]) + end +end +