nv21(yuv420sp)水平镜像翻转实现

输入数据是yuv,输出是flipyuv, uv分量是交替存储,uvsize刚好是height/2 * width, 下面的实现没有考虑stride的情况。

void CvtNV21FlipH(Mat& mYUV, Mat& mflipYUV) {
    int width = mYUV.cols;
    int height = mYUV.rows;

    // flip Y data
    for (int j = 0; j < height; j++) {
        uint8_t* ydata = mYUV.data + (j+1)*width;
        uint8_t* flipYdata = mflipYUV.data + j*width;
        for (int i = 0; i < width; i++) {
            int idx = width - 1 - i;
            flipYdata[i] = ydata[idx];
        }
    }

    //flip VU data
    int yLen = width * height;
    for (int j = 0; j < height/2; j++) {
        uint8_t* vu = mYUV.data + yLen + (j+1)*width;
        uint8_t* flipVU = mflipYUV.data + yLen + j*width;
        for (int i = 0; i < width; i+=2) {
            int idx = width - 2 - i;
            flipVU[i] = vu[idx];
            flipVU[i+1] = vu[idx+1];
        }
    }
}


下面的实现加上stride参数

因为是nv21, yvu420sp格式,vstride实际上是vu数据一行的宽度(width + stride), ystride就是Y分量一行的宽度(width + stride)

ystride = width + stride
vstride  = width + stride;

输入参数h,w是输入图像的实际宽和高,矩阵的rows = h+h/2, cols = ystride,ystride大于等于w.

void CvtNV21FlipH(Mat& mYUV, int h, int w, int ystride, int ustride, int vstride, Mat& mflipYUV) {
    int width = mYUV.cols;
    int height = mYUV.rows;

    // flip Y data
    for (int j = 0; j < h; j++) {
        uint8_t* ydata = mYUV.data + (j+1)*ystride;
        uint8_t* flipYdata = mflipYUV.data + j*ystride;
        for (int i = 0; i < w; i++) {
            int idx = w - 1 - i;
            flipYdata[i] = ydata[idx];
        }
    }
     //flip VU data
    int yLen = ystride * h;
    for (int j = 0; j < h/2; j++) {
        uint8_t* vu = mYUV.data + yLen + (j+1)*vstride;
        uint8_t* flipvu = mflipYUV.data + yLen + j*vstride;
        for (int i = 0; i < w; i+=2) {
            int idx = w - 2 - i;
            flipvu[i] = vu[idx];
            flipvu[i+1] = vu[idx+1];
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值