关于RGB、YUV介绍可以参考 RGB 与YUV颜色模型及存储格式

1.covert RGB to NV21

void encodeYUV420sp(unsigned  char* yuv420sp, unsigned char* rgb, int width, int height)
{if (yuv420sp == NULL || rgb == NULL)return;int frameSize = width*height;int yIndex = 0;int uvIndex = frameSize;int R, G, B, Y, U, V;for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){B = rgb[(i * width + j) * 3 + 0];G = rgb[(i * width + j) * 3 + 1];R = rgb[(i * width + j) * 3 + 2];//RGB to YUVY = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;yuv420sp[yIndex++] = (unsigned char)((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));if (i % 2 == 0 && j % 2 == 0){yuv420sp[uvIndex++] = (unsigned char)((V < 0) ? 0 : ((V > 255) ? 255 : V));yuv420sp[uvIndex++] = (unsigned char)((U < 0) ? 0 : ((U > 255) ? 255 : U));}}}
}

2.covert RGB to YU12(I420)

void rgb_to_yuv420p(unsigned  char* yuv420p, unsigned char* rgb, int width, int height)
{if (yuv420p == NULL || rgb == NULL)return;int frameSize = width*height;int chromaSize = frameSize / 4;int yIndex = 0;int uIndex = frameSize;int vIndex = frameSize + chromaSize;int R, G, B, Y, U, V;for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){B = rgb[(i * width + j) * 3 + 0];G = rgb[(i * width + j) * 3 + 1];R = rgb[(i * width + j) * 3 + 2];//RGB to YUVY = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;yuv420p[yIndex++] = (unsigned char)((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));if (i % 2 == 0 && j % 2 == 0){yuv420p[uIndex++] = (unsigned char)((U < 0) ? 0 : ((U > 255) ? 255 : U));yuv420p[vIndex++] = (unsigned char)((V < 0) ? 0 : ((V > 255) ? 255 : V));}}}
}

3.covert NV21 to YU12(I420)

void yuv420sp_to_yuv420p(unsigned char* yuv420p,  unsigned char* yuv420sp, int width, int height) {if (yuv420sp == NULL || yuv420p == NULL)return;int framesize = width * height;int i = 0, j = 0;//copy Yfor (i = 0; i < framesize; i++) {*(yuv420p + i) = *(yuv420sp + i);}//copy Ui = 0;for (j = 1; j < framesize / 2; j += 2) {*(yuv420p + (i + framesize)) = *(yuv420sp + (j + framesize));i++;}//copy Vi = 0;for (j = 0; j < framesize / 2; j += 2) {*(yuv420p + (i + framesize * 5 / 4)) = *(yuv420sp + (j + framesize));i++;}
}

YUV其他存储格式的转换把上面的函数在UV赋值时变通一下即可。

测试

