當前位置:首頁 » 安卓系統 » androidyuvtorgb

androidyuvtorgb

發布時間: 2022-12-22 20:17:29

1. 如何將YUV轉換為RGB,最後變為UIImage顯示出來

-(void)decodeAndShow : (char*) buf length:(int)len
{

int ret = h264_decode(buf , len, (char*)pFrameRGB);
m_decodeFinish = NO;

//NSLog(@"decode ret = %d readLen = %d\n", ret, nFrameLen);
if(ret > 0)
{
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, pFrameRGB, nWidth*nHeight*3,kCFAllocatorNull);
CGDataProviderRef provider = (data);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGImageRef cgImage = CGImageCreate(nWidth,
nHeight,
8,
24,
nWidth*3,
colorSpace,
bitmapInfo,
provider,
NULL,
YES,
kCGRenderingIntentDefault);
CGColorSpaceRelease(colorSpace);
//UIImage *image = [UIImage imageWithCGImage:cgImage];
UIImage* image = [[UIImage alloc]initWithCGImage:cgImage]; //crespo modify 20111020
CGImageRelease(cgImage);
CGDataProviderRelease(provider);
CFRelease(data);
[self performSelectorOnMainThread:@selector(updateView:) withObject:image waitUntilDone:YES];
[image release];
}
m_decodeFinish = YES;
return;
}

-(void)updateView:(UIImage*)newImage
{
//NSLog(@"顯示新畫面");
m_videoView.image = newImage;
}

2. android camera 採集到的數據是yuv嗎

是,android camera初始採集到的格式是yuv格式的,圖像繪制的時候會轉換成rgb格式的。

3. Android攝像頭獲得YUV格式的視頻,網上很多都把它轉換為RGB為什麼呢能不能把它轉換為H264或者MP4格式的

RGB ? YUV ?這是視頻格式?難道我OUT了,經常和視頻打交道,視頻格式平常的和少見的都略知,就是沒見過這兩種,RGB不會是代表紅綠藍三基色通道的視頻吧,YUV的原理或許和RGB一樣,並不代表格式,而是視頻的顏色通道

4. YUV到RGB怎麼轉換

對於數字視頻,定義了從 RGB 到兩個主要 YUV 的轉換。這兩個轉換都基於稱為 ITU-R Recommendation BT.709 的規范。第一個轉換是 BT.709 中定義用於 50-Hz 的較早的 YUV 格式。它與在 ITU-R Recommendation BT.601 中指定的關系相同, ITU-R Recommendation BT.601 也被稱為它的舊名稱 CCIR 601。這種格式應該被視為用於標準定義 TV 解析度 (720 x 576) 和更低解析度視頻的首選 YUV 格式。它的特徵由下面兩個常量 Kr 和 Kb 的值來定義: Kr = 0.299Kb = 0.114第二個轉換為 BT.709 中定義用於 60-Hz 的較新 YUV 格式,應該被視為用於高於 SDTV 的視頻解析度的首選格式。它的特徵由下面兩個不同的常量值來定義: Kr = 0.2126Kb = 0.0722從 RGB 到 YUV 轉換的定義以下列內容開始: L = Kr * R + Kb * B + (1 – Kr – Kb) * G然後,按照下列方式獲得 YUV 值: Y = floor(2^(M-8) * (219*(L–Z)/S + 16) + 0.5)U = clip3(0, 2^M-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))V = clip3(0, 2^M-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))其中 M 為每個 YUV 樣例的位數 (M >= 8)。 Z 為黑電平變數。對於計算機 RGB,Z 等於 0。對於 studio 視頻 RGB,Z 等於 16*2,其中 N 為每個 RGB 樣例的位數 (N >= 8)。 S 為縮放變數。對於計算機 RGB,S 等於 255。對於 studio 視頻 RGB,S 等於 219*2。 函數 floor(x) 返回大於或等於 x 的最大整數。函數 clip3(x, y, z) 的定義如下所示: clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))Y 樣例表示亮度,U 和 V 樣例分別表示偏向藍色和紅色的顏色偏差。Y 的標稱范圍為 16*2 到 235*2 。黑色表示為 16*2 ,白色表示為 235*2 。U 和 V 的標稱范圍為 16*2 到 240*2 ,值 128*2 表示中性色度。但是,實際的值可能不在這些范圍之內。 對於 studio 視頻 RGB 形式的輸入數據,要使得 U 和 V 值保持在 0 到 2M-1 范圍之內,必需進行剪輯操作。如果輸入為計算機 RGB,則不需要剪輯操作,這是因為轉換公式不會生成超出此范圍的值。 這些都是精確的公式,沒有近似值。 在DirectShow中,常見的RGB格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32等;常見的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。

