From 857725be79d76b26ce84fd62f8fd5cf90be5a70d Mon Sep 17 00:00:00 2001 From: David Oram Date: Mon, 14 Sep 2015 17:21:21 +1200 Subject: [PATCH] Added sequence, curve and contour related functions --- opencv/cxcore.go | 12 ++++++++++++ opencv/cxtype.go | 27 ++++++++++++++++++++++++++ opencv/imgproc.go | 44 ++++++++++++++++++++++++++++++++++++++++++ opencv/imgproc_test.go | 7 +++---- 4 files changed, 86 insertions(+), 4 deletions(-) diff --git a/opencv/cxcore.go b/opencv/cxcore.go index e4bff18..dacd0ba 100644 --- a/opencv/cxcore.go +++ b/opencv/cxcore.go @@ -553,6 +553,18 @@ func (seq *Seq) Total() int { return (int)(seq.total) } +func (seq *Seq) HNext() *Seq { + return (*Seq)(seq.h_next) +} + +func (seq *Seq) VNext() *Seq { + return (*Seq)(seq.v_next) +} + +func (seq *Seq) Storage() *MemStorage { + return (*MemStorage)(seq.storage) +} + /****************************************************************************************\ * Drawing * \****************************************************************************************/ diff --git a/opencv/cxtype.go b/opencv/cxtype.go index 984baa4..6f250e4 100644 --- a/opencv/cxtype.go +++ b/opencv/cxtype.go @@ -595,6 +595,18 @@ type Box2D struct { angle float32 } +func (box *Box2D) Size() Size2D32f { + return box.size +} + +func (box *Box2D) Center() Point2D32f { + return box.center +} + +func (box *Box2D) Angle() float32 { + return box.angle +} + type LineIterator C.CvLineIterator /************************************* CvSlice ******************************************/ @@ -605,6 +617,12 @@ const ( CV_WHOLE_SEQ_END_INDEX = C.CV_WHOLE_SEQ_END_INDEX ) +/* Equivalent to the C constant CV_WHOLE_SEQ */ +func WholeSeq() Slice { + slice := C.cvSlice(C.int(0), C.CV_WHOLE_SEQ_END_INDEX) + return (Slice)(slice) +} + /************************************* CvScalar *****************************************/ type Scalar C.CvScalar @@ -706,6 +724,15 @@ const ( type AttrList C.CvAttrList +/****************************************************************************************/ +/* Structural Analysis and Shape Descriptors */ +/****************************************************************************************/ + +/* For use in ApproxPoly */ +const ( + CV_POLY_APPROX_DP = C.CV_POLY_APPROX_DP +) + /*****************************************************************************\ * --- END --- * \*****************************************************************************/ diff --git a/opencv/imgproc.go b/opencv/imgproc.go index 8861bab..53aca58 100644 --- a/opencv/imgproc.go +++ b/opencv/imgproc.go @@ -83,3 +83,47 @@ func DrawContours(image *IplImage, contours *Seq, externalColor, holeColor Scala C.int(lineType), C.cvPoint(C.int(offset.X), C.int(offset.Y))) } + +// CvSeq* cvApproxPoly(const void* src_seq, int header_size, CvMemStorage* storage, int method, double eps, int recursive=0 ) +func ApproxPoly(src *Seq, header_size int, storage *MemStorage, method int, eps float64, recursive int) *Seq { + seq := C.cvApproxPoly( + unsafe.Pointer(src), + C.int(header_size), + (*C.CvMemStorage)(storage), + C.int(method), + C.double(eps), + C.int(recursive)) + return (*Seq)(seq) +} + +// cvArcLength(const void* curve, CvSlice slice=CV_WHOLE_SEQ, int is_closed=-1 ) +func ArcLength(curve *Seq, slice Slice, is_closed bool) float64 { + is_closed_int := 0 + if is_closed { + is_closed_int = 1 + } + return float64(C.cvArcLength(unsafe.Pointer(curve), + (C.CvSlice)(slice), + C.int(is_closed_int))) +} + +func ContourPerimeter(curve *Seq) float64 { + return ArcLength(curve, WholeSeq(), true) +} + +// double cvContourArea(const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ, int oriented=0 ) +func ContourArea(contour *Seq, slice Slice, oriented int) float64 { + return float64(C.cvContourArea( + unsafe.Pointer(contour), + (C.CvSlice)(slice), + C.int(oriented))) +} + +/* points can be either CvSeq* or CvMat* */ +func FitEllipse2(points unsafe.Pointer) Box2D { + box := C.cvFitEllipse2(points) + center := Point2D32f{float32(box.center.x), float32(box.center.y)} + size := Size2D32f{float32(box.size.width), float32(box.size.height)} + angle := float32(box.angle) + return Box2D{center, size, angle} +} diff --git a/opencv/imgproc_test.go b/opencv/imgproc_test.go index 9f4509b..037ce28 100644 --- a/opencv/imgproc_test.go +++ b/opencv/imgproc_test.go @@ -1,11 +1,11 @@ package opencv import ( + "os" "path" "runtime" - "os" - "testing" "syscall" + "testing" ) func TestResize(t *testing.T) { @@ -72,7 +72,6 @@ func TestFindContours(t *testing.T) { CvtColor(image, grayscale, CV_BGR2GRAY) defer grayscale.Release() - edges := CreateImage(grayscale.Width(), grayscale.Height(), grayscale.Depth(), grayscale.Channels()) defer edges.Release() Canny(grayscale, edges, 50, 200, 3) @@ -87,7 +86,7 @@ func TestFindContours(t *testing.T) { black := NewScalar(0, 0, 0, 0) red := NewScalar(0, 255, 0, 0) - for ; seq != nil; seq = (*Seq)(seq.h_next) { + for ; seq != nil; seq = seq.HNext() { DrawContours(contours, seq, red, black, 0, 2, 8, Point{0, 0}) }