开发者

How can i grab pRgb32 image buffer from BitmapSource or PlanarImage (from Kinect)?

开发者 https://www.devze.com 2023-04-01 20:38 出处:网络
I\'m trying to convert the PlanarImage bits into a pRgb32buffer on a WPF application to display it on my Virtual Webcam provided by VcamSDK. I don\'t know what pRgb32buffer is but it is needed as an O

I'm trying to convert the PlanarImage bits into a pRgb32buffer on a WPF application to display it on my Virtual Webcam provided by VcamSDK. I don't know what pRgb32buffer is but it is needed as an Overlay Parameter in VcamSDK by e2eSoft. The documentation about the addOverlay method is as following;

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).

And the code for the PlanarImage is as following, the PixelFormat is Bgr32 so also a little conversion is needed;

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);

I've searched for the pRgb32 on Google but only found limited information, and there is no example documentation on vCam SDK.

I'm not really an expert on Image processing so any help is appreciated! Thanks!


Edit:

I think i can use the PlayVideoFile(string fileName); method that also exists in the SDK but it needs an Uri of image to display. And i can't save it to the HDD for some restrictions on my app (I may change the image many times and make a streaming video from images, and if I try to save it, the runtime gives me an error that it's currently in Use), i don't spouse there is a hack or anyway around to send the Image on the layout as Uri in parameters?


UPDATE:

I've succeeded with the following bit conversion, as I understood Kinect was not using the Alpha channel thus it was sending all the Alpha bits 0. First i solved that problem (image was invisible due to 0 alpha), then I've done the following conversion from BGRA (Kinect) to ABGR(desired pixel format). The document was kinda delusional saying it's in RGB format with alpha channel it took a little time to understand the real format is ABGR.

Here is the conversion:

   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;
    }

If anyone can help me do this in a more efficient way I'd be glad to accept their answers. Else I don't know how to close a question?


I guess you could simply remove the inner for, and do:


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;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消