文章目录

  • 一、YUV422SP的存储方式
  • 二、YUV422SP的旋转
  • 三、旋转代码
  • 四、优化点一
  • 四、优化点二

一、YUV422SP的存储方式

YUV422SP属于平面格式(Planar),它的 YUYV 格式在内存中的存储方式为:YUYV YUYV YUYV …,Y为亮度信息,UV为色度信息,YUV422 是每两个像素点共用一对UV分量,每个像素点的Y分量是独立的,UV分量是共享的,所以一幅 YUV422 图像的总的字节数为:

     totalBytes = Width * Height + Width * Height  / 2 + Width * Height / 2 = Width * Height * 2

二、YUV422SP的旋转

YUV422SP是两个Y值共享一组UV,那么旋转后,还得是两个Y值共享一组UV。因此在进行旋转操作是必须满足 YUYV 的结构不变,即4个字节为一组;保证Y分量在相应的位置上,否则会产生颜色不对、锯齿等

三、旋转代码

下述程序是直接粗暴旋转90°,如果是420,可以这样操作,但是这是422,因此旋转得到的yuv图像和原图比较是错误的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define    rotateFile      "rotate.yuv"
#define     sourceFile      "out.yuv"int main()
{FILE *file = NULL;FILE *yuv = NULL;int imgWidth = 1920;int imgHeight = 1080;int i = 0, j = 0;char filename[64] = {0};snprintf(filename, sizeof(filename), rotateFile);//输出旋转图像file = fopen(filename, "w");if (NULL == file){printf("open file(%s) failed!\n", rotateFile);return 0;}//待旋转图像yuv = fopen(sourceFile, "r");if (NULL == yuv){printf("open file(%s) failed!\n", sourceFile);return 0;}char *srcimg, *dstimg;//开辟内存dstimg = (char *)malloc(imgWidth * imgHeight * 2);      //yuv422if(NULL == dstimg){printf("malloc memory for %s faild!\n", dstimg);return 0;}srcimg = (char *)malloc(imgWidth * imgHeight * 2);        //yuv422if(NULL == srcimg){printf("malloc memory for %s faild!\n", srcimg);return 0;}//读取待旋转图像yuv422数据if((imgWidth * imgHeight *2) != fread(srcimg, 1, imgWidth * imgHeight * 2, yuv)){printf("Read image1 faild!\n");return -1;}//旋转90度printf("rotate yuv........\n");for (i = 0; i < imgWidth; i++) {for (j = imgHeight - 1; j >= 0; j--){dstimg[i] = srcimg[j * imgWidth + i];i++;}}//写入文件for (i = 0; i < imgWidth; i++){fwrite(dstimg, 1, imgWidth*2, file);dstimg += imgWidth*2;}return 0;
}

四、优化点一

如三所示,旋转后使得以前垂直相邻的Y像素点变成了水平相邻,而水平相邻的Y像素点需要共享UV数据,但是旋转前这两个像素点没有任何关系,也就是根本没有这个UV值数据,所以这种粗暴的旋转是错误的。

可以把YUV422的旋转,当做YUV420一样进行旋转,即4个Y值,共享一组UV,这样旋转后,会损失一般的色度值,但是画面不会出错。

四、优化点二

可以先将422转换为420,然后再去旋转90°,这样就不存在422旋转后像素之间没有关系的问题了。
相关文章在本专栏后面几篇文章

