利用libyuv实现I420、NV12、NV21的resize

本文介绍了如何利用libyuv库进行I420、NV12和NV21格式的图像resize。详细讲述了自定义结构过程,包括I420的简单resize以及NV12和NV21的resize方法,通过分离UV、resize UV后再合并来实现。并附带了resize前后的图片对比。
摘要由CSDN通过智能技术生成

首先自定义定义的结构

class Scaler {
  struct Buffer {
    uint32_t width, height;
    uint8_t *data[3];
    uint32_t stride[3];
    ColorFormat color;
  };
  enum ColorFormat {
    YUV_I420 = 0,
    YUV_NV21,
    YUV_NV12,
    BGR ,
    RGB ,
    BGRA,
    RGBA,
    ABGR,
    ARGB,
  };
void Scaler::LibyuvResize_NV21(const Buffer *src,
                             Buffer *dst); 
void Scaler::LibyuvResize_I420(const Buffer *src,
                               Buffer *dst);
};

1、I420的resize

这个最简单,libyuv中提供现成的接口

void Scaler::LibyuvResize_I420(const Buffer *src,
                               Buffer *dst) {
  // you should make complete info of buffer src, stride data width height 
  dst->stride[0] = dst->width;
  dst->stride[1] = dst->width >> 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用OpenCV库中的cv::resize函数来进行缩放操作。具体的操作步骤如下: 1. 读取NV12格式的图像数据,可以通过cv::imdecode函数将NV12数据解码为BGR格式的图像。 2. 将BGR格式的图像转换为灰度图像,可以使用cv::cvtColor函数。 3. 使用cv::resize函数对灰度图像进行缩放操作,同时保持NV12格式的数据结构。 下面是一段代码示例: ```cpp // 读取NV12数据 std::vector<uchar> nv12_data; // NV12数据 int width, height; // 图像宽度和高度 // 读取NV12数据... // ... // 解码NV12数据为BGR格式的图像 cv::Mat bgr_img = cv::imdecode(nv12_data, cv::IMREAD_COLOR); // 转换为灰度图像 cv::Mat gray_img; cv::cvtColor(bgr_img, gray_img, cv::COLOR_BGR2GRAY); // 缩放灰度图像,并保持NV12数据结构 int dst_width = width / 2; // 缩放后的宽度 int dst_height = height / 2; // 缩放后的高度 cv::Mat dst_img(dst_height * 3 / 2, dst_width, CV_8UC1); // 目标图像 cv::resize(gray_img, dst_img(cv::Rect(0, 0, dst_width, dst_height)), cv::Size(dst_width, dst_height)); // 将缩放后的灰度图像转换为NV12格式的数据 std::vector<uchar> dst_nv12_data(dst_height * dst_width * 3 / 2); // 目标NV12数据 uchar* p_dst_y = &dst_nv12_data[0]; // 目标Y分量 uchar* p_dst_uv = p_dst_y + dst_height * dst_width; // 目标UV分量 uchar* p_src_y = dst_img.data; // 源Y分量 uchar* p_src_uv = p_src_y + dst_height * dst_width; // 源UV分量 for (int i = 0; i < dst_height; i++) { memcpy(p_dst_y, p_src_y, dst_width); p_dst_y += dst_width; p_src_y += dst_img.step; } for (int i = 0; i < dst_height / 2; i++) { memcpy(p_dst_uv, p_src_uv, dst_width); p_dst_uv += dst_width; p_src_uv += dst_img.step; } ``` 其中,dst_img是缩放后的灰度图像,dst_nv12_data是缩放后的NV12格式的数据。注意,在NV12格式中,Y分量和UV分量交错存储,所以需要分别处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值