opencv 缩放NV12

#define PIC_TOTAL_HEIGHT	384
#define PIC_VALID_HEIGHT	360

bool ReadAbsolutePathFile(const char* pAbsolutePath, const char* pMode, unsigned char* pData/*out*/, long& nLen)
{
    if (!pAbsolutePath || !pMode || !pData) {
        return false;
    }

    FILE* pFile = fopen(pAbsolutePath, pMode);
    if (pFile) {
        fseek(pFile, 0, SEEK_END);
        nLen = ftell(pFile);
        fseek(pFile, 0, SEEK_SET);
        nLen = fread(pData, 1, nLen, pFile);
        fclose(pFile);
        return true;
    }
    return false;
}

int main()
{
    unsigned char* pData = new unsigned char[1920 * 1080 * 3];

    int nWidth = 1920;
    int nHeight = 1080;
    cv::Mat stNv12_1920x1080(nHeight * 1.5, nWidth, CV_8UC1);

    long nLen1920x1080 = 0;
    ReadAbsolutePathFile("D:\\ImageToNv12\\1920x1080.yuv", "rb+", pData, nLen1920x1080);

    memcpy(stNv12_1920x1080.data, pData, nLen1920x1080);


    cv::Mat stNv12_640x360(PIC_VALID_HEIGHT * 1.5f, 640, CV_8UC1);
    cv::resize(stNv12_1920x1080, stNv12_640x360, stNv12_640x360.size());//在windows下测试, 发现 resize 函数使用后会将NV12转成NV21了

    for (int i = 640 * PIC_VALID_HEIGHT; i < 640 * PIC_VALID_HEIGHT * 3 / 2; i += 2) {//直接将VU分量改成UV分量
        int nTemp = stNv12_640x360.data[i];
        stNv12_640x360.data[i] = stNv12_640x360.data[i + 1];
        stNv12_640x360.data[i + 1] = nTemp;
    }
    delete[] pData;
    pData = NULL;
}

将1920*1080的NV12缩放成640*360大小的NV12

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值