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);
Другие вопросы по тегам