Added sequence, curve and contour related functions

This commit is contained in:
David Oram 2015-09-14 17:21:21 +12:00
parent 17d76c68f9
commit 857725be79
4 changed files with 86 additions and 4 deletions

View file

@ -553,6 +553,18 @@ func (seq *Seq) Total() int {
return (int)(seq.total) 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 * * Drawing *
\****************************************************************************************/ \****************************************************************************************/

View file

@ -595,6 +595,18 @@ type Box2D struct {
angle float32 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 type LineIterator C.CvLineIterator
/************************************* CvSlice ******************************************/ /************************************* CvSlice ******************************************/
@ -605,6 +617,12 @@ const (
CV_WHOLE_SEQ_END_INDEX = C.CV_WHOLE_SEQ_END_INDEX 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 *****************************************/ /************************************* CvScalar *****************************************/
type Scalar C.CvScalar type Scalar C.CvScalar
@ -706,6 +724,15 @@ const (
type AttrList C.CvAttrList type AttrList C.CvAttrList
/****************************************************************************************/
/* Structural Analysis and Shape Descriptors */
/****************************************************************************************/
/* For use in ApproxPoly */
const (
CV_POLY_APPROX_DP = C.CV_POLY_APPROX_DP
)
/*****************************************************************************\ /*****************************************************************************\
* --- END --- * * --- END --- *
\*****************************************************************************/ \*****************************************************************************/

View file

@ -83,3 +83,47 @@ func DrawContours(image *IplImage, contours *Seq, externalColor, holeColor Scala
C.int(lineType), C.int(lineType),
C.cvPoint(C.int(offset.X), C.int(offset.Y))) 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}
}

View file

@ -1,11 +1,11 @@
package opencv package opencv
import ( import (
"os"
"path" "path"
"runtime" "runtime"
"os"
"testing"
"syscall" "syscall"
"testing"
) )
func TestResize(t *testing.T) { func TestResize(t *testing.T) {
@ -72,7 +72,6 @@ func TestFindContours(t *testing.T) {
CvtColor(image, grayscale, CV_BGR2GRAY) CvtColor(image, grayscale, CV_BGR2GRAY)
defer grayscale.Release() defer grayscale.Release()
edges := CreateImage(grayscale.Width(), grayscale.Height(), grayscale.Depth(), grayscale.Channels()) edges := CreateImage(grayscale.Width(), grayscale.Height(), grayscale.Depth(), grayscale.Channels())
defer edges.Release() defer edges.Release()
Canny(grayscale, edges, 50, 200, 3) Canny(grayscale, edges, 50, 200, 3)
@ -87,7 +86,7 @@ func TestFindContours(t *testing.T) {
black := NewScalar(0, 0, 0, 0) black := NewScalar(0, 0, 0, 0)
red := NewScalar(0, 255, 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}) DrawContours(contours, seq, red, black, 0, 2, 8, Point{0, 0})
} }