gpt4 book ai didi

c# - WinRT C++(Win10)、opencv HSV色彩空间、图像显示、神器

转载 作者:行者123 更新时间:2023-12-02 17:46:28 27 4
gpt4 key购买 nike

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

我有一个 UWP c# 应用程序和链接的 c++ windows 运行时组件。在那里我可以获得对 opencv 的访问权限。

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

  • 这就是我所拥有的 screen

    如果我跳过 cvtColor部分,然后转换为 cv::Mat 并返回到 SoftwareBitmap,结果我得到了一个很好的图像......

    我知道图像的 channel 有问题......但我已经失去了挖掘的地方。
    我假设 cv::Mat 在 cvtColor 之后是对的......但我想看看图片创作的中间步骤。 (HSV、阈值,然后是结果)

    任何意见,将不胜感激。

    附言
    我试过 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;
    }

    最佳答案

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

    我最好的猜测是 3 channel 图像数据显示为好像有 4 个 channel 。

    关于c# - WinRT C++(Win10)、opencv HSV色彩空间、图像显示、神器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34198259/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com