测试图片:

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace std;
using namespace cv;// show image
void showImage(String windowName, Mat img, int flag = 1)
{namedWindow(windowName, flag);//0: CV_WINDOW_NORMAL 1: WINDOW_AUTOSIZEimshow(windowName, img);waitKey(0);//destroyWindow(windowName);
}int main()
{Mat img_eye = imread("Sharingan_1.jpg");showImage("img_eye", img_eye);int height = img_eye.rows;int width = img_eye.cols;unsigned char* img_eye_bgr_data = (unsigned char*)malloc(height*width * 3 * sizeof(unsigned char));for (int i = 0; i < height; i++){unsigned char* current_row = img_eye.ptr<uchar>(i);for (int j = 0; j < width; j++){img_eye_bgr_data[(i * width + j) * 3 + 0] = current_row[j * 3 + 0];//Bimg_eye_bgr_data[(i * width + j) * 3 + 1] = current_row[j * 3 + 1];//Gimg_eye_bgr_data[(i * width + j) * 3 + 2] = current_row[j * 3 + 2];//R}}// 1. RGB covert to NV21unsigned char* img_eye_nv21_data = (unsigned char*)malloc(height*width * 3 / 2 * sizeof(unsigned char));encodeYUV420sp(img_eye_nv21_data, img_eye_bgr_data, width, height);Mat img_eye_nv21(height * 3 / 2, width, CV_8UC1, img_eye_nv21_data);// test Mat img_BGR(height, width, CV_8UC3);cvtColor(img_eye_nv21, img_BGR, CV_YUV2BGR_NV21);//CV_YUV420sp2BGRshowImage("img_BGR", img_BGR);// 2. RGB covert to YU12//类似,略去,使用CV_YUV2BGR_I420)或者CV_YUV2BGR_IYUV// 3. NV21 covert to YU12(I420)//类似,略去,return 0;
}

提示:如果把YUV420p的YU12和YV12或者被YUV420sp的NV12和NV21搞颠倒了,图片的红色和蓝色会颠倒。

类似如下:

RGB、YUV420p、YUV420sp之间的互相转换(C++)相关推荐

  1. 在C++Builder中可以利用FireMonkey的函数实现RGB与HSL之间的转换

    RGB转换为HSL的算法一般需要自己编写,但是在C++Builder中可以利用FireMonkey的函数实现RGB与HSL之间的转换. 下面是利用FireMonkey的RGBtoHSL和HSLtoRG ...

  2. 使用C++实现YUV格式图像与RGB格式图像之间相互转换

    使用C++实现YUV格式图像与RGB格式图像之间相互转换 一.RGB与YUV转换公式 1.RGB转YUV 1)RGB转换亮度与色差信号公试: 2)归一化为YUV的转化公试为: 2.YUV转RGB 二. ...

  3. Atitit  从 RGB 到 HSL 或 HSV 的转换

    Atitit  从 RGB 到 HSL 或 HSV 的转换 1.1. 从 RGB 到 HSL 或 HSV 的转换公式与原理1 1.2. public static HSV RGB2HSV(Color ...

  4. ID--HANDLE--HWND三者之间的互相转换

    利用PreTranslateMessage,响应按钮控件的按下(WM_LBUTTONDOWN)和松开(WM_LBUTTONUP)   VC的button控制只有两个事件,一个是单击事件,一个事双击事件 ...

  5. python str byte编码_Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题...

    Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str ...

  6. 如何在DOS/Windows和Linux/Unix之间进行文件格式转换?

    如何在DOS/Windows和Linux/Unix之间进行文件格式转换?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-c ...

  7. ID--HANDLE--HWND三者之间的互相转换(转)

    ID--HANDLE--HWND三者之间的互相转换 id->句柄.....hWnd = ::GetDlgItem(hParentWnd,id); id->指针.....CWnd::GetD ...

  8. OpenCV边缘之间的距离转换功能的实例(附完整代码)

    OpenCV边缘之间的距离转换功能的实例 OpenCV边缘之间的距离转换功能的实例 OpenCV边缘之间的距离转换功能的实例 #include <opencv2/core/utility.hpp ...

  9. 概率论-1.3 概率的性质(重点:可列与极限之间的互相转换)

    概率的公理化定义:非负性.正则性.可列可加性 P(整个样本空间)=1 整个样本空间=整个样本空间+空集+空集+- 由可列可加性可得 推出P(整个样本空间)= P(整个样本空间)+ P(空集)+ P(空 ...

最新文章

  1. 您如何计算字符串中字符串(实际上是字符)的出现?
  2. Linux学习路径(小白必看)
  3. 提取验证码到winform上webbroswer和axwebbroswer
  4. jzoj3792,P2062-分队问题【贪心】
  5. python抛硬币代码_求助python掷硬币
  6. 软件质量模型(学习笔记)
  7. Word2Vec在中文的应用
  8. 推理 —— 猜帽子颜色
  9. net软件安装后不能卸载的解决方法
  10. Android Dialog的简单说明
  11. Python 自动识别图片文字—保姆级OCR实战教程
  12. docker的离线安装方法和网络源安装方法、内网环境linux脚本批量安装docker、安装docker-compose
  13. 【绘制关系网络图】Gephi 入门使用
  14. python之股票数据分析
  15. C++ 面向对象高级开发(侯捷)
  16. 在oracle存储过程中创建临时表
  17. c语言模拟走迷宫课程程序设计报告,《C语言程序设计》走迷宫游戏程序设计.doc...
  18. returned a response status of 405 Method Not Allowed
  19. 邓白氏编码申请最后提交资料格式
  20. arm编译安装php启动,在 ARM 设备上手工编译 LNMP 编译到心态爆炸

热门文章

  1. 类的学习Java写查询星座小程序
  2. Eclipse RCP开发桌面程序
  3. 如何在前端编码时实现人肉双向编译
  4. Popular Cows POJ 2186(强连通分解)
  5. nohup: 忽略输入 Error: Unable to access jarfile【已解决】
  6. 第七届蓝桥杯本科B组省赛 最大比例
  7. 微信小程序开发工具模拟器不显示鼠标问题【推荐两方案】
  8. android 7.1 权限自动授权(不弹出授权对话框)
  9. ICASSP2022论文阅读记录3 - TalkingFlow
  10. java里面自行车的属性_Java模拟自行车电动车属性调用