Сравнивая два изображения и находя разницу в процентах

Я пытался сделать приложение распознавания животных по изображению. Мой метод состоит в том, чтобы сравнивать выбранное изображение с другими изображениями в массиве изображений и перечислять любые сравнения, которые дают сходство более 90%. Есть ли другие способы сравнить два изображения, которые похожи, но не похожи? Мы ценим любые предложения. Эти вычисления также должны выполняться для многих итераций, поэтому не требующий много времени метод будет высоко оценен.

Пожалуйста, попробуйте предоставить код с ответом, так как я не очень опытен в Swift.

0 ответов

Вы можете сделать что-то вроде меня, анализируя один кадр за другим и определяя разницу (я еще не уменьшал масштаб изображения, и, вероятно, должен)

// called everytime a frame is captured
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

    guard let imageBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer) else {
        return
    }

    CVPixelBufferLockBaseAddress(imageBufferRef, []);

    // set up for comparisons between prev and next images
    if prevPB == nil {
        prevPB = imageBufferRef
    }

    if (!isPlaying && motionIsDetected(prevPB, imageBufferRef) == 1) {
        isPlaying = true
        print("play video")
    }
    CVPixelBufferUnlockBaseAddress(imageBufferRef,[]);


    // if true, play the video
    prevPB = imageBufferRef
}


func pixelFrom(x: Int, y: Int, current: CVPixelBuffer) -> (UInt8, UInt8, UInt8) {
    let baseAddress = CVPixelBufferGetBaseAddress(current)
    let bytesPerRow = CVPixelBufferGetBytesPerRow(current)
    let buffer = baseAddress!.assumingMemoryBound(to: UInt8.self)
    let index = x*bytesPerRow+y

    let b = buffer[index]
    let g = buffer[index+1]
    let r = buffer[index+2]

    return (r, g, b)
}

func motionIsDetected(_ prev:CVPixelBuffer, _ current:CVPixelBuffer) -> Int {

    var differences = 0

    let baseAddress = CVPixelBufferGetBaseAddress(current)

    let width = CVPixelBufferGetWidth(current)
    let height = CVPixelBufferGetHeight(current)


    // THRESHOLDING: clamp by abs(aa-bb) for tuple of r,b,g  if 150 difference and at least 10 different pixels
    var MAGIC_THRESHOLD = 120
    var ENOUGH_DIFFERENCES = 10

    if (current != nil && prev != nil) {
        for x in 0..<height { //rows
            for y in 0..<width { //cols
                var setA = pixelFrom(x: x, y: y, current: prev)
                var setB = pixelFrom(x: x, y: y, current: current)
                if abs(Int(setA.0) - Int(setB.0)) > MAGIC_THRESHOLD && abs(Int(setA.1) - Int(setB.1)) > MAGIC_THRESHOLD && abs(Int(setA.2) - Int(setB.2)) > MAGIC_THRESHOLD {
                    differences = differences + 1
                }
            }
        }
    }
    print(" difference" )
    print(differences)

    if differences > ENOUGH_DIFFERENCES {
        return 1
    }
    return 0

}
Другие вопросы по тегам