Toybrick

openvc的数据与 RGA 配合去做letterbox预处理的一些问题

IAMPLUS

注册会员

积分
66
发表于 2022-2-17 17:04:18    查看: 1998|回复: 3 | [复制链接]    打印 | 显示全部楼层
如题,我现在想把letterbox预处理用RGA处理
目前RGA能处理的步骤只有resize和copyMakeBorder,

Mat Liner_shrink;
    if(shape[0] != new_unpad[1] && shape[1] != new_unpad[0]){
        cv::resize(im, Liner_shrink, Size(new_unpad[0], new_shape[1]), 0, 0, INTER_LINEAR);
    }
    int top = int(round(dh - 0.1));
    int bottom =  int(round(dh + 0.1));
    int left = int(round(dw - 0.1));
    int right =  int(round(dw + 0.1));
    int newSize [2] = {dw, dh};

    copyMakeBorder(im, Liner_shrink, top, bottom, left, right, BORDER_CONSTANT, color);
我有两个问题:
1.如果resize操作可以用setDstFormat重新设定输出的大小,那么copyMakeBorder怎么操作呢?用fill填充吗?
2.cv:Mat数据怎么转成RGA可以使用的srcBuffer呢?转出来的dstBuffer又怎么再保存成cv:Mat文件呢?
若能有demo更好,望大佬解答~



回复

使用道具 举报

bob286

中级会员

积分
299
发表于 2022-2-17 17:28:49 | 显示全部楼层
1. 你这种做法用RGA其实没有太大收益的,最好是在前面resize的时候就一步到位,直接resize到目标宽度(这样left和right为0)。然后中间部分的数据内存连续,用RGA效率就提升很多。
2. cv:Mat有指针成员data,就可以作为srcBuffer/dstBuffer(需自行确保数据内存大小)。
回复

使用道具 举报

IAMPLUS

注册会员

积分
66
 楼主| 发表于 2022-2-17 20:23:00 | 显示全部楼层
bob286 发表于 2022-2-17 17:28
1. 你这种做法用RGA其实没有太大收益的,最好是在前面resize的时候就一步到位,直接resize到目标宽度(这样 ...

好的,谢谢我再试一下把
回复

使用道具 举报

IAMPLUS

注册会员

积分
66
 楼主| 发表于 2022-2-21 15:22:03 | 显示全部楼层
bob286 发表于 2022-2-17 17:28
1. 你这种做法用RGA其实没有太大收益的,最好是在前面resize的时候就一步到位,直接resize到目标宽度(这样 ...

大哥,有没有第二条 的代码demo呢?我感觉我的操作有问题,但是又不知道改怎么写
int oldFrameSize = im.cols * im.rows *img_bgr_c;
    int newFrameSize = new_unpad[0] * new_shape[1] * img_bgr_c;

    unsigned char *srcBuffer[oldFrameSize];
    unsigned char *dstBuffer[newFrameSize];
   
    memcpy(srcBuffer, im.data, oldFrameSize);

    Mat Liner_shrink;
    if(shape[0] != new_unpad[1] && shape[1] != new_unpad[0]){
        RockchipRga *mRga;
        mRga->ops->initCtx(mRga);
        mRga->ops->setSrcFormat(mRga, V4L2_PIX_FMT_ABGR32, shape[0], shape[1]);
        mRga->ops->setDstFormat(mRga, V4L2_PIX_FMT_ABGR32, new_unpad[0], new_shape[1]);

        mRga->ops->setSrcBufferPtr(mRga, srcBuffer);
        mRga->ops->setDstBufferPtr(mRga, dstBuffer);

        mRga->ops->go(mRga);
        // cv::resize(im, Liner_shrink, Size(new_unpad[0], new_shape[1]), 0, 0, INTER_LINEAR);
    }
    memcpy(Liner_shrink.data, dstBuffer, newFrameSize);

    int top = int(round(dh - 0.1));
    int bottom =  int(round(dh + 0.1));
    int left = int(round(dw - 0.1));
    int right =  int(round(dw + 0.1));
    int newSize [2] = {dw, dh};

    copyMakeBorder(im, Liner_shrink, top, bottom, left, right, BORDER_CONSTANT, color);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表