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...