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

add CvMat#draw_chessboard_corners

This commit is contained in:
ser1zw 2012-11-16 02:00:10 +09:00
parent f8d9ce4a24
commit 08348ff8d3
3 changed files with 83 additions and 0 deletions

View file

@ -379,6 +379,8 @@ void define_ruby_class()
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, "draw_chessboard_corners", RUBY_METHOD_FUNC(rb_draw_chessboard_corners), 3);
rb_define_method(rb_klass, "draw_chessboard_corners!", RUBY_METHOD_FUNC(rb_draw_chessboard_corners_bang), 3);
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);
@ -4916,6 +4918,54 @@ rb_draw_contours_bang(int argc, VALUE *argv, VALUE self)
return self;
}
/*
* call-seq:
* draw_chessboard_corners(pattern_size, corners, pattern_was_found) -> nil
*
* Returns an image which is rendered the detected chessboard corners.
*
* pattern_size (CvSize) - Number of inner corners per a chessboard row and column.
* corners (Array<CvPoint2D32f>) - Array of detected corners, the output of CvMat#find_chessboard_corners.
* pattern_was_found (Boolean)- Parameter indicating whether the complete board was found or not.
*/
VALUE
rb_draw_chessboard_corners(VALUE self, VALUE pattern_size, VALUE corners, VALUE pattern_was_found)
{
return rb_draw_chessboard_corners_bang(copy(self), pattern_size, corners, pattern_was_found);
}
/*
* call-seq:
* draw_chessboard_corners!(pattern_size, corners, pattern_was_found) -> self
*
* Renders the detected chessboard corners.
*
* pattern_size (CvSize) - Number of inner corners per a chessboard row and column.
* corners (Array<CvPoint2D32f>) - Array of detected corners, the output of CvMat#find_chessboard_corners.
* pattern_was_found (Boolean)- Parameter indicating whether the complete board was found or not.
*/
VALUE
rb_draw_chessboard_corners_bang(VALUE self, VALUE pattern_size, VALUE corners, VALUE pattern_was_found)
{
Check_Type(corners, T_ARRAY);
int count = RARRAY_LEN(corners);
CvPoint2D32f* corners_buff = ALLOCA_N(CvPoint2D32f, count);
VALUE* corners_ptr = RARRAY_PTR(corners);
for (int i = 0; i < count; i++) {
corners_buff[i] = *(CVPOINT2D32F(corners_ptr[i]));
}
try {
int found = (pattern_was_found == Qtrue);
cvDrawChessboardCorners(CVARR(self), VALUE_TO_CVSIZE(pattern_size), corners_buff, count, found);
}
catch (cv::Exception& e) {
raise_cverror(e);
}
return self;
}
/*
* call-seq:
* pyr_segmentation(<i>level, threshold1, threshold2</i>) -> [cvmat, cvseq(include cvconnectedcomp)]

View file

@ -202,6 +202,8 @@ 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_draw_chessboard_corners(VALUE self, VALUE pattern_size, VALUE corners, VALUE pattern_was_found);
VALUE rb_draw_chessboard_corners_bang(VALUE self, VALUE pattern_size, VALUE corners, VALUE pattern_was_found);
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

@ -289,6 +289,37 @@ class TestCvMat_drawing < OpenCVTestCase
# snap ['src', mat0], ['result0', dst0], ['result1', dst1]
end
def test_draw_chessboard_corners
mat0 = CvMat.load(FILENAME_CHESSBOARD, 1)
mat1 = mat0.clone
pattern_size = CvSize.new(4, 4)
gray = mat1.BGR2GRAY
corners, found = gray.find_chessboard_corners(pattern_size)
mat2 = mat1.draw_chessboard_corners(pattern_size, corners, found)
mat1.draw_chessboard_corners!(pattern_size, corners, found)
[mat1, mat2].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) {
mat1.draw_chessboard_corners(DUMMY_OBJ, corners, found)
}
assert_raise(TypeError) {
mat1.draw_chessboard_corners(pattern_size, DUMMY_OBJ, found)
}
assert_nothing_raised {
mat1.draw_chessboard_corners(pattern_size, corners, DUMMY_OBJ)
}
# Uncomment the following line to show the results
# snap mat0, mat1, mat2
end
def test_put_text
m0 = create_cvmat(240, 320, :cv8u, 3) { CvColor::White }
m1 = m0.clone