2017-04-22 1 views
0

나는 Golang에서 OpenCV 응용 프로그램을 작성하기 위해 this library을 사용하고 있습니다. 나는 아주 기초적인 것을하려고 노력하고 있지만 그것이 효과가있는 것처럼 보이지는 않습니다. 간단히 컨투어 세트를 취하여 최소 면적이없는 컨투어를 제거한 다음 필터링 된 결과를 반환하기 만하면됩니다.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은 넌센스 데이터로 채워집니다. 반면에, contoursopencvFindContours에 직접 입력 한 다음 opencvDrawRectangles으로 전달하면 이미지에서 감지 된 움직임을 기반으로 예상되는 직사각형을 얻을 수 있습니다.

누구든지이 라이브러리를 사용하여 윤곽을 올바르게 필터링하는 방법을 알고 있습니까? 나는이 데이터 구조가 어떻게 작동하는지에 대해 명확하게 알지 못한다. 확실하지 않다.

그러나 구현 방법이 가장 좋았습니다. 여기에서 알아 내려고하는 주요한 점은 단순히 윤곽 시퀀스를 취하여 특정 영역 아래에있는 것들을 필터링하는 것입니다. 모든 C++ 예제들 본이 꽤 쉽게 보이게하지만, 나는 C API의 Go 래퍼를 사용하여 상당히 어렵다.

답변

0

Sizeof은 CreateSeq에 의해 반환되는 포인터입니다. 아마도 Sizeof 구조체 opencv.CVPoint{}을 대신 사용하기를 원할 것입니다.

+0

답장을 보내 주셔서 감사합니다. 그것은 의미가 있으며 실제로 처음에 무엇을하고 있었는지 - 어떤 것을 시도하기 위해 게시 된 것으로 변경했습니다 ... 어느 쪽이든 문제를 해결하지 못합니다. – rumdrums