【发布时间】:2015-10-28 18:38:57
【问题描述】:
要在 OpenCV 中处理我的相机 previewFrames,我需要访问原始像素数据/字节。所以,有新的 SoftwareBitmap,它应该正好提供这个。
c# 有一个 example,但在 Visual c++ 中我无法获得 IMemoryBufferByteAccess(见备注)接口工作。
异常代码:
// Capture the preview frame
return create_task(_mediaCapture->GetPreviewFrameAsync(videoFrame))
.then([this](VideoFrame^ currentFrame)
{
// Collect the resulting frame
auto previewFrame = currentFrame->SoftwareBitmap;
auto buffer = previewFrame->LockBuffer(Windows::Graphics::Imaging::BitmapBufferAccessMode::ReadWrite);
auto reference = buffer->CreateReference();
// Get a pointer to the pixel buffer
byte* pData = nullptr;
UINT capacity = 0;
// Obtain ByteAccess
ComPtr<IUnknown> inspectable = reinterpret_cast<IUnknown*>(buffer);
// Query the IBufferByteAccess interface.
Microsoft::WRL::ComPtr<IMemoryBufferByteAccess> bufferByteAccess;
ThrowIfFailed(inspectable.As(&bufferByteAccess)); // ERROR ---> Throws HRESULT = E_NOINTERFACE
// Retrieve the buffer data.
ThrowIfFailed(bufferByteAccess->GetBuffer(_Out_ &pData, _Out_ &capacity)); // ERROR ---> Throws HRESULT = E_NOINTERFACE, because bufferByteAccess is null
我也试过这个:
HRESULT hr = ((IMemoryBufferByteAccess*)reference)->GetBuffer(&pData, &capacity);
HRESULT 没问题,但我无法访问 pData -> 读取内存时访问冲突。
感谢您的帮助。
【问题讨论】:
-
看起来你应该使用
Microsoft::WRL::ComPtr<IMemoryBufferByteAccess>和reference,而不是buffer。 -
嗨。您是否设法在 HSV 颜色空间中显示图像?我有一些工件......在c#(UWP)中,我将SoftwareBitmap传递给c ++,将SoftwareBitmap转换为cv::Mat,将颜色cpase更改为HSV,将Mat转换为SoftwareBitmap并传回c#..并且设置 Image.Source ... 而我所拥有的 .. onedrive.live.com/…
标签: c++ windows-runtime buffer windows-10 uwp