3

だから私は2つの画像で深度検出を行うためのコードをいくつか持っています。深さの検出は、ネイティブ C コードで行われています。C ライブラリを呼び出すために、パラメーターとして渡す Int16 の配列を作成する別の関数があります。

ただし、C 呼び出しのパラメーターで関数呼び出しを直接行うと、最初の関数呼び出しが上書きされ、同じパラメーターが 2 回渡されます。

これが私の言いたいことです。これは私の C ライブラリーへの呼び出しです。

let result = ImageProcessing.depthDetection(leftPhoto.cgImage!,
                                            right: rightPhoto.cgImage!,
                                            leftFace: getFaceDetails(image: leftPhoto, face: leftFace!).mutablePointer,
                                            rightFace: getFaceDetails(image: rightPhoto, face: rightFace!).mutablePointer))

get face details 呼び出しは次のようになります。

private func getFaceDetails(image: UIImage, face: VisionFace) -> [Int16] {
    var details = [Int16](repeating: 0, count: 10)
    // get image size
    details[0] = Int16(image.size.width)
    details[1] = Int16(image.size.height)

    // get face bounds
    details[2] = Int16(face.frame.origin.x)
    details[3] = Int16(face.frame.origin.y)
    details[4] = Int16(face.frame.origin.x + face.frame.width)
    details[5] = Int16(face.frame.origin.y + face.frame.height)

    // get eye locations
    details[6] = Int16(truncating: face.landmark(ofType: .leftEye)?.position.x ?? 0)
    details[7] = Int16(truncating: face.landmark(ofType: .leftEye)?.position.y ?? 0)
    details[8] = Int16(truncating: face.landmark(ofType: .rightEye)?.position.x ?? 0)
    details[9] = Int16(truncating: face.landmark(ofType: .rightEye)?.position.y ?? 0)

    print("Details: \(details)")

    return details
}

そして、私はこの拡張機能で可変ポインタを取得しています:

extension Array where Element == Int16 {
    var mutablePointer: UnsafeMutablePointer<Int16> {
        get {
            return UnsafeMutablePointer<Int16>(mutating: self)
        }
    }
}

したがって、上記のImageProcessing.depthDetection呼び出しを実行すると、 myleftFacerightFacearrays が実際に異なり、次のように表示されることがわかります。

Details: [3088, 2320, 1119, 431, 2230, 1542, 1493, 888, 1892, 882]
Details: [3088, 2320, 864, 446, 1975, 1556, 1207, 900, 1626, 890]

しかし、Cでそれらを印刷すると、それらは両方とも同じrightFace配列であり、次のようになります(Cログのフォーマットは異なりますが、左と右の両方に同じデータがあることがわかります):

0: Left (3088, 2320), Right (3088, 2320)
1: Left (864, 446), Right (864, 446)
2: Left (1975, 1556), Right (1975, 1556)
3: Left (1207, 900), Right (1207, 900)
4: Left (1626, 890), Right (1626, 890)

では、なぜ最初のgetFaceDetails出力が 2 番目の出力によって上書きされるのでしょうか?

すべての中で最も奇妙な部分は、変数に結果を割り当ててgetFaceDetailsから、ここで行っているようにその変数をパラメーターとして渡す場合です。

let lf = getFaceDetails(image: leftPhoto, face: leftFace!)
let rf = getFaceDetails(image: rightPhoto, face: rightFace!)

let result = ImageProcessing.depthDetection(leftPhoto.cgImage!,
                                            right: rightPhoto.cgImage!,
                                            leftFace: lf.mutablePointer,
                                            rightFace: rf.mutablePointer)

それから突然それが機能します!C の print ステートメントは、左右の面で異なるデータを表示します。パラメータに関数呼び出しを直接渡すと、間違ったデータが含まれます。

それで、ここで何が起こっているのですか?最初の方法で後者と同じ結果が得られないのはなぜですか?

4

1 に答える 1