WinRT C ++(Win10),opencv HSV色彩空间,图像显示,工件

时间:2015-12-10 09:38:30

标签: c# opencv windows-runtime opencv3.0 c++-cx

我的目标是进行对象跟踪。

我有一个UWP c#app和链接的c ++ windows运行时组件。在那里,我可以获得对opencv的访问。

  • 在c#中,MediaCapture返回SoftwareBitmap。
  • 然后我将SoftwareBitmap传递给c ++并将其转换为opencv的Mat。
  • 然后cvtColor(cvFrame, cvFrame, COLOR_BGR2HSV);
  • 然后转换回SoftwareBitmap,使用BitmapPixelFormat :: Bgra8(仅Bgra8被软件位图接受)和BitmapAlphaMode :: Ignore

还有我所拥有的screen

如果我跳过cvtColor部分并转换为cv :: Mat并返回到SoftwareBitmap,我的结果会得到很好的结果......

我知道图片的频道存在问题...但我已经失去了挖掘的地方。 我假设cvtColor之后的cv :: Mat是正确的...但我想看到图片创建的中间步骤。 (HSV,阈值,然后结果)

任何建议都将受到赞赏。

PS 我已尝试imwrite但未创建任何文件。

更新 转换自/到

Mat Convert(SoftwareBitmap^ from)
{
    BitmapBuffer^ bmpBuffer = from->LockBuffer(BitmapBufferAccessMode::ReadWrite);

    unsigned char* pPixels = GetPointerToPixelData(bmpBuffer->CreateReference());

    Mat mat(from->PixelHeight, from->PixelWidth, CV_8UC4);
    memcpy(mat.data, pPixels, 4 * from->PixelHeight * from->PixelWidth);

    return mat;
}

SoftwareBitmap^ Convert(Mat from)
{
    SoftwareBitmap^ sBitmap = ref new SoftwareBitmap(BitmapPixelFormat::Bgra8, from.cols, from.rows, BitmapAlphaMode::Ignore);
    BitmapBuffer^ bmpBuffer = sBitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite);
    auto reference = bmpBuffer->CreateReference();

    unsigned char* dstPixels = GetPointerToPixelData(reference);
    memcpy(dstPixels, from.data, from.step.buf[1] * from.cols*from.rows);

    return sBitmap;
}

unsigned char* GetPointerToPixelData(IBuffer^ buffer)
{
    ComPtr<IBufferByteAccess> bufferByteAccess;
    ComPtr<IInspectable> insp((IInspectable*)buffer);
    ThrowIfFailed(insp.As(&bufferByteAccess));

    unsigned char* pixels = nullptr;
    ThrowIfFailed(bufferByteAccess->Buffer(&pixels));

    return pixels;
}

unsigned char* GetPointerToPixelData(IMemoryBufferReference^ reference)
{
    ComPtr<IMemoryBufferByteAccess> bufferByteAccess;

    ThrowIfFailed(reinterpret_cast<IInspectable*>(reference)->QueryInterface(IID_PPV_ARGS(&bufferByteAccess)));

    unsigned char* pixels = nullptr;
    unsigned int capacity = 0;
    ThrowIfFailed(bufferByteAccess->GetBuffer(&pixels, &capacity));

    return pixels;
}

2 个答案:

答案 0 :(得分:1)

由于您没有发布从/向SoftwareBitmap / cv :: Mat进行实际转换的代码。

我最好的猜测是显示3通道图像数据,就好像有4个通道一样。

答案 1 :(得分:0)

好的,我找到了解决方案。

onPageSelected