yuv数据(nv12和nv21)和RGB数据之间转换的c++代码

一、首先了解下nv12和nv21的数据排布

nv21

Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
V U V U
V U V U

nv21
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
U V U V
U V U V

主要就是UV的顺序不同,交互一下UV的位置就可以互换NV12和NV21.

二、bgr(rgb)转nv21(nv12)

一般手机等移动端的数据流格式都是yuv格式,而神经网络的输入一般都是rgb格式,所以需要进行转换,这里给出c++的代码示例。

cv::Mat bgr2yuv(cv::Mat &bgr)
{
    cv::Mat img_yuv_yv12;
    int height = bgr.rows;
    int width = bgr.cols;
    cv::Mat img_yuv(height * 3 / 2, width, CV_8UC1);
    cv::cvtColor(bgr, img_yuv_yv12, CV_BGR2YUV_YV12);
    memcpy(img_yuv.data, img_yuv_yv12.data, height * width);
    char *v = (char*)img_yuv_yv12.data + height * width;
    char *u = v + height * width / 4;
    char *dst = (char*)im

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
RGBNV12 是将 RGB 格式的图像数据转换NV12 格式的图像数据。其中,NV12 是一种常见的 YUV 格式,常用于视频编码和视频传输。下面是一个简单的 C++ 代码实现 RGBNV12 的过程: ```c++ #include <vector> // 将 RGB 图像数据转换NV12 图像数据 void rgb2nv12(const unsigned char* rgb, int width, int height, std::vector<unsigned char>& nv12) { // 计算 YUV 图像数据的大小 int y_size = width * height; int uv_size = y_size / 2; // 分配内存空间 nv12.resize(y_size + uv_size); // RGBYUV for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int r = rgb[(i * width + j) * 3]; int g = rgb[(i * width + j) * 3 + 1]; int b = rgb[(i * width + j) * 3 + 2]; // 计算 Y 值 nv12[i * width + j] = static_cast<unsigned char>(0.299 * r + 0.587 * g + 0.114 * b); // 计算 U、V 值 if (i % 2 == 0 && j % 2 == 0) { nv12[y_size + (i / 2) * width + j] = static_cast<unsigned char>(-0.169 * r - 0.331 * g + 0.5 * b + 128); nv12[y_size + uv_size / 2 + (i / 2) * width + j] = static_cast<unsigned char>(0.5 * r - 0.419 * g - 0.081 * b + 128); } } } } ``` 这段代码中,我们首先计算了 YUV 图像数据的大小,然后分配了内存空间,接着使用双重循环遍历 RGB 图像数据,将 RGB转换YUV 值,并存储到 NV12 图像数据中。注意,NV12 图像数据中,UV 值的分辨率是 Y 值的一半,因此我们需要按照一定的规则将 UV 值存储到 NV12 图像数据中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值