5. android openGL ES能不能支持yuv直接顯示 而不是轉換成RGB再顯示

現在可以是可以的,因為我現在都在做,只不過遇到些些問題,樓主如果還在研究這個的話可以共同探討下

6. android yuv怎麼轉換成RGB565

參數分別是寬,高,原數據指針,轉化後的目標數據指針。


你找的這個函數是用C寫的,而你的save(byte[]yuv420,Stringpath,intwidth,intheight,intquality)是java,因此你要使用JNI。或者你把cvt_420p_to_rgb565函數轉成JAVA版。

舉個例子使用jni(實際自己測試):

cvt_420p_to_rgb565修改為

#ifdef__cplusplus
extern"C"{
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_類名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData);
#ifdef__cplusplus
};
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_類名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData)
{
unsignedchar*src=(unsignedchar*)(env->GetByteArrayElements(srcData,0));
unsignedchar*dst=(unsignedchar*)(env->GetByteArrayElements(dstData,0));

下面照抄!!

7. android 怎麼把rgb轉換

源代碼:
[java]
public class MainActivity extends Activity {

/* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通過Id來獲取界面中組件的引用
Button rgb2greyBtn = (Button) findViewById(R.id.rgb2greybtn);
ImageView imageView1 = (ImageView) findViewById(R.id.imageView1);
final ImageView imageView2 = (ImageView) findViewById(R.id.imageView2);
//通過點陣圖工廠,創建一個點陣圖
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_android);
imageView1.setImageBitmap(bitmap);
//為「轉換為灰度圖」按鈕添加監聽事件
rgb2greyBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//將轉換過後的灰度圖顯示出來
imageView2.setImageBitmap(convertGreyImg(bitmap));
}
});

}

/**
* 將彩色圖轉換為灰度圖
* @param img 點陣圖
* @return 返回轉換好的點陣圖
*/
public Bitmap convertGreyImg(Bitmap img) {
int width = img.getWidth(); //獲取點陣圖的寬
int height = img.getHeight(); //獲取點陣圖的高

int []pixels = new int[width * height]; //通過點陣圖的大小創建像素點數組

img.getPixels(pixels, 0, width, 0, 0, width, height);
int alpha = 0xFF << 24;
for(int i = 0; i < height; i++) {
for(int j = 0; j < width; j++) {
int grey = pixels[width * i + j];

int red = ((grey & 0x00FF0000 ) >> 16);
int green = ((grey & 0x0000FF00) >> 8);
int blue = (grey & 0x000000FF);

grey = (int)((float) red * 0.3 + (float)green * 0.59 + (float)blue * 0.11);
grey = alpha | (grey << 16) | (grey << 8) | grey;
pixels[width * i + j] = grey;
}
}
Bitmap result = Bitmap.createBitmap(width, height, Config.RGB_565);
result.setPixels(pixels, 0, width, 0, 0, width, height);
return result;
}
}
public class MainActivity extends Activity {
/* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通過Id來獲取界面中組件的引用
Button rgb2greyBtn = (Button) findViewById(R.id.rgb2greybtn);
ImageView imageView1 = (ImageView) findViewById(R.id.imageView1);
final ImageView imageView2 = (ImageView) findViewById(R.id.imageView2);
//通過點陣圖工廠,創建一個點陣圖
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_android);
imageView1.setImageBitmap(bitmap);
//為「轉換為灰度圖」按鈕添加監聽事件
rgb2greyBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//將轉換過後的灰度圖顯示出來
imageView2.setImageBitmap(convertGreyImg(bitmap));
}
});

}

/**
* 將彩色圖轉換為灰度圖
* @param img 點陣圖
* @return 返回轉換好的點陣圖
*/
public Bitmap convertGreyImg(Bitmap img) {
int width = img.getWidth(); //獲取點陣圖的寬
int height = img.getHeight(); //獲取點陣圖的高

int []pixels = new int[width * height]; //通過點陣圖的大小創建像素點數組

img.getPixels(pixels, 0, width, 0, 0, width, height);
int alpha = 0xFF << 24;
for(int i = 0; i < height; i++) {
for(int j = 0; j < width; j++) {
int grey = pixels[width * i + j];

int red = ((grey & 0x00FF0000 ) >> 16);
int green = ((grey & 0x0000FF00) >> 8);
int blue = (grey & 0x000000FF);

grey = (int)((float) red * 0.3 + (float)green * 0.59 + (float)blue * 0.11);
grey = alpha | (grey << 16) | (grey << 8) | grey;
pixels[width * i + j] = grey;
}
}
Bitmap result = Bitmap.createBitmap(width, height, Config.RGB_565);
result.setPixels(pixels, 0, width, 0, 0, width, height);
return result;
}
}

布局文件:
[html]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>
<Button
android:id="@+id/rgb2greybtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/rgb2greybtn"
android:layout_gravity="center_horizontal"/>
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>"
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>
<Button
android:id="@+id/rgb2greybtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/rgb2greybtn"
android:layout_gravity="center_horizontal"/>
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>"
</LinearLayout>
轉載

8. YUV轉RGB代碼優化

YUV和RGB轉換
RGB和YUV都是色彩空間,用於表示顏色,兩者可以相互轉化。 YUV(亦稱YCrCb)是被歐洲電視系統所採用的一種顏色編碼方法(屬於PAL)。YUV主要用於優化彩色視頻信號的傳輸,使其向後兼容老式黑白電視。與R GB視頻信號傳輸相比,它最大的優點在於只需佔用極少的帶寬(RGB要求三個獨立的視頻信號同時傳輸)。
中"Y"表示明亮度(Lumina nce或Luma),也就是灰階值;是個基帶信號。而"U"和"V"表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用於指定像素的顏色。U和V不是基帶信號,它倆是被正交調制了的。
"亮度"是通過RGB輸入信號來創建的,方法是將RGB信號的特定部分疊加到一起。"色度"則定義了顏色的兩個方面-色調與飽和度,分別用Cr和CB來表 示。其中,Cr反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異。而CB反映的是RGB輸入信號藍色部分與RGB信號亮度值之同的差異。。通過 運算,YUV三分量可以還原出R(紅),G(綠),B(蘭)。
一、和rgb之間換算公式的差異
yuv<-->rgb
Y'= 0.299*R' + 0.587*G' + 0.114*B'
U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y')
V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y')
R' = Y' + 1.140*V'
G' = Y' - 0.394*U' - 0.581*V'
B' = Y' + 2.032*U'
yCbCr<-->rgb
Y』 = 0.257*R' + 0.504*G' + 0.098*B' + 16
Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128
Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128
R' = 1.164*(Y』-16) + 1.596*(Cr'-128)
G' = 1.164*(Y』-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128)
B' = 1.164*(Y』-16) + 2.017*(Cb'-128)
Note: 上面各個符號都帶了一撇,表示該符號在原值基礎上進行了gamma correction
二、來源上的差異
yuv色彩模型來源於rgb模型,
該模型的特點是將亮度和色度分離開,從而適合於圖像處理領域。第一個公式是YUV轉換RGB(范圍0-255)時用的,第二個公式是用在YUV(601)也成為YCbCr轉換RGB(范圍0-255)時用的。1.Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U2.B= 1.164 * (Y - 16) + 2.018 * (U - 128)
G= 1.164 * (Y - 16) - 0.38 * (U - 128) - 0.813 * (V - 128)
R= 1.164 * (Y - 16) + 1.159 * (V - 128)

