YUV420P旋轉演算法

2021-10-02 04:00:37 字數 4110 閱讀 6774

void flip_mat()

// yuv420protate.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

// clockwise 順時針

// contrarotate 逆時針旋轉

// flip horizontal 映象翻轉/水平翻轉

/*** 順時針旋轉90。

* 取元素:從左下方第乙個點開始,從下往上,從左往右取點;

* 放元素:從左上方第乙個位置開始放,從左往右,從上往下;把每一列轉換成每一行。

** @param yuvfileaname 一幀yuv420p格式的檔案

* @param width 影象的寬

* @param height 影象的高

** @return 空

*/void clockwiserotate90(const char* yuvfileaname, int width, int height)

} //u

unsigned char* uheader = yuvbuf + width*height;

int hw = width / 2;

int hh = height / 2;

for (int i = 0; i <= hw - 1; i++)

} //v

unsigned char* vheader = uheader + width*height / 4;

for (int i = 0; i <= hw - 1; i++)

} file* fpout = null;

fopen_s(&fpout, "clockwiserotate90.yuv", "wb");

fwrite(dstbuf, width*height * 3 / 2, 1, fpout);

fclose(fpout);

delete yuvbuf;

delete dstbuf;

}/**

* 逆時針旋轉90。

* 取元素:從右上方第乙個點開始,從上往下,從右往左取點;

* 放元素:從左上方第乙個位置開始放,從左往右,從上往下;把每一列轉換成每一行。

* * @param yuvfileaname 一幀yuv420p格式的檔案

* @param width 影象的寬

* @param height 影象的高

** @return 空

*/void contrarotate90(const char* yuvfileaname, int width, int height)

} // rotate u

char *src_u = src + width*height;

for (p = 0; p < width / 2; p++)

} // rotate v

char *src_v = src + width*height * 5 / 4;

for (p = 0; p < width / 2; p++)

} file* fpout = null;

fopen_s(&fpout, "contrarotate90.yuv", "wb");

fwrite(dstbuf, width*height * 3 / 2, 1, fpout);

fclose(fpout);

delete yuvbuf;

delete dstbuf;

}/**

* 逆時針180。

* 取元素:從右下方第乙個點開始,從右往左,從下往上取點;

* 放元素:從左上方第乙個位置開始放,從左往右,從上往下;

** @param yuvfileaname 一幀yuv420p格式的檔案

* @param width 影象的寬

* @param height 影象的高

** @return 空

*/void contrarotate180(const char* yuvfileaname, int width, int height)

} //u

unsigned char* uheader = yuvbuf + width*height;

for (int i = height / 2 - 1; i >= 0; i--)

} unsigned char* vheader = uheader + width*height / 4;

//vfor (int i = height / 2 - 1; i >= 0; i--)

} file* fpout = null;

fopen_s(&fpout, "contrarotate180.yuv", "wb");

fwrite(dstbuf, width*height * 3 / 2, 1, fpout);

fclose(fpout);

delete yuvbuf;

delete dstbuf;

}/**

* 映象翻轉/水平翻轉

* 取元素:將右上角的點作為第乙個點,從右往左,從上往下取點;

* 放元素:從左上方第乙個位置開始放,從左往右,從上往下;

** @param yuvfileaname 一幀yuv420p格式的檔案

* @param width 影象的寬

* @param height 影象的高

** @return 空

*/void fliphorizontal(const char* yuvfileaname, int width, int height)

} //u

unsigned char* uheader = yuvbuf + width*height;

for (int i = 0; i < height / 2; i++)

} //v

unsigned char* vheader = uheader + width*height / 4;

for (int i = 0; i < height / 2; i++)

} file* fpout = null;

fopen_s(&fpout, "fliphorizontal.yuv", "wb");

fwrite(dstbuf, width*height * 3 / 2, 1, fpout);

fclose(fpout);

delete yuvbuf;

delete dstbuf;

}/**

* 逆時針旋轉180後,再水平翻轉/映象。

* 取元素:從左下方第乙個點開始,從左往右,從下往上取點;

* 放元素:從左上方第乙個位置開始放,從左往右,從上往下;

** @param yuvfileaname 一幀yuv420p格式的檔案

* @param width 影象的寬

* @param height 影象的高

** @return 空

*/void contrarotate180andfliphorizontal(const char* yuvfileaname, int width, int height)

} //u

unsigned char* uheader = yuvbuf + width*height;

for (int i = height / 2 - 1; i >= 0; i--)

} //v

unsigned char* vheader = uheader + width*height / 4;

for (int i = height / 2 - 1; i >= 0; i--)

} file* fpout = null;

fopen_s(&fpout, "contrarotate180andfliphorizontal.yuv", "wb");

fwrite(dstbuf, width*height * 3 / 2, 1, fpout);

fclose(fpout);

delete yuvbuf;

delete dstbuf;

}int _tmain(int argc, _tchar* ar**)

yuv420和yuv420p的區別

yv12和i420的區別 在採集到rgb24資料後,需要對這個格式的資料進行第一次壓縮。即將影象的顏色空間由rgb2yuv。因為,x264在進行編碼的時候需要標準的yuv 4 2 0 但是這裡需要注意的是,雖然yv12也是 4 2 0 但是yv12和i420的卻是不同的,在儲存空間上面有些區別。如下...

yuv420p 詳解 詳解SDL常用技術實戰 2

0.引言 詳解sdl常用技術實戰 1 示例 的基本功能就是從檔案中讀取yuv資料,然後通過sdl的介面,去40ms重新整理一幀資料。把這個重新整理事件放到執行緒佇列,由主線程去讀取,然後重新整理。本次程式是支援視窗的縮放。捕獲視窗大小變化的事件,然後根據視窗大小的變化,按照一定的比例去縮放就可以了。...

YUV420SP和YUV420SP32M的區別

在高通8916和8974平台上使用camera錄影的時候,錄影的格式是camera yuv 420 nv12。此格式對應的yuv格式是yuv420sp32m。yuv32sp對應的大小 w h 3 2 yuv420sp32m這樣的儲存方式對應的檔案儲存格式以及大小計算方式如下 ifndef media...