【问题标题】:VisionWorks create Mat vx_image from MatVisionWorks 从 Mat 创建 Mat vx_image
【发布时间】:2016-04-14 05:36:12
【问题描述】:

我遵循 opencv_npp_interop 示例作为将 OpenCv Mat 转换为 vx_image 的参考,但该示例仅显示灰度图像(单通道)。所以我尝试将 3 通道 (RGB) Mat 修改为 vx_image (RGB)。

vx_image createRGBImageFromRGBMat(vx_context& context, cv::Mat& mat)
{
    vx_imagepatch_addressing_t src_addr = {
        mat.cols, mat.rows, sizeof(vx_uint8)*3, mat.cols * sizeof(vx_uint8)*3, VX_SCALE_UNITY, VX_SCALE_UNITY, 1, 1 };
    void* src_ptr = mat.data;

    vx_image image = vxCreateImageFromHandle(context, VX_DF_IMAGE_RGB, &src_addr, &src_ptr, VX_IMPORT_TYPE_HOST);

    return image;
}

如果我查询返回的 vx_image 的平面数属性,我只显示 1 个平面。而我假设它应该是 3 平面 (RGB)。

其次,如果我现在将这个返回的所谓 RGB 图像转换为 YUV 并查询平面,我会得到 3 个平面,但是当我提取单独的通道时,我只能提取“Y”通道,其他两个 vxuChannelExtract 调用会导致“-10 : 无效参数”。

所以我假设问题的根源仍然是 RGB 转换。我做错了什么?

【问题讨论】:

  • 请提供重现问题的完整代码。一般来说,您的代码看起来是正确的,但使用 mat.step 而不是 mat.cols * sizeof(vx_uint8)*3 会更安全。
  • 顺便说一句,RGB只有一个平面,因为它是交错格式。
  • 请注意,对于某些 YUV 格式,U 和 V 平面的尺寸小于 Y 平面。

标签: opencv openvx


【解决方案1】:

在文档中,RGB 格式只有一个平面

VX_DF_IMAGE_RGB - 一个 24 位像素的单一平面,作为 3 个交错的 8 位单元,R 然后 G 然后 B 数据。

也许你为 YUV 通道指定了错误的枚举,我已经成功了:

vx_image image = createRGBImageFromRGBMat(context, mat);
vx_image yuv = vxCreateImage(context, mat.cols, mat.rows, VX_DF_IMAGE_YUV4);
vxuColorConvert(context, image, yuv);
vx_image y = vxCreateImage(context, mat.cols, mat.rows, VX_DF_IMAGE_U8);
vx_image u = vxCreateImage(context, mat.cols, mat.rows, VX_DF_IMAGE_U8);
vx_image v = vxCreateImage(context, mat.cols, mat.rows, VX_DF_IMAGE_U8);

vxuChannelExtract(context, yuv, VX_CHANNEL_Y, y);
vxuChannelExtract(context, yuv, VX_CHANNEL_U, u);
vxuChannelExtract(context, yuv, VX_CHANNEL_V, v);

【讨论】:

    猜你喜欢
    • 2017-03-01
    • 2014-06-28
    • 2010-12-04
    • 2018-04-17
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多