Bagikan melalui


CameraIntrinsics.UndistortedProjectionTransform Properti

Definisi

Mendapatkan matriks yang mengubah koordinat 2D dalam meter pada bidang gambar ke koordinat piksel bingkai video tanpa mengimbangi model distorsi kamera. Poin 2D yang dihasilkan dari transformasi ini tidak akan secara akurat memetakan ke koordinat piksel dalam bingkai video kecuali aplikasi menerapkan kompensasi distorsinya sendiri. Ini berguna untuk aplikasi yang memilih untuk menerapkan kompensasi distorsi berbasis GPU alih-alih menggunakan UndistortPoint, yang menggunakan CPU untuk menghitung kompensasi distorsi.

public:
 property float4x4 UndistortedProjectionTransform { float4x4 get(); };
float4x4 UndistortedProjectionTransform();
public Matrix4x4 UndistortedProjectionTransform { get; }
var matrix4x4 = cameraIntrinsics.undistortedProjectionTransform;
Public ReadOnly Property UndistortedProjectionTransform As Matrix4x4

Nilai Properti

Matrix4x4 Matrix4x4

float4x4

Mendapatkan matriks yang mengubah koordinat 2D dalam meter pada bidang gambar ke koordinat piksel bingkai video tanpa mengimbangi model distorsi kamera.

Persyaratan Windows

Rangkaian perangkat
Windows 10 Anniversary Edition (diperkenalkan dalam 10.0.14393.0)
API contract
Windows.Foundation.UniversalApiContract (diperkenalkan dalam v3.0)

Keterangan

Transformasi dikonversi dari koordinat 2D dalam meter pada bidang gambar (asal pada titik utama, +X menunjuk ke kanan dan +Y menunjuk ke atas), ke koordinat 2D dalam piksel dengan asal di sudut kiri atas gambar, dan +X menunjuk ke kanan, dan +Y menunjuk ke bawah. Jika koordinat 2D dinyatakan sebagai vektor dengan empat komponen, Z harus diatur ke 0 dan W harus diatur ke 1.

Untuk mengonversi koordinat 3D dalam sistem koordinat kamera ke koordinat piksel, komponen X dan Y koordinat harus terlebih dahulu dibagi dengan jarak dari kamera (yaitu koordinat Z) untuk memproyeksikannya ke bidang gambar. Perhatikan bahwa sistem koordinat kamera ditangan kanan oleh konvensi, dengan +X menunjuk ke kanan, +Y menunjuk ke atas, dan -Z menunjuk keluar dari kamera melalui tengah (titik utama) gambar. Dalam konvensi itu, koordinat Z harus dinegasikan ketika memba merupakan komponen X dan Y. Contohnya:

using namespace winrt::Windows::Foundation::Numerics;
winrt::Windows::Foundation::Point ProjectCameraCoordinateToPixelCoordinate(
    const winrt::Windows::Media::Devices::Core::CameraIntrinsics& cameraIntrinsics,
    const float3& cameraCoordinate)
{
    const float2 imagePlaneCoordinate = float2{ cameraCoordinate.x / -cameraCoordinate.z, cameraCoordinate.y / -cameraCoordinate.z };
    float2 pixelCoordinate = transform(imagePlaneCoordinate, cameraIntrinsics.UndistortedProjectionTransform());
    return winrt::Windows::Foundation::Point{ pixelCoordinate.x, pixelCoordinate.y };
}

Hasil yang setara dapat dicapai menggunakan vektor dengan empat komponen dengan mengatur komponen Z ke 1 dan komponen W ke jarak dari kamera. Perhatikan bahwa komponen X dan Y yang dihasilkan harus dibagi dengan komponen W yang dihasilkan untuk menghasilkan koordinat piksel akhir:

using namespace winrt::Windows::Foundation::Numerics;
winrt::Windows::Foundation::Point ProjectCameraCoordinateToPixelCoordinate(
    const winrt::Windows::Media::Devices::Core::CameraIntrinsics& cameraIntrinsics,
    const float3& cameraCoordinate)
{
    float4 cameraCoordinateVector{ cameraCoordinate.x, cameraCoordinate.y, 1, -cameraCoordinate.z };
    float4 pixelCoordinate = transform(cameraCoordinateVector, cameraIntrinsics.UndistortedProjectionTransform());
    return winrt::Windows::Foundation::Point{ pixelCoordinate.x / pixelCoordinate.w, pixelCoordinate.y / pixelCoordinate.w };
}

Jika transformasi ini akan diterapkan ke banyak koordinat 3D, mungkin lebih nyaman untuk menyesuaikan matriks itu sendiri, daripada setiap koordinat input. Ini dapat dicapai dengan menukar baris ketiga dan keempat matriks, dan menggunakan fungsi transformasi koordinat homogen seperti XMVector3TransformCoordStream. Perhatikan bahwa konversi tangan kanan ke kiri juga diterapkan sebagai bagian dari transformasi sehingga jarak dari kamera adalah nilai positif:

using namespace DirectX;
void ProjectCameraCoordinatesToPixelCoordinates(
    const winrt::Windows::Media::Devices::Core::CameraIntrinsics& cameraIntrinsics,
    const winrt::array_view<XMFLOAT3>& cameraCoordinates,
    winrt::array_view<winrt::Windows::Foundation::Point>& pixelCoordinates)
{
    XMMATRIX undistortedProjectionTransform = XMLoadFloat4x4(&cameraIntrinsics.UndistortedProjectionTransform());
    std::swap(undistortedProjectionTransform.r[2], undistortedProjectionTransform.r[3]);

    // convert right-handed coordinates (-Z forward) to right-handed coordinates (+Z forward) as part of the transform
    static const XMMATRIX rightToLeft = XMMatrixScaling(1, 1, -1);

    std::vector<XMFLOAT3> pixelCoordinateVectors(cameraCoordinates.size());
    XMVector3TransformCoordStream(
        pixelCoordinateVectors.data(), sizeof(pixelCoordinateVectors[0]),
        cameraCoordinates.data(), sizeof(cameraCoordinates[0]), cameraCoordinates.size(),
        rightToLeft * undistortedProjectionTransform);

    std::transform(pixelCoordinateVectors.begin(), pixelCoordinateVectors.end(), pixelCoordinates.begin(),
        [](const XMFLOAT3& v) { return winrt::Windows::Foundation::Point{ v.x, v.y }; });
}

Berlaku untuk