我正在尝试使用Brad的出色的GPUImage框架,并且我很难处理GPUImageHarrisCornerDetectionFilter返回的cornerArray。
这些角作为GLFloat数组返回到UnsafeMutablePointer中,我想将其转换为CGPoint数组。
我试过分配内存空间
var cornerPointer = UnsafeMutablePointer<GLfloat>.alloc(Int(cornersDetected) * 2)但是这些数据似乎没有任何意义--无论是0还是1E-32。
我找到了一个完美的答案, in Swift,然后尝试
filter.cornersDetectedBlock = {(cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime)
for floatData in UnsafeBufferPointer(start: cornerArray, count: cornersDetected)
{
println("\(floatData)")
}但是编译器不喜欢UnsafeBufferPointer,所以我把它改成了UnsafeMutablePointer,但是它不喜欢参数列表。
我肯定这很简单,听起来像是必须做的其他人必须做的事情--那么解决方案是什么呢?
发布于 2016-02-10 20:17:55
从C转换而来的UnsafeMutablePointer<GLfloat>类型可以通过下标访问其元素,就像普通数组一样。为了实现将这些转换为CGPoints的目标,我将使用以下代码:
filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
var points = [CGPoint]()
for index in 0..<Int(cornersDetected) {
points.append(CGPoint(x:CGFloat(cornerArray[index * 2]), y:CGFloat(cornerArray[(index * 2) + 1])))
}
// Do something with these points
}在触发回调之前立即分配内存支持cornerArray,并在回调之后立即将其释放。除非您在代码块中间复制这些值,正如我前面所做的那样,否则我担心您会对一些令人讨厌的错误敞开心扉。无论如何,在这一点上也更容易转换成正确的格式。
发布于 2016-02-10 17:55:39
我找到了一个解决办法--而且很简单。答案就在这里,https://gist.github.com/kirsteins/6d6e96380db677169831
var dataArray = Array(UnsafeBufferPointer(start: cornerArray, count: Int(cornersDetected) * 2))发布于 2016-02-10 10:37:40
试试这个:
var cornerPointer = UnsafeMutablePointer<GLfloat>.alloc(Int(cornersDetected) * 2)
filter.cornersDetectedBlock = {(cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime)
for i in 0...cornersDetected
{
print("\(cornerPointer[i])")
}https://stackoverflow.com/questions/35310679
复制相似问题