我正在使用openCV在Windows 10(通用Windows应用程序/ WinRT)中制作增强现实应用程序(C ++)。
问题:
我希望有一个透明的SwapChainPanel背景,以使后面的内容(网络摄像头流)可见,但使用不透明的3D模型(例如锥形)。
尝试:
对于我的研究似乎,将SwapChainPanel的CompositeMode设置为“minBlend”应该这样做 - 是的,但我仍然希望我的3D对象不透明。事实上,我希望我的对象是半透明的,但始终可见。 “minBlend”模式更适用于文本突出显示,而不是真正用半透明模型覆盖某些内容(暗区未覆盖,请参见图片)。
Image: Standard DirectX Cube (oqaque background and model)
你有什么建议吗?有可能吗?
背景
我正在使用openCV制作增强现实Windows 10应用程序。要获取我的网络摄像头流的当前像素数据,我使用Win10方法 mediaCapture-> GetPreviewFrameAsync(videoframe)与 SoftwareBitmap-> LockBuffer 来访问memorybuffer中的字节数。这些字节在openCV函数中处理,处理完成后,我正在设置一个WriteableBitmap,以在我的Xaml-UI元素中显示修改过的webcam-stream。由于已经有类绘制我的DirectX对象并使用触摸输入修改它们,我想使用DirectX将网络摄像头预览覆盖到我的对象。
很抱歉没有关联使用的方法和链接的图片,我的声誉不够
编辑:也许另一种方法是从我的像素数据创建纹理,并在我的swapchainpanel上设置一个全屏矩形作为背景。然后每一帧我都要更新纹理数据。
答案 0 :(得分:0)
由于某些官方Windows Store示例,更改compositeMode是使swapChainPanel后面的Xaml内容可见的唯一解决方案。
但是这个解决方法最终有效:我创建了一个Texture2D并每帧更新包含数据:
/*----- Update background texture with new videoframe -----*/
// image = openCV cv::Mat containing the pixeldata of the current frame
if (image.data != nullptr)
{
D3D11_MAPPED_SUBRESOURCE mappedResource;
ZeroMemory(&mappedResource, sizeof(D3D11_MAPPED_SUBRESOURCE));
// Disable GPU access to data.
auto m_d3dContext = m_deviceResources->GetD3DDeviceContext();
m_d3dContext->Map(m_pTexture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
// Update texture
memcpy(mappedResource.pData, image.data, 4*image.rows*image.cols);
// Reenable GPU access to data.
m_d3dContext->Unmap(m_pTexture, 0);
}
首先,我正在使用此纹理绘制一个全屏矩形(带有DirectXTK的SpriteBatch)。之后我可以画任何其他东西。