4

この問題は、この 1 つのリンクからの次のステップです。

簡単に言えば、16 ビットの画像を取得する kinect からの深度画像を使用しています。C++Amp では、データのビット サイズにいくつかの制限があります。そのため、テクスチャを使用して対処しようとしています。

今、私は適切なピクセルに書いていると確信しています。ただし、テクスチャの元のデータから取得する際に問題があるようです。

それがコードです:

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

cv::Mat image(480, 640, CV_16UC1);
cv::Mat image2(480, 640, CV_16UC1);

// create a gradient, just to see something meaningfull
for (int i = 0; i < 480; i++)
{
    for (int j = 0; j < 640; j++)
    {
        /*int gradientInY = (i / 480.f) * 65535;
        image.at<uint16_t>(i, j) = gradientInY;*/

        int gradientInX = (j / 640.f) * 65535;
        image.at<uint16_t>(i, j) = gradientInX;
        image2.at<uint16_t>(i, j) = gradientInX;
    }
}


cv::imshow("image", image);
cv::waitKey(50);

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

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


{
    uchar* data = image.data;

    // Source Data
    TextureData texDataS(imageSize, data, nBytes, bits);
    Texture texS(texDataS);

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


    parallel_for_each(
        imageSize,
        [=, &texDataS](concurrency::index<2> idx) restrict(amp)
    {
        //I tried either this:
        int val = texDataS(idx);

        // and this:
        //int val = texS(idx);
        texR.set(idx, val);
    });
    //concurrency::graphics::copy(texR, image2.data, imageSize.size() *(bits / 8u));
    concurrency::graphics::copy_async(texR, image2.data, imageSize.size() *(bits / 8u) );

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

そして結果:

GPUを使用してコピーした後:

また、kinect 画像を使用して何が起こるかを確認してみました。結果は私を驚かせます:

オリジナル:

結果:

何が起こっているか知っている人はいますか?

これは、16 ビットのイメージを直接操作するために行った変更です (役立つかもしれません)。

cv::Mat image = cv::imread("Depth247.tiff", CV_LOAD_IMAGE_ANYDEPTH);
cv::Mat image2(480, 640, CV_16UC1);

いつものように、どんな助けも非常に感謝しています。あなたが私を助けることができると思うなら、私に詳細を尋ねることを躊躇しないでください.

ありがとう、デビッド

4

1 に答える 1