关于颜色空间的转换 RGB24 <=> YUV420P, 顺便送饭啊 :P(200分)

  • 主题发起人 主题发起人 xiao.lit
  • 开始时间 开始时间
X

xiao.lit

Unregistered / Unconfirmed
GUEST, unregistred user!
HI, 大家好。 很久没来了

现在我遇到了一个问题。 我们想将视频采集设备中得到的
RGB24 数据转换为 YUV420P, 用来将得到后的数据通过 H.261 来进行
压缩。 我现在手头上的 H.261 CODEC 只能输入 YUV420P 的数据,所以
摄像头采集到的数据不能直接应用。

请问谁有相关的资料或者代码啊? 谢谢
 
呵呵, 已经自己搞定了, 大家来拿分
^_^
 
我先报名,50分!
 
我不要分,我想知道答案:)
 
答案是???
贴出来吧[:)]
 
ok,我来捡分,谢谢了.
 
现在要分和要答案的比率是 2:2
下午再把答案贴出来, 要答案的不要忘了哦
要分的只好再等一下了 :)
 
这道题呀,
问问今天的大富翁他一定会回答的!
当然了,别忘了给推荐人打分呦!
 
输入的是 BGR24, rgbIncrement = 3, 如果需要翻转, 将flip 设置位 true
#define rgbtoyuv(b, g, r, y, u, v) /
y=(BYTE)(((int)30*r +(int)59*g +(int)11*b)/100);
/
u=(BYTE)(((int)-17*r -(int)33*g +(int)50*b+12800)/100);
/
v=(BYTE)(((int)50*r -(int)42*g -(int)8*b+12800)/100);
/

BOOL ConvertRGBtoYUV420P(const BYTE * rgb,BYTE * yuv, unsigned rgbIncrement,BOOL flip) const
{

unsigned width = this->width;
unsigned height = this->height;

const unsigned planeSize = width*height;
const unsigned halfWidth = width >> 1;

unsigned count = 0;

// get pointers to the data
BYTE * yplane = yuv;
BYTE * uplane = yuv + planeSize;
BYTE * vplane = yuv + planeSize + (planeSize >> 2);
const BYTE * rgbIndex = rgb;

for (unsigned y = 0;
y < height;
y++) {
BYTE * yline = yplane + (y * width);
BYTE * uline = uplane + ((y >> 1) * halfWidth);
BYTE * vline = vplane + ((y >> 1) * halfWidth);

if (flip)
rgbIndex = rgb + (width*(height-1-y)*rgbIncrement);

for (unsigned x = 0;
x < width;
x+=2) {
rgbtoyuv(rgbIndex[0], rgbIndex[1], rgbIndex[2],*yline, *uline, *vline);
rgbIndex += rgbIncrement;
count++;
yline++;
rgbtoyuv(rgbIndex[0], rgbIndex[1], rgbIndex[2],*yline, *uline, *vline);
rgbIndex += rgbIncrement;
count++;
yline++;
uline++;
vline++;
}
}
return TRUE;
}}
 
大哥, 30 59 11的系数不准,

0.299 0.587 0.114
0.596 -0.275 -0.321
0.212 -0.523 -0.311
 
To LeeChange,
我用整数的原因是因为整数运算比浮点运算速度快啊。
我的参数设定只是引起一些色偏, 不会有很大问题的
 
没人逼你用浮点,难道不能用这个矩阵,
299 587 114
596 -275 -321
212 -523 -311
 
我以前用的时候,全是用的整数移位操作,很快的说.....
 
LeeChange:今天好累啊,没有试。明天试试看
caowei: 你的整数移位操作是怎么移的?能告诉我吗?
我的这个程序在一个 C2 900 120M 的机器上执行的时间为 5ms, 这样 30fps 就需要 150ms
这应该是一个比较长的时间了,现在正想办法把它缩短呢。请问你有什么建议吗?


 
To LeeChange, 你的矩阵令我想起了铁血战士 :) 赫赫
不过我上次还有一次象 Matrix 的(yuv位移错误)

是不是乘法溢出了?
 
多人接受答案了。
 
后退
顶部