9. iOS音視頻採集與格式轉換(yuv轉rgb)

基本流程
1.初始化輸入設備
2.初始化輸出設備
3.創建AVCaptureSession,用來管理視頻與數據的捕獲
4.創建預覽視圖

前面介紹了如何通過相機實時獲取音視頻數據,我們接下來就需要了解獲取到的數據到底是什麼樣的,使用系統提供的介面獲取到的音視頻數據都保存在CMSampleBufferRef中,這個結構在iOS中表示一幀音頻/視頻數據,它裡麵包含了這一幀數據的內容和格式,我們可以把它的內容取出來,提取出/轉換成我們想要的數據。
代表視頻的CMSampleBufferRef中保存的數據是yuv420格式的視頻幀(因為我們在視頻輸出設置中將輸出格式設為:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)。
在下面的回調中,可以拿到最終的CMSampleBufferRef數據

視頻是由一幀一幀的數據連接而成,而一幀視頻數據其實就是一張圖片。
yuv是一種圖片儲存格式,跟RGB格式類似。
RGB格式的圖片很好理解,計算機中的大多數圖片,都是以RGB格式存儲的。
yuv中,y表示亮度,單獨只有y數據就可以形成一張圖片,只不過這張圖片是灰色的。u和v表示色差(u和v也被稱為:Cb-藍色差,Cr-紅色差),
為什麼要yuv?
有一定歷史原因,最早的電視信號,為了兼容黑白電視,採用的就是yuv格式。
一張yuv的圖像,去掉uv,只保留y,這張圖片就是黑白的。
而且yuv可以通過拋棄色差來進行帶寬優化。
比如yuv420格式圖像相比RGB來說,要節省一半的位元組大小,拋棄相鄰的色差對於人眼來說,差別不大。
一張yuv格式的圖像,佔用位元組數為 (width * height + (width * height) / 4 + (width * height) / 4) = (width * height) * 3 / 2
一張RGB格式的圖像,佔用位元組數為(width * height) * 3
在傳輸上,yuv格式的視頻也更靈活(yuv3種數據可分別傳輸)。
很多視頻編碼器最初是不支持rgb格式的。但是所有的視頻編碼器都支持yuv格式。
我們這里使用的就是yuv420格式的視頻。
yuv420也包含不同的數據排列格式:I420,NV12,NV21.
其格式分別如下,
I420格式:y,u,v 3個部分分別存儲:Y0,Y1...Yn,U0,U1...Un/2,V0,V1...Vn/2
NV12格式:y和uv 2個部分分別存儲:Y0,Y1...Yn,U0,V0,U1,V1...Un/2,Vn/2
NV21格式:同NV12,只是U和V的順序相反。
綜合來說,除了存儲順序不同之外,上述格式對於顯示來說沒有任何區別。
使用哪種視頻的格式,取決於初始化相機時設置的視頻輸出格式。
設置為kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange時,表示輸出的視頻格式為NV12;
設置為kCVPixelFormatType_420YpCbCr8Planar時,表示使用I420。
設置為kCVPixelFormatType_32RGBA時,表示使用BGRA。

