NV21图片格式深入解析与代码实战-RGB转NV21与画框

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

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 Y

Y Y   Y Y   Y Y   Y Y
Y Y   Y Y   Y Y   Y Y

V 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 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值