VisionWorks создает Mat vx_image из Mat
Я следую примеру 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. Что я сделал не так?
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);