Go / OpenCV:过滤轮廓

时间:2017-04-22 08:17:31

标签: opencv go

我正在使用this library在Golang中编写OpenCV应用程序。我正在尝试做一些非常基本的事情,但似乎无法使其发挥作用。我只想采取一组轮廓,删除那些没有最小面积的轮廓,然后返回过滤后的结果。

这是我的代码的当前状态:

// given *opencv.Seq and image, draw all the contours
func opencvDrawRectangles(img *opencv.IplImage, contours *opencv.Seq) {
    for c := contours; c != nil; c = c.HNext() {
        rect := opencv.BoundingRect(unsafe.Pointer(c))
        fmt.Println("Rectangle: ", rect.X(), rect.Y())
        opencv.Rectangle(img, 
            opencv.Point{ rect.X(), rect.Y() }, 
            opencv.Point{ rect.X() + rect.Width(), rect.Y() + rect.Height() },
            opencv.ScalarAll(255.0), 
            1, 1, 0)
    }
}

// return contours that meet the threshold
func opencvFindContours(img *opencv.IplImage, threshold float64) *opencv.Seq {
    defaultThresh := 10.0
    if threshold == 0.0 {
        threshold = defaultThresh
    }
    contours := img.FindContours(opencv.CV_RETR_LIST, opencv.CV_CHAIN_APPROX_SIMPLE, opencv.Point{0, 0})

    if contours == nil {
        return nil
    }

    defer contours.Release()

    threshContours := opencv.CreateSeq(opencv.CV_SEQ_ELTYPE_POINT,
                            int(unsafe.Sizeof(opencv.CvPoint{})))

    for ; contours != nil; contours = contours.HNext() {
        v := *contours
        if opencv.ContourArea(contours, opencv.WholeSeq(), 0) > threshold {
            threshContours.Push(unsafe.Pointer(&v))
        }
    }
    return threshContours
}

opencvFindContours中,我正在尝试仅将那些符合面积阈值的轮廓添加到新变量中。当我将这些结果传递到opencvDrawRectangles时,contours会填充无意义的数据。另一方面,如果我直接在contours中返回opencvFindContours,然后将其传递给opencvDrawRectangles,我会根据图像中检测到的动作得到我期望的矩形。

有谁知道如何使用此库正确过滤轮廓?我显然遗漏了一些关于这些数据结构如何工作的东西,只是不确定是什么。

然而,它最好的实现,我想弄清楚的主要是如何采取一系列轮廓并过滤掉低于某个区域的轮廓....我见过的所有c ++示例让这看起来很简单,但我发现使用C API的Go包装器非常具有挑战性。

1 个答案:

答案 0 :(得分:0)

你正在使用CreateSeq返回的Sizeof指针。您可能希望Sizeof结构opencv.CVPoint{}代替。