博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
阅读量:4057 次
发布时间:2019-05-25

本文共 2359 字,大约阅读时间需要 7 分钟。

为了方便提取YUV数据,扫描一帧图像分1,3,5,7,9...........奇数行

和0,2,4,6,8...偶数行。

转换算法是从  http://www.fourcc.org/fccyvrgb.php 中找到,失败了呀!!!!!

图像一看就不对,唉,搞了好几天了,谁来帮忙试一下呀。

void MainWindow::paintEvent(QPaintEvent *e)

{
    QPainter tPainter(this);
    tPainter.drawText(10,50,"hello");
    QString tYUVFile("/home/shell.albert/project/H.264/football/fb001.yuv");
    QFile tFile(tYUVFile);
    if(!tFile.open(QIODevice::ReadOnly))
    {
            qDebug()<<"open file failed!";
            return;
    }
    QByteArray tYData=tFile.read(84480);
    QByteArray tUData=tFile.read(21120);
    QByteArray tVData=tFile.read(21120);
    QByteArray tRestData=tFile.readAll();
    qDebug()<<"Y:"<<tYData.size();
    qDebug()<<"U:"<<tUData.size();
    qDebug()<<"V:"<<tVData.size();
    qDebug()<<"Rest:"<<tRestData.size();
    QImage tImage(352,240,QImage::Format_RGB32);
    qint32 tYUVWidth=tImage.width();
#if 1
    //1,3,5,7..................
    for(qint32 i=1;i<tImage.height();i+=2)
    {
        for(qint32 j=0;j<tImage.width();j++)
        {
            qint32 x=i-1;
            qint32 y=j;
            qint32 tYOffset=x*tYUVWidth+y;
            qint32 tUOffset=(x/2)*(tYUVWidth/2)+y/2;
            qint32 tVOffset=(x/2)*(tYUVWidth/2)+y/2;
            qDebug("1,3,5,7:(%d,%d):%d,%d,%d",i,j,tYOffset,tUOffset,tVOffset);
            qint32 tYValue=tYData.at(tYOffset);
            qint32 tUValue=tUData.at(tUOffset);
            qint32 tVValue=tVData.at(tVOffset);
            qint32 tRed=tYValue+1.403*tVValue;
            qint32 tGreen=tYValue-0.344*tUValue-0.714*tVValue;
            qint32 tBlue=tYValue+1.770*tUValue;
            tRed=tRed>255?255:tRed<0?0:tRed;
            tGreen=tGreen>255?255:tGreen<0?0:tGreen;
            tBlue=tBlue>255?255:tBlue<0?0:tBlue;
            tImage.setPixel(j,i,qRgb(tRed,tGreen,tBlue));
        }
    }
#endif
#if 0
    //0,2,4,6,8...............
    for(qint32 i=0;i<tImage.height();i+=2)
    {
        for(qint32 j=0;j<tImage.width();j++)
        {
            qint32 x=i;
            qint32 y=j;
            qint32 tYOffset=x*tYUVWidth+y;
            qint32 tUOffset=(x/2)*(tYUVWidth/2)+y/2;
            qint32 tVOffset=(x/2)*(tYUVWidth/2)+y/2;
            qDebug("0,2,4,6:(%d,%d):%d,%d,%d",i,j,tYOffset,tUOffset,tVOffset);
            qint32 tYValue=tYData.at(tYOffset);
            qint32 tUValue=tUData.at(tUOffset);
            qint32 tVValue=tVData.at(tVOffset);
            qint32 tRed=1.164*(tYValue-16)+1.596*(tVValue-128);
            qint32 tGreen=1.164*(tYValue-16)-0.813*(tVValue-128)-0.391*(tUValue-128);
            qint32 tBlue=1.164*(tYValue-16)+2.018*(tUValue-128);
            tRed=tRed>255?255:tRed<0?0:tRed;
            tGreen=tGreen>255?255:tGreen<0?0:tGreen;
            tBlue=tBlue>255?255:tBlue<0?0:tBlue;
            tImage.setPixel(j,i,qRgb(tRed,tGreen,tBlue));
        }
    }
#endif
    tPainter.drawImage(0,0,tImage);
    tYData.resize(0);
    tUData.resize(0);
    tVData.resize(0);
}

你可能感兴趣的文章
Linux常用统计命令之wc
查看>>
测试必会之 Linux 三剑客之 sed
查看>>
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>