1.NV21格式图片解析
NV21图像格式属于 YUV颜色空间中的YUV420SP格式
每四个Y分量共用一组U分量和V分量,Y连续排序,U与V交叉排序

重点总结
- uv交错模式
- 4Y共用一组uv(2个)
- 大小:UV= Y 的一半
排列方式如下
Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y YY Y Y Y Y Y Y Y
Y Y Y Y Y Y Y YV U V U V U V U
V U V U V U V U
2.RGB图片转NV21—逐像素
基本公式
-
yuv --> rgb
R = (298*Y + 411 * V - 57344)>>8 G = (298*Y - 101* U - 211* V+ 34739)>>8 B = (298*Y + 519* U- 71117)>>8 -
rgb --> yuv
Y= ( 66*R + 129*G + 25*B)>>8 + 16 U= (-38*R - 74*G + 112*B)>>8 +128 V= (112*R - 94*G - 18*B)>>8 + 128
c++代码
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
#include <fstream>
#include <string>
void RGB2NV21()
{
const char *filename = "yuv.yuv";
cv::Mat Img = cv::imread("RGB.jpg");
FILE *fp = fopen(filename,"wb");
if (Img.empty())
{
std::cout << "empty!check your image";
return;
}
int cols = Img.cols;
int rows = Img.rows;
int Yindex = 0;
int UVindex = rows * cols;
unsigned char* yuvbuff = new unsigned char[1.5 * rows * cols];
cv::Mat NV21(rows+rows/2, cols, CV_8UC1);
cv::Mat OpencvYUV;
cv::Mat OpencvImg;
cv::cvtColor(Img, OpencvYUV, CV_BGR2YUV_YV12);
int UVRow{
0 };
for (int i=0;i<rows;i++)
{
for (int j=0;j<cols;j++)
{
uchar* YPointer = NV21.ptr<uchar>(i);
int B = Img.at<cv::Vec3b>(i, j)[0];
int G = Img.at<cv::Vec3b>(i, j)[1];
int R = Img.at<cv::Vec3b>(i, j)[2];
//计算Y的值
int Y = (77 * R + 150 * G + 29 * B) >> 8;
YPointer[j] = Y;
yuvbuff[Yindex++] = (Y < 0) ? 0

本文详细介绍了NV21图像格式的特性,包括其YUV420SP的编排方式,以及如何将RGB图片转换为NV21格式,同时展示了如何在NV21图像上进行逐像素画框操作。
最低0.47元/天 解锁文章
611





