私はthis libraryを使ってGolangにOpenCVアプリを書いています。私は非常に基本的なことをしようとしていますが、それを機能させるようには見えません。私は単に輪郭のセットを取って、最小面積を持たない輪郭を取り除き、フィルタリングされた結果を返すだけです。Go/OpenCV:輪郭をフィルタする
これは私のコードの現在の状態です。opencvFindContours
で
// 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
}
、私は新しい変数にエリアしきい値を満たすのみ輪郭を追加しようとしています。これらの結果を受け取り、opencvDrawRectangles
に渡すと、contours
はナンセンスデータで埋められます。一方で、私はちょうどそのopencvDrawRectangles
にそれを渡すopencvFindContours
に直接contours
を返す、場合、私は画像で検出された動きに基づいて期待される四角形を取得します。
このライブラリを使用して輪郭を適切にフィルタリングする方法を知っている人はいますか?私は明らかにこれらのデータ構造がどのように機能するかについて何かを紛失しています。
それは最高の実装ですが、私はここを把握しようとしている主なものは、輪郭のシーケンスを取り、一定の面積を下回るものをフィルタリングする方法を単純です....私がしたすべてのC++の例この見た目はかなり簡単ですが、私はC APIのGoラッパーを使用してかなり難しいと感じています。
返信いただきありがとうございます。それは理にかなっていて、私が最初にやっていたことでした。何かを試すために投稿したものに変更しました。どちらの方法でも問題は解決しません。 – rumdrums