Подтвердить что ты не робот

Как получить углы с помощью GPUImageHarrisCornerDetectionFilter

Я пытаюсь получить угловые точки из неподвижного изображения, используя GPUImageHarrisCornerDetectionFilter.

Я посмотрел пример кода из проекта, я посмотрел документацию, и я просмотрел этот пост, который касается примерно того же: GPUImage Harris Corner Detection на существующем UIImage дает черный экран

Но я не могу заставить его работать - и мне трудно понять, как это должно работать с неподвижными изображениями.

То, что у меня на данный момент, таково:

func harrisCorners() -> [CGPoint] {
    var points = [CGPoint]()

    let stillImageSource: GPUImagePicture = GPUImagePicture(image: self.image)
    let filter = GPUImageHarrisCornerDetectionFilter()

    filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
        for index in 0..<Int(cornersDetected) {
            points.append(CGPoint(x:CGFloat(cornerArray[index * 2]), y:CGFloat(cornerArray[(index * 2) + 1])))
        }
    }

    filter.forceProcessingAtSize(self.image.size)
    stillImageSource.addTarget(filter)
    stillImageSource.processImage()

    return points
}

Эта функция всегда возвращает [], поэтому она явно не работает.

Интересная деталь - я скомпилировал проект FilterShowcaseSwift из примеров GPUImage, и фильтр не нашел очень четких углов, например, на листе бумаги на черном фоне.

4b9b3361

Ответ 1

filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
    for index in 0..<Int(cornersDetected) {
        points.append(CGPoint(x:CGFloat(cornerArray[index * 2]), y:CGFloat(cornerArray[(index * 2) + 1])))
    }
}

Этот код, который вы здесь, задает блок, который вызывается каждый кадр.

Это асинхронный процесс, поэтому, когда возвращается ваша функция, которая еще никогда не вызывалась, и ваш массив всегда должен быть пустым. Он должен вызываться после завершения обработки кадра.

Чтобы проверить это, установите контрольную точку внутри этого блока и посмотрите, вызвана ли она.

Предупреждение от Брэда Ларсона (создателя GPUImage) в комментариях:

Созданный здесь GPUImage stillImageSource будет освобожден после выхода этой функции и может привести к сбоям в этом случае.