C ++ AMP Computing-Gradient unter Verwendung von Textur auf einem 16-Bit-Bild

Ich arbeite mit Tiefenbildern, die von Kinect abgerufen wurden und 16 Bit lang sind. Ich habe aufgrund des Index oder der Größe der Bilder einige Schwierigkeiten beim Erstellen eigener Filter festgestellt. Ich arbeite mit Texturen, weil ich mit jeder Bitgröße von Bildern arbeiten kann.

Ich versuche also, einen einfachen Verlauf zu berechnen, um zu verstehen, was falsch ist oder warum es nicht wie erwartet funktioniert.

Sie können sehen, dass etwas nicht stimmt, wenn ich y dir benutze.

Für x:

Für Y:

Das ist mein Code:

typedef concurrency::graphics::texture<unsigned int, 2> TextureData;
typedef concurrency::graphics::texture_view<unsigned int, 2> Texture

cv::Mat image = cv::imread("Depth247.tiff", CV_LOAD_IMAGE_ANYDEPTH);

//just a copy from another image
cv::Mat image2(image.clone() );


concurrency::extent<2> imageSize(640, 480);
int bits = 16;

const unsigned int nBytes = imageSize.size() * 2; // 614400


{
    uchar* data = image.data;

    // Result data
    TextureData texDataD(imageSize, bits);
    Texture texR(texDataD);


    parallel_for_each(
        imageSize,
        [=](concurrency::index<2> idx) restrict(amp)
    {
        int x = idx[0];
        int y = idx[1];

        // 65535 is the maxium value that can take a pixel with 16 bits (2^16 - 1)
        int valX = (x / (float)imageSize[0]) * 65535;
        int valY = (y / (float)imageSize[1]) * 65535;

        texR.set(idx, valX);
    });
    //concurrency::graphics::copy(texR, image2.data, imageSize.size() *(bits / 8u));
    concurrency::graphics::copy_async(texR, image2.data, imageSize.size() *(bits) );

    cv::imshow("result", image2);
    cv::waitKey(50);
}

Jede Hilfe wird sehr geschätzt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage