专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 多媒体/流媒体开发

RGB24转成YV12,然后进行x264编码,图像失真解决思路

发布时间:2011-06-27 19:11:39 文章来源:www.iduyao.cn 采编人员:星星草
RGB24转成YV12,然后进行x264编码,图像失真
将采集到的RGB24转成YV12,然后进行x264编码,图像失真,图像为相册内的"失真"。
void HotRGB24_2_YV12(unsigned char* yv12,unsigned char* rgb24,int w,int h)
{
    int iBufLen = w * h;
    int i,j,vay,vau,vav;
    unsigned char* cv;        // 当前坐标的v(current v);
    unsigned char* nv;        // 在cv下一行的对应位置的 v;
    unsigned char* cu;        // 当前坐标的u(current u);
    unsigned char* nu;        // 在cu下一行的对应位置的 u;
    unsigned char v01,v02,v11,v12,u01,u02,u11,u12;            // 需要整合的相邻的4个象素 如下
    
    unsigned char* vv = new unsigned char[iBufLen];            // 每个RGB单位对应的V!
    unsigned char* uu = new unsigned char[iBufLen];            // 每个RGB单位对应的U!

    // 按标准算法从RGB24计算出所有YUV
    RGB24 * pRGB = (RGB24*)rgb24;
    unsigned char* y = yv12;                                // 这里直接用 yuv 缓冲。。省了copy了。
    unsigned char* v = vv;
    unsigned char* u = uu;

    for(i = 0; i < h; i++)
    {
        for(j = 0; j < w; j++)
        {

            //Y =   0.299R + 0.587G + 0.114B
            //U =  -0.147R - 0.289G + 0.436B
            //V =   0.615R - 0.515G - 0.100B

 

            //Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) +  16 
            //U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128
            //V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128

            // 好象这个算法颜色正,而且是MSDN中列出的算法
            vay =  int(0.256788 * pRGB->r + 0.504129 * pRGB->g + 0.097906 * pRGB->b) +  16;
            vau = int(-0.148223 * pRGB->r - 0.290993 * pRGB->g + 0.439216 * pRGB->b) + 128;
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: