NV21 图像旋转处理 ( 后置摄像头顺时针旋转 90 度 | 前置摄像头顺时针旋转 90 度 )
1 . NV21 格式圖像數據的排列 : 16 1616 個 Y 灰度數據在前 , 然后 4 44 組 ( 8 88 個 ) VU 色彩值 , 飽和度 , 數據交替存放 ;
2 . NV21 格式的圖像的 YUV 值順時針旋轉 90 度后的 YUV 矩陣為 :
3 . 灰度值 Y 數據讀取順序 :
① 外層循環 :?逐行遍歷, 從第一行遍歷到最后一行, 從 0 到 mWidth - 1 ;
② 內存循環 :?遍歷每一行時, 從底部遍歷到頂部, 從 mHeight - 1 到 0 ;
for (int i = 0; i < mWidth; i++) {// 第 i 行, 從每一列的最后一個像素 ( 索引 mHeight - 1 ) 遍歷到第一個像素 ( 索引 0 )for (int j = mHeight - 1; j >= 0; j--) {// 將讀取到的 Y 灰度值存儲到 mNv21DataBuffer 緩沖區中mNv21DataBuffer[positionIndex++] = data[mWidth * j + i];} }?
4 . 飽和度 色彩值 UV 數據讀取順序 :
① 數據高度個數 : Y 數據的高度與圖像高度相等 , UV 數據高度相當于 Y 數據高度的一半 ;
② UV 數據排列 : V 色彩值在前, U 飽和度在后, UV 數據交替排列 , 一行 mWidth 中, 排布了 mWidth / 2 組 UV 數據 ;
③ UV 數據組有 mWidth / 2 行, mHeight / 2 列, 因此遍歷時, 有如下規則 :
按照行遍歷 : 遍歷 mWidth / 2 次
按照列遍歷 : 遍歷 mHeight / 2 次
④ 外層遍歷 : 每隔 2 行, 遍歷一次, 遍歷 mWidth / 2 次 ; 遍歷行從 0 到 mWidth / 2 - 1 ;
⑤ 內層遍歷 : UV 數據也需要倒著讀 , 從 mHeight / 2 - 1 遍歷到 0 ;
?
二、 前置攝像頭順時針旋轉 90 度
1 . NV21 格式圖像數據的排列 : 16 1616 個 Y 灰度數據在前 , 然后 4 44 組 ( 8 88 個 ) VU 色彩值 , 飽和度 , 數據交替存放 ;
?
2 . NV21 格式的圖像的 YUV 值逆時針旋轉 90 度后的 YUV 矩陣為 :
?
?
3 . 灰度值 Y 數據讀取順序 :
① 外層循環 :?逐行遍歷, 從最后一行遍歷到第一行, 從 mWidth - 1 到 0 ;
② 內存循環 :?遍歷第 i 行時, 從頂部遍歷到底部, 從 0 到 mHeight - 1
?
for (int i = mWidth - 1; i >= 0; i--) {// 第 i 行, 從每一列的最后一個像素 ( 索引 mHeight - 1 ) 遍歷到第一個像素 ( 索引 0 )for (int j = 0; j < mHeight; j++) {// 將讀取到的 Y 灰度值存儲到 mNv21DataBuffer 緩沖區中mNv21DataBuffer[positionIndex++] = data[mWidth * j + i];} }?
4 . 飽和度 色彩值 UV 數據讀取順序 :
① 數據高度個數 : Y 數據的高度與圖像高度相等 , UV 數據高度相當于 Y 數據高度的一半 ;
② UV 數據排列 : V 色彩值在前, U 飽和度在后, UV 數據交替排列 , 一行 mWidth 中, 排布了 mWidth / 2 組 UV 數據 ;
③ UV 數據組有 mWidth / 2 行, mHeight / 2 列, 因此遍歷時, 有如下規則 :
按照行遍歷 : 遍歷 mWidth / 2 次
按照列遍歷 : 遍歷 mHeight / 2 次
④ 外層遍歷 : 每隔 2 行, 遍歷一次, 遍歷 mWidth / 2 次 ; 遍歷行從mWidth / 2 - 1 到 0 ;
⑤ 內層遍歷 : UV 數據也需要倒著讀 , 從 0 遍歷到 mHeight / 2 - 1 ;
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的NV21 图像旋转处理 ( 后置摄像头顺时针旋转 90 度 | 前置摄像头顺时针旋转 90 度 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《从道法术器分层看待计算机科学与技术》
- 下一篇: input标签自动获取焦点