Как получить углы с помощью 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, и фильтр не нашел очень четких углов, например, на листе бумаги на черном фоне.
Ответы
Ответ 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
будет освобожден после выхода этой функции и может привести к сбоям в этом случае.