1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00

Merge pull request #8 from ser1zw/add_draw_contours

Add CvMat#draw_contours
This commit is contained in:
ser1zw 2012-04-05 10:06:20 -07:00
commit cfd0d2c7ca
5 changed files with 95 additions and 3 deletions

View file

@ -347,6 +347,8 @@ void define_ruby_class()
rb_define_method(rb_klass, "flood_fill!", RUBY_METHOD_FUNC(rb_flood_fill_bang), -1);
rb_define_method(rb_klass, "find_contours", RUBY_METHOD_FUNC(rb_find_contours), -1);
rb_define_method(rb_klass, "find_contours!", RUBY_METHOD_FUNC(rb_find_contours_bang), -1);
rb_define_method(rb_klass, "draw_contours", RUBY_METHOD_FUNC(rb_draw_contours), -1);
rb_define_method(rb_klass, "draw_contours!", RUBY_METHOD_FUNC(rb_draw_contours_bang), -1);
rb_define_method(rb_klass, "pyr_segmentation", RUBY_METHOD_FUNC(rb_pyr_segmentation), 3);
rb_define_method(rb_klass, "pyr_mean_shift_filtering", RUBY_METHOD_FUNC(rb_pyr_mean_shift_filtering), -1);
rb_define_method(rb_klass, "watershed", RUBY_METHOD_FUNC(rb_watershed), 1);
@ -4734,6 +4736,51 @@ rb_find_contours_bang(int argc, VALUE *argv, VALUE self)
return cCvSeq::new_sequence(klass, contour, element_klass, storage);
}
/*
* call-seq:
* draw_contours(contour, external_color, hole_color, max_level, options) -> cvmat
*
* Draws contour outlines or interiors in an image.
*
* * <i>contour</i> (CvContour) - Pointer to the first contour
* * <i>external_color</i> (CvScalar) - Color of the external contours
* * <i>hole_color</i> (CvScalar) - Color of internal contours (holes)
* * <i>max_level</i> (Integer) - Maximal level for drawn contours. If 0, only contour is drawn. If 1, the contour and all contours following it on the same level are drawn. If 2, all contours following and all contours one level below the contours are drawn, and so forth. If the value is negative, the function does not draw the contours following after contour but draws the child contours of contour up to the |max_level| - 1 level.
* * <i>options</i> (Hash) - Drawing options.
* * :thickness (Integer) - Thickness of lines the contours are drawn with. If it is negative, the contour interiors are drawn (default: 1).
* * :line_type (Integer or Symbol) - Type of the contour segments, see CvMat#line description (default: 8).
*/
VALUE
rb_draw_contours(int argc, VALUE *argv, VALUE self)
{
return rb_draw_contours_bang(argc, argv, copy(self));
}
/*
* call-seq:
* draw_contours!(contour, external_color, hole_color, max_level, options) -> cvmat
*
* Draws contour outlines or interiors in an image.
*
* see CvMat#draw_contours
*/
VALUE
rb_draw_contours_bang(int argc, VALUE *argv, VALUE self)
{
VALUE contour, external_color, hole_color, max_level, options;
rb_scan_args(argc, argv, "41", &contour, &external_color, &hole_color, &max_level, &options);
options = DRAWING_OPTION(options);
try {
cvDrawContours(CVARR(self), CVSEQ_WITH_CHECK(contour), VALUE_TO_CVSCALAR(external_color),
VALUE_TO_CVSCALAR(hole_color), NUM2INT(max_level),
DO_THICKNESS(options), DO_LINE_TYPE(options));
}
catch (cv::Exception& e) {
raise_cverror(e);
}
return self;
}
/*
* call-seq:
* pyr_segmentation(<i>level, threshold1, threshold2</i>) -> [cvmat, cvseq(include cvconnectedcomp)]

View file

@ -200,6 +200,8 @@ VALUE rb_flood_fill(int argc, VALUE *argv, VALUE self);
VALUE rb_flood_fill_bang(int argc, VALUE *argv, VALUE self);
VALUE rb_find_contours(int argc, VALUE *argv, VALUE self);
VALUE rb_find_contours_bang(int argc, VALUE *argv, VALUE self);
VALUE rb_draw_contours(int argc, VALUE *argv, VALUE self);
VALUE rb_draw_contours_bang(int argc, VALUE *argv, VALUE self);
VALUE rb_pyr_segmentation(VALUE self, VALUE level, VALUE threshold1, VALUE threshold2);
VALUE rb_pyr_mean_shift_filtering(int argc, VALUE *argv, VALUE self);
VALUE rb_watershed(VALUE self, VALUE markers);

View file

@ -12,6 +12,7 @@ class OpenCVTestCase < Test::Unit::TestCase
FILENAME_LENA32x32 = SAMPLE_DIR + 'lena-32x32.jpg'
FILENAME_LENA_EYES = File.expand_path(File.dirname(__FILE__)) + '/samples/lena-eyes.jpg'
FILENAME_FRUITS = SAMPLE_DIR + 'fruits.jpg'
FILENAME_CONTOURS = File.expand_path(File.dirname(__FILE__)) + '/samples/contours.jpg'
HAARCASCADE_FRONTALFACE_ALT = SAMPLE_DIR + 'haarcascade_frontalface_alt.xml.gz'
AVI_SAMPLE = SAMPLE_DIR + 'movie_sample.avi'

View file

@ -129,7 +129,7 @@ class TestCvMat_drawing < OpenCVTestCase
}
assert_raise(TypeError) {
m1.ellipse(CvPoint.new(m0.width / 2, m0.height / 2), CvSize.new(100, 60), 30, 0, 360,
:color => DUMMY_OBJ)
:color => DUMMY_OBJ)
}
# assert_raise(CvError) {
# m1.ellipse(CvPoint.new(m0.width / 2, m0.height / 2), CvSize.new(100, 60), 30, 0, 360,
@ -246,6 +246,49 @@ class TestCvMat_drawing < OpenCVTestCase
# m1.poly_line(pt, :line_type => DUMMY_OBJ)
end
def test_draw_contours
mat0 = CvMat.load(FILENAME_CONTOURS, CV_LOAD_IMAGE_GRAYSCALE)
mat0 = mat0.threshold(128, 255, CV_THRESH_BINARY)
contours = mat0.find_contours(:mode => CV_RETR_TREE, :method => CV_CHAIN_APPROX_SIMPLE)
dst0 = mat0.clone.clear
dst1 = mat0.clone.clear.GRAY2BGR
begin
dst0 = dst0.draw_contours!(contours, CvColor::Black, CvColor::White, -1)
dst1.draw_contours!(contours, CvColor::Red, CvColor::Blue, 2,
:thickness => -1, :line_type => :aa)
end while (contours = contours.h_next)
[dst0, dst1].each { |dst|
assert_equal(mat0.class, dst.class)
assert_equal(mat0.rows, dst.rows)
assert_equal(mat0.cols, dst.cols)
assert_equal(mat0.depth, dst.depth)
}
assert_raise(TypeError) {
dst0.draw_contours(DUMMY_OBJ, CvColor::Black, CvColor::White, -1)
}
assert_raise(TypeError) {
dst0.draw_contours(contours, DUMMY_OBJ, CvColor::White, -1)
}
assert_raise(TypeError) {
dst0.draw_contours(contours, CvColor::Black, DUMMY_OBJ, -1)
}
assert_raise(TypeError) {
dst0.draw_contours(contours, CvColor::Black, CvColor::White, DUMMY_OBJ)
}
assert_raise(TypeError) {
dst0.draw_contours(contours, CvColor::Black, CvColor::White, -1, :thickness => DUMMY_OBJ)
}
assert_raise(TypeError) {
dst0.draw_contours(contours, CvColor::Black, CvColor::White, -1, :line_type => DUMMY_OBJ)
}
# Uncomment the following line to show the results
# snap ['src', mat0], ['result0', dst0], ['result1', dst1]
end
def test_put_text
m0 = create_cvmat(240, 320, :cv8u, 3) { CvColor::White }
m1 = m0.clone

View file

@ -12,7 +12,6 @@ class TestCvMat_imageprocessing < OpenCVTestCase
FILENAME_LENA_INPAINT = File.expand_path(File.dirname(__FILE__)) + '/samples/lena-inpaint.jpg'
FILENAME_INPAINT_MASK = File.expand_path(File.dirname(__FILE__)) + '/samples/inpaint-mask.bmp'
FILENAME_LENA32x32 = File.expand_path(File.dirname(__FILE__)) + '/samples/lena-32x32.jpg'
FILENAME_CONTOURS = File.expand_path(File.dirname(__FILE__)) + '/samples/contours.jpg'
FILENAME_LINES = File.expand_path(File.dirname(__FILE__)) + '/samples/lines.jpg'
FILENAME_LENA_EYES = File.expand_path(File.dirname(__FILE__)) + '/samples/lena-eyes.jpg'
FILENAME_STR_CV = File.expand_path(File.dirname(__FILE__)) + '/samples/str-cv.jpg'