简体   繁体   English

VisionWorks从Mat创建Mat vx_image

[英]VisionWorks create Mat vx_image from Mat

I am following the opencv_npp_interop example as reference to convert an OpenCv Mat to vx_image but the example only shows for greyscale image (single channel). 我遵循opencv_npp_interop示例作为将OpenCv Mat转换为vx_image的参考,但是该示例仅显示灰度图像(单通道)。 So I have tried to modify it for 3-channel (RGB) Mat to vx_image (RGB). 因此,我尝试将其用于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;
}

If I query number of planes attribute for the returned vx_image, I only shows 1 plane. 如果我查询返回的vx_image的planes数属性,则仅显示1个平面。 Whereas I am assuming it should be 3-plane (RGB). 而我假设它应该是3平面(RGB)。

Secondly, if I now convert this returned supposedly RGB image to YUV and query for planes, I get 3 planes but when I extract separate channels, I am only able to extract "Y" channel, other two vxuChannelExtract calls result in a "-10 : invalid params". 其次,如果现在将返回的RGB图像转换为YUV并查询平面,则会得到3个平面,但是当我提取单独的通道时,我只能提取“ Y”通道,另外两个vxuChannelExtract调用会导致“ -10” :无效的参数”。

So I am assuming the source of the problem is still the RGB conversion. 因此,我假设问题的根源仍然是RGB转换。 What did I do wrong ? 我做错了什么 ?

As in documentation RGB format has only one plane 如文档中RGB格式只有一个平面

VX_DF_IMAGE_RGB - A single plane of 24-bit pixel as 3 interleaved 8-bit units of R then G then B data. VX_DF_IMAGE_RGB-一个24位像素的平面,由3个交错的8位单元组成,R依次为G和B。

Maybe you specify wrong enum for YUV channels, I've succeeded with this: 也许您为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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM