二元运算符' + ='不能应用于' Int'类型的操作数和' UInt8'

时间:2015-04-23 21:02:59

标签: objective-c swift

将Obj-C翻译为Swift。如您所见,我宣布let buf = UnsafeMutablePointer<UInt8>(CVPixelBufferGetBaseAddress(cvimgRef)),因此我在其下方的for循环中收到错误。

  

二元运算符&#39; + =&#39;不能应用于&#39; Int&#39;类型的操作数和&#39; UInt8&#39;

另外作为一个小附录,我不知道如何将剩下的Obj-C代码翻译成for循环。什么斜线意味着什么,我如何处理指针?我不得不在某处说UnsafeMutableFloat?

 // process the frame of video
    func captureOutput(captureOutput:AVCaptureOutput, didOutputSampleBuffer sampleBuffer:CMSampleBuffer, fromConnection connection:AVCaptureConnection) {
        // if we're paused don't do anything
        if currentState == CurrentState.statePaused {
            // reset our frame counter
            self.validFrameCounter = 0

            return
        }

    // this is the image buffer
    var cvimgRef:CVImageBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)
    // Lock the image buffer
    CVPixelBufferLockBaseAddress(cvimgRef, 0)
    // access the data
    var width: size_t = CVPixelBufferGetWidth(cvimgRef)
    var height:size_t = CVPixelBufferGetHeight(cvimgRef)
    // get the raw image bytes
    let buf = UnsafeMutablePointer<UInt8>(CVPixelBufferGetBaseAddress(cvimgRef))
    var bprow: size_t = CVPixelBufferGetBytesPerRow(cvimgRef)


    var r = 0
    var g = 0
    var b = 0

        for var y = 0; y < height; y++ {
            for var x = 0; x < width * 4; x += 4 {
                b += buf[x]; g += buf[x + 1]; r += buf[x + 2] // error
            }
            buf += bprow() // error
        }

剩余的Obj-C代码。

r/=255*(float) (width*height);
g/=255*(float) (width*height);
b/=255*(float) (width*height);

1 个答案:

答案 0 :(得分:3)

您有很多类型不匹配错误。

x的类型不应为UInt8,因为x会增加到宽度值。

for var x:UInt8 = 0; x < width * 4; x += 4 {  // error: '<' cannot be applied to operands of type 'UInt8' and 'Int'

所以修改如下:

for var x = 0; x < width * 4; x += 4 {

要递增指针地址,可以使用advancedBy()函数。

buf += bprow(UnsafeMutablePointer(UInt8))  // error: '+=' cannot be applied to operands of type 'UnsafeMutablePointer<UInt8>' and 'size_t'

如下所示:

var pixel = buf.advancedBy(y * bprow)

这一行,

RGBtoHSV(r, g, b)  // error

不幸的是,CGFloatFloat之间没有Swift中的隐式转换。所以你应该明确地转换为CGFloat

RGBtoHSV(CGFloat(r), g: CGFloat(g), b: CGFloat(b))

整个编辑过的代码在这里:

func RGBtoHSV(r: CGFloat, g: CGFloat, b: CGFloat) -> (h: CGFloat, s: CGFloat, v: CGFloat) {
    var h: CGFloat = 0.0
    var s: CGFloat = 0.0
    var v: CGFloat = 0.0
    let col = UIColor(red: r, green: g, blue: b, alpha: 1.0)
    col.getHue(&h, saturation: &s, brightness: &v, alpha: nil)
    return (h, s, v)
}

// process the frame of video
func captureOutput(captureOutput:AVCaptureOutput, didOutputSampleBuffer sampleBuffer:CMSampleBuffer, fromConnection connection:AVCaptureConnection) {
    // if we're paused don't do anything
    if currentState == CurrentState.statePaused {
        // reset our frame counter
        self.validFrameCounter = 0
        return
    }

    // this is the image buffer
    var cvimgRef = CMSampleBufferGetImageBuffer(sampleBuffer)
    // Lock the image buffer
    CVPixelBufferLockBaseAddress(cvimgRef, 0)
    // access the data
    var width = CVPixelBufferGetWidth(cvimgRef)
    var height = CVPixelBufferGetHeight(cvimgRef)
    // get the raw image bytes
    let buf = UnsafeMutablePointer<UInt8>(CVPixelBufferGetBaseAddress(cvimgRef))
    var bprow = CVPixelBufferGetBytesPerRow(cvimgRef)

    var r: Float = 0.0
    var g: Float = 0.0
    var b: Float = 0.0

    for var y = 0; y < height; y++ {
        var pixel = buf.advancedBy(y * bprow)
        for var x = 0; x < width * 4; x += 4 {  // error: '<' cannot be applied to operands of type 'UInt8' and 'Int'
            b += Float(pixel[x])
            g += Float(pixel[x + 1])
            r += Float(pixel[x + 2])
        }
    }
    r /= 255 * Float(width * height)
    g /= 255 * Float(width * height)
    b /= 255 * Float(width * height)

    //}

    // convert from rgb to hsv colourspace
    var h: Float = 0.0
    var s: Float = 0.0
    var v: Float = 0.0

    RGBtoHSV(CGFloat(r), g: CGFloat(g), b: CGFloat(b))  // error
}