我想使用c ++代码从位图图像制作.avi视频文件.我写了以下代码:
//Get RGB array data from bmp file
uint8_t* rgb24Data = new uint8_t[3*imgWidth*imgHeight];
hBitmap = (HBITMAP) LoadImage( NULL, _T("myfile.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetDIBits(hdc, hBitmap, 0, imgHeight, rgb24Data , (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
/* Allocate the encoded raw picture. */
AVPicture dst_picture;
avpicture_alloc(&dst_picture, AV_PIX_FMT_YUV420P, imgWidth, imgHeight);
/* Convert rgb24Data to YUV420p and stored into array dst_picture.data */
RGB24toYUV420P(imgWidth, imgHeight, rgb24Data, dst_picture.data); //How to implement this function?
//code for encode frame dst_picture here
Run Code Online (Sandbox Code Playgroud)
我的问题是如何实现RGB24toYUV420P()函数,这个函数会将RGB24数据从数组rgb24Data 转换为YUV420p存储到dst_picture.data …
我想要一对转换算法,一个从RGB到YUV,另一个从YUV到RGB,它们是彼此相反的.也就是说,往返转换应保持值不变.(如果您愿意,将YUV替换为Y'UV,YUV,YCbCr,YPbPr.)
这样的事情存在吗?如果是这样,它是什么?
发布的解决方案(如何在C/C++中执行RGB-> YUV转换?,http://www.fourcc.org/fccyvrgb.php,http://en.wikipedia.org/wiki/YUV)只是反转(当省略钳位到[0,255]时,两个3x3矩阵是反转的).但是省略这种钳位可以产生负亮度,这会对YUV空间中的图像处理造成严重破坏.保持钳位使转换非线性,这使得定义逆变得棘手.
PIL v1.1.7使用的算法给出了"褪色"的结果.使用ffmpeg它转换相同的源数据时看起来是正确的.使用mplayer给出相同的结果ffmpeg(也许他们使用下面的相同库).这让我相信PIL可能会填充色彩空间转换.转换似乎来自libImaging/ConvertYCbCr.c:
/* JPEG/JFIF YCbCr conversions
Y = R * 0.29900 + G * 0.58700 + B * 0.11400
Cb = R * -0.16874 + G * -0.33126 + B * 0.50000 + 128
Cr = R * 0.50000 + G * -0.41869 + B * -0.08131 + 128
R = Y + + (Cr - 128) * 1.40200
G = Y + (Cb - 128) * -0.34414 + (Cr - 128) …Run Code Online (Sandbox Code Playgroud) 目前,我正在尝试使用openGL绘制图像(图像经常更新,因此必须重新绘制).以前,我将我的图像从YUV转换为RGB,然后使用这个新图像用openGL绘制.一切正常,但转换过程并不是特别快.
我现在正在尝试更改代码,以便在openGL着色器中处理转换.环顾四周后,我发现了一些代码片段(特别是着色器和我的renderImage函数的大部分),这些代码片段帮助我获得了基线,但我似乎无法真正得到正确绘制的图像 - 所有我曾经看是一个黑色的图像.
我很可能错过了一些非常简单和重要的东西 - 我对openGL的体验相当有限.如果有人可以看看,看看他们是否认识到任何错误,请告诉我.
我应该指出,我正在尝试支持iOS 4.x,因此CVOpenGLESTextureCacheCreateTextureFromImage不应该可用(即使我想要,我也不是很积极如何设置使用它).
任何帮助,将不胜感激.代码如下 -
我的顶点着色器:
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
varying vec2 textureCoordinate;
void main()
{
gl_Position = position;
textureCoordinate = inputTextureCoordinate.xy;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 textureCoordinate;
uniform sampler2D videoFrame;
uniform sampler2D videoFrameUV;
const mat3 yuv2rgb = mat3(
1, 0, 1.2802,
1, -0.214821, -0.380589,
1, 2.127982, 0
);
void main() {
vec3 yuv = vec3(
1.1643 * (texture2D(videoFrame, textureCoordinate).r - 0.0625),
texture2D(videoFrameUV, textureCoordinate).r - 0.5,
texture2D(videoFrameUV, …Run Code Online (Sandbox Code Playgroud) 你能帮我理解YUV420和YUV422格式有什么区别吗?我读到这个,http://www.fourcc.org/yuv.php,但我找不到区别.
"YUV420"和"YUV420 SP"的意思是一样的吗?"YUV422"和"YUV422 I"是否意味着同样的事情?
谢谢.
我正在尝试使用这里提出的camera2 api实现相机预览图像数据处理:使用Android L和Camera2 API进行相机预览图像数据处理.
我使用onImageAvailableListener成功接收回调,但是为了将来的处理,我需要从YUV_420_888 android.media.Image获取位图.我搜索了类似的问题,但没有一个帮助.
你能否建议我如何将android.media.Image(YUV_420_888)转换为Bitmap,或者有更好的方法来监听预览帧?
我写了一个算法将RGB图像转换为YUV420.我花了很长时间试图让它变得更快,但我还没有找到任何其他方法来提高效率,所以现在我转向你,这样你就可以告诉我这是否和我一样好,或者是否有另一种效率更高这样做的方法(算法在C++中,但C和汇编程序也是选项)
namespace {
// lookup tables
int lookup_m_94[] = {
0, -94, -188, -282, -376, -470, -564, -658,
-752, -846, -940, -1034, -1128, -1222, -1316, -1410,
-1504, -1598, -1692, -1786, -1880, -1974, -2068, -2162,
-2256, -2350, -2444, -2538, -2632, -2726, -2820, -2914,
-3008, -3102, -3196, -3290, -3384, -3478, -3572, -3666,
-3760, -3854, -3948, -4042, -4136, -4230, -4324, -4418,
-4512, -4606, -4700, -4794, -4888, -4982, -5076, -5170,
-5264, -5358, -5452, -5546, -5640, -5734, -5828, -5922,
-6016, -6110, -6204, -6298, -6392, -6486, …Run Code Online (Sandbox Code Playgroud) 我在显示NV12格式的原始YUV文件时遇到问题.
我可以显示一个选定的框架,然而,它仍然主要是黑色和白色,具有一定的粉红色和绿色.
以下是我的输出看起来像 alt文本http://i32.tinypic.com/hv0vih.png
无论如何,这是我的程序的工作方式.(这是在cocoa/objective-c中完成的,但我需要你对程序算法的专家建议,而不是语法.)
在程序执行之前,YUV文件存储在名为"test.yuv"的二进制文件中.该文件采用NV12格式,这意味着首先存储Y计划,然后隔行扫描UV计划.我的文件提取没有问题,因为我做了很多测试.
在启动期间,我创建了一个查找表,它将二进制/ 8位/字节/字符转换为受尊重的Y,U,V浮点值
对于Y平面,这是我的代码
-(void)createLookupTableY //creates a lookup table for converting a single byte into a float between 0 and 1
{
NSLog(@"YUVFrame: createLookupTableY");
lookupTableY = new float [256];
for (int i = 0; i < 256; i++)
{
lookupTableY[i] = (float) i /255;
//NSLog(@"lookupTableY[%d]: %f",i,lookupTableY[i]);//prints out the value of each float
}
}
Run Code Online (Sandbox Code Playgroud)
U Plane查找表
-(void)createLookupTableU //creates a lookup table for converting a single byte into a float between 0 and 1
{
NSLog(@"YUVFrame: …Run Code Online (Sandbox Code Playgroud) 我有例如4*4图像.我想分别提取Y,U和V组件.如果图像是YUV 422,YUV 420和YUV444,该怎么做.我有兴趣知道数组的结构如何在422,420和444中存储Y,U和V,以便可以访问它.