三、YUV422SP图像旋转相关推荐

  1. python-opencv 图像平移旋转变换、以及图像旋转前后坐标值映射关系

    图像的平移,旋转变换以及仿射与投影都需要先定义转换矩阵,然后使用cv2.warpAffine()根据变换矩阵完成转换 imgRotation = cv2.warpAffine(img, mat,(wi ...

  2. OpenCV中图像旋转(warpAffine)算法的实现过程

    在OpenCV中,目前并没有现成的函数直接用来实现图像旋转,它是用仿射变换函数cv::warpAffine来实现的,此函数目前支持4种插值算法,最近邻.双线性.双三次.兰索斯插值,如果传进去的参数为基 ...

  3. 经验 | OpenCV图像旋转的原理与技巧

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|OpenCV学堂 01 引言 初学图像处理,很多人遇到的 ...

  4. OpenCV图像旋转的原理与技巧

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自|OpenCV学堂 01 引言 初学图像处理,很多人遇到的第一 ...

  5. 应用OpenCV进行图像旋转和平移

    简 介: 本文中,你了解了了如何通过OpenCV完成对于图像的旋转和平移.我们首先通过 getRotationMatrix2D() 获取2D旋转矩阵,然后完成了对于图像的旋转.具体是通过warpAff ...

  6. 【Android RTMP】NV21 图像旋转处理 ( 快速搭建 RTMP 服务器 Shell 脚本 | 创建 RTMP 服务器镜像 | 浏览器观看直播 | 前置 / 后置摄像头图像旋转效果展示 )

    文章目录 安卓直播推流专栏博客总结 一. 编写快速搭建 RTMP 服务器 Shell 脚本 二. RTMP 快速搭建方法 三.创建阿里云 RTMP 服务器镜像 四.浏览器查看直播内容 五.前置 / 后 ...

  7. 【Android RTMP】NV21 图像旋转处理 ( 图像旋转算法 | 后置摄像头顺时针旋转 90 度 | 前置摄像头顺时针旋转 90 度 )

    文章目录 安卓直播推流专栏博客总结 一. 后置摄像头顺时针旋转 90 度 二. 前置摄像头顺时针旋转 90 度 三. NV21 格式图像旋转代码 安卓直播推流专栏博客总结 Android RTMP 直 ...

  8. 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )

    文章目录 安卓直播推流专栏博客总结 一. NV21 图像格式与 Camera图像传感器方向问题 二. NV21 图像格式视频旋转 1. 图像旋转问题及解决方案 ( 顺时针旋转 90 度 ) 2. NV ...

  9. 数据增强之图像旋转及坐标对应(附代码)

    海康威视研究院ImageNet2016竞赛经验分享 深度学习之图像的数据增强 data augmentation 数据增强方法总结 图片的数据增强(Data Augmentation)方法 openc ...

  10. opencv 图像旋转_用Dlib和OpenCV还能做什么?这个开源项目实现了驾驶员疲劳检测...

    Dlib 和 OpenCV 这两个库已经在深度学习和人脸识别领域逐渐有了自己的一席之地,基于它们的各种开源项目的越来越多,今天 Gitee 上这个开源项目也是基于 Dlib 和 OpenCV 的,具体 ...

最新文章

  1. 基于CAP模型设计企业级真正高可用的分布式锁
  2. SQL Server 一些使用小技巧
  3. Linkedin Cruise Control安装
  4. 海底光缆——你不知道的秘密!
  5. 技术面试问项目难题如何解决的_同轴线如何当网线使用?解决改造项目中难题...
  6. 《大型网站架构技术》系列分享专栏
  7. C#图解教程读书笔记(结构)
  8. matlab中提示错误使用* BLAS loading error解决方法
  9. 基于Python的DBC转Excel脚本
  10. Vue 引入阿里巴巴矢量图标库 (详细)
  11. Java OCR tess4j 图片识别技术(三)
  12. 数据库服务器使用的RAID存储架构初步介绍
  13. 再生龙移植ubuntu硬盘大小限制解决方案
  14. myecplice和ecplice远程调试
  15. C# 调用Office Excel 接口方法Quit(),但是Excel进程不退出的解决办法
  16. 升压电路(Boost)的设计原理、参数计算及MATLAB仿真
  17. windows下同一个显卡配置多个CUDA工具包以及它们之间的切换
  18. 使用Vmware虚拟机装载Linux系统如何联网
  19. WAV 文件格式分析
  20. 【Unity3D读取数据】(一)Txt文档操作(创建、读取、写入、修改)

热门文章

  1. mac系统安装spss
  2. 2008考研数学辅导讲义理工类高等数学部分-蔡燧林
  3. 【数学-常用公式】基本积分表
  4. C++ 偏微分数值计算库_「首席架构师推荐」数值分析软件精选
  5. 局域网文件传输工具---LANDrop 使用记录
  6. 光环PMP 二模错题知识点
  7. 做一个有批判性思维的程序员!
  8. 德标螺纹规格对照表_德标等螺纹对照表
  9. c语言立体爱心会跳动,c语言编程实例——小球跳动
  10. sybase默认数据库