OpenCV和Windows 10透明图像

时间:2015-12-18 17:46:17

标签: opencv windows-10 uwp

假设我们有以下颜色:

const Scalar TRANSPARENT2 = Scalar(255, 0, 255,0);

是洋红色但完全透明:alpha = 0(完全不透明是255)。

现在我根据以下内容进行了以下测试:

http://blogs.msdn.com/b/lucian/archive/2015/12/04/opencv-first-version-up-on-nuget.aspx

WriteableBitmap^ Grabcut::TestTransparent()
{
Mat res(400,400, CV_8UC4);
res.setTo(TRANSPARENT2);

WriteableBitmap^ wbmp = ref new WriteableBitmap(res.cols, res.rows);
IBuffer^ buffer = wbmp->PixelBuffer;
unsigned char* dstPixels;
ComPtr<IBufferByteAccess> pBufferByteAccess;
ComPtr<IInspectable> pBuffer((IInspectable*)buffer);
pBuffer.As(&pBufferByteAccess);
pBufferByteAccess->Buffer(&dstPixels);
memcpy(dstPixels, res.data, res.step.buf[1] * res.cols * res.rows);
return wbmp;
}

我遇到的问题是创建的图像不是完全透明的,它有一些alpha:

enter image description here

我知道memcpy数据中有一个细丝,但我不确定如何解决这个问题。任何想法让它成为alpha 0?

更多详情

enter image description here

要看到我保存图像然后可以读取并测试它是否有效,我看到imwrite包含一个关于透明度的片段,就像在图像中一样,但是imwrite还没有实现。但是透明度方法也没有用。

这个片段有什么亮点吗?

感谢。

1 个答案:

答案 0 :(得分:0)

最后我在C#代码中进行了转换,首先避免调用CreateAlphaMat。 然后我做的是使用BitmapEncoder转换数据:

WriteableBitmap wb = new WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight);
        using (IRandomAccessStream stream = new InMemoryRandomAccessStream())
        {
            BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
            Stream pixelStream = bitmap.PixelBuffer.AsStream();
            byte[] pixels = new byte[pixelStream.Length];
            await pixelStream.ReadAsync(pixels, 0, pixels.Length);

            encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied,
                        (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96.0, 96.0, pixels);
            await encoder.FlushAsync();
            wb.SetSource(stream);
        }
        this.MainImage.Source = wb;

其中bitmap是OpenCV结果中的WriteableBitmap。现在图像完全透明。

注意:不要使用MemoryStream然后使用.AsRandomAccessStream,因为它不会FlushAsync