GPUImage設置相機輸出數據時,使用的就是NV12.
為了一致,我們這里也選擇NV12格式輸出視頻。

libyuv是Google開源的實現各種YUV與RGB之間相互轉換、旋轉、縮放的庫。它是跨平台的,可在Windows、Linux、Mac、Android等操作系統,x86、x64、arm架構上進行編譯運行,支持SSE、AVX、NEON等SIMD指令加速.

導入libyuv庫,並設置頭文件搜索路徑,不然會報錯

文章只介紹了使用AVFoundation進行視頻採集和使用libyuv進行格式轉換,音視頻相關的知識還有很多,這里不再做詳細介紹了。

10. YUV 轉 RGB 公式中,YUV 的取值范圍都是0到255嗎

RGB=imread('e:\test.bmp','bmp');%讀入後便是一個RGB矩陣YUV=rgb2ycbcr(RGB);%轉成YUVRGB_=ycbcr2rgb(YUV);%轉成RGB%RGB(:,:,1)為R分量矩陣%RGB(:,:,2)為G分量矩陣%RGB(:,:,3)為B分量矩陣%YUV(:,:,1)為Y分量矩陣%YUV(:,:,2)為U分量矩陣%YUV(:,:,3)為V分量矩陣%公式Y=0.2990*R+0.5780*G+0.1140*B+0%公式U=0.5000*R-0.4187*G-0.0813*B+128%公式V=-0.1687*R-0.3313*G+0.5000*B+128某些相機可以將照片保存為YUV格式

熱點內容
壓縮文件視頻 發布:2025-04-04 12:00:48 瀏覽:316
17php 發布:2025-04-04 11:54:33 瀏覽:211
仿鏈家源碼 發布:2025-04-04 11:48:46 瀏覽:421
籃球訓練視頻文字腳本 發布:2025-04-04 11:47:18 瀏覽:838
兩麥分離演算法 發布:2025-04-04 11:23:45 瀏覽:430
換一個瀏覽器ftp打不開 發布:2025-04-04 11:23:44 瀏覽:183
雅奇sql 發布:2025-04-04 11:13:31 瀏覽:683
安卓手機怎麼樣拍攝電影 發布:2025-04-04 11:12:24 瀏覽:164
如何盜取蘋果手機截屏密碼 發布:2025-04-04 11:10:51 瀏覽:157
怎麼自己寫個簡單的安卓軟體 發布:2025-04-04 11:10:05 瀏覽:436