文章目录

  • 一、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. ssh可以连接但sftp不可以连接解决方案
  2. leetcode 7整数反转和leetcode 9回文数
  3. 磁盘配额 挂载 和yum源的配置
  4. 微服务:实战从传统项目平滑过渡 - 笔记
  5. 在Linux上离线安装SQL Server 2017
  6. 在eclipse环境下配置OpenCV环境
  7. c语言----斐波那契数列
  8. 漫画追踪器Tracker
  9. Ultra Fast Deep Lane Detection with Hybrid Anchor Driven Ordinal Classification论文解读
  10. 基于ResNetRS的宝可梦图像识别
  11. 哈佛结构冯·诺依曼结构
  12. pde与波长 sipm 关系_基于SiPM和TCMPC的时间分辨拉曼散射测量技术研究
  13. java 适合练手的java项目
  14. 乐普生物通过港交所聆讯:在研4种核心产品,平安等为股东
  15. 在线查询12306账号是否泄露
  16. SQLSERVER存储过程语法详解
  17. 金山词霸企业版VS谷歌版
  18. 360安全卫士真恶心,再也不用了
  19. 在学习web安全的小白看过来,这本《白帽子讲web安全》强烈推荐,必读!(附PDF)
  20. 浅谈网络编程中的常见问题

热门文章

  1. Linux平台升级chrome浏览器后,再打开会提示:“您的个人资料来自新版 Google Chrome 浏览器,因此无法使用。某些功能可能无法使用。请指定其他个人资料目录,或使用新版本”
  2. date日期格式化 java,Java日期格式化常用方法
  3. Eucalyptus简介
  4. C语言中的常见关键字
  5. jeb安装教程_JEB2插件教程之一
  6. 微管理——给你一个技术团队,你该怎么管
  7. IEEE极限编程练习:Sorting Partition
  8. android测试用例编写
  9. php goeasy,如何使用GoEasy实现PHP与Websocket实时通信
  10. python--查询PG数据库