Merge pull request #56 from davidoram/feature/sequence-traversal
Feature/sequence traversal
This commit is contained in:
commit
08a8c82102
4 changed files with 86 additions and 4 deletions
|
|
@ -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 *
|
||||
\****************************************************************************************/
|
||||
|
|
|
|||
|
|
@ -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 --- *
|
||||
\*****************************************************************************/
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue