Как я могу получить буфер изображения pRgb32 из BitmapSource или PlanarImage (из Kinect)? - PullRequest
0 голосов
/ 01 сентября 2011

Я пытаюсь преобразовать биты PlanarImage в буфер pRgb32 в приложении WPF, чтобы отобразить его на моей виртуальной веб-камере, предоставленной VcamSDK. Я не знаю, что такое pRgb32buffer, но он необходим в качестве параметра наложения в VcamSDK от e2eSoft. Документация по методу addOverlay следующая:

HRESULT AddOverlay([in] VARIANT pRgb32Buffer, [in] ULONG width, [in] ULONG height
    , [in] LONG px, [in] LONG py, [in] ULONG whichOne);
Add an image overlay to current VCam video.
pRgb32Buffer: overlay image buffer, in RGB32 format (with alpha channel), size is
    [width x height], if it's NULL, this overlay (whichOne) will be removed; 
px, py: overlay position, [0, 0] is left-top point;
whichOne: VCam support 5 image overlay (0~4).

А код для PlanarImage выглядит следующим образом: PixelFormat - Bgr32, поэтому также требуется небольшое преобразование;

void _nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
    PlanarImage Image = e.ImageFrame.Image;
    video.Source = BitmapSource.Create(
        Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, 
            Image.Bits, Image.Width * Image.BytesPerPixel);

Я искал pRgb32 в Google, но нашел только ограниченную информацию, и нет примера документации по vCam SDK.

Я не специалист по обработке изображений, поэтому любая помощь приветствуется! Спасибо!


Edit:

Я думаю, что могу использовать метод PlayVideoFile(string fileName);, который также существует в SDK, но для его отображения требуется Uri изображения. И я не могу сохранить его на жестком диске для некоторых ограничений в моем приложении (я могу много раз менять изображение и создавать потоковое видео из изображений, и если я пытаюсь сохранить его, среда выполнения выдает ошибку, что она в данный момент находится в Использовать), я не женат, что есть взлом или что-нибудь еще, чтобы отправить изображение на макете как Uri в параметрах?


UPDATE:

Мне удалось выполнить следующее преобразование битов, так как я понял, что Kinect не использует альфа-канал, поэтому он отправлял все альфа-биты 0. Сначала я решил эту проблему (изображение было невидимым из-за 0 альфа), затем я сделали следующее преобразование из BGRA (Kinect) в ABGR (желаемый формат пикселей). Документ был своего рода бредовым, говоря, что он в формате RGB с альфа-каналом, чтобы понять, что настоящий формат - ABGR, потребовалось немного времени.

Вот преобразование:

   for (int i = 0; i < myBits.Length; i+=4)
   {
       for (int j = 0; j < 4; j++)
       {
            tempBit = myBits[i + j];
            myBits[i + j] = myBits[i + 3];
            myBits[i + 3] = tempBit;
        }
        myBits[i] = 255;
    }

Если кто-нибудь может помочь мне сделать это более эффективно, я буду рад принять их ответы. Иначе я не знаю, как закрыть вопрос?

1 Ответ

0 голосов
/ 24 января 2012

Полагаю, вы можете просто удалить внутреннюю часть и выполнить:


for (int i = 0; i < myBits.Length; i+=4)
{
    myBits[i+3] = myBits[i+2];
    myBits[i+2] = myBits[i+1];
    myBits[i+1] = myBits[i];
    myBits[i] = 255;
}
...