我遵循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转换。我做错了什么?
答案 0 :(得分:0)
在文档中,RGB格式只有一个平面
VX_DF_IMAGE_RGB - 一个24位像素的平面作为R的3个交错的8位单元,然后是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);