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)
|
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 *
|
||||||
\****************************************************************************************/
|
\****************************************************************************************/
|
||||||
|
|
|
||||||
|
|
@ -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 --- *
|
||||||
\*****************************************************************************/
|
\*****************************************************************************/
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue