2

yuv画像をRGBに変換して、QTピックスマップに表示したいと思います。私が今持っているのは、空のピックスマップが表示されていることです。

int convertYUVtoRGB(int y, int u, int v) {
    int r,g,b;

    r = y + (int)(1.402f*v);
    g = y - (int)(0.344f*u +0.714f*v);
    b = y + (int)(1.772f*u);

    r = r>255? 255 : r<0 ? 0 : r;
    g = g>255? 255 : g<0 ? 0 : g;
    b = b>255? 255 : b<0 ? 0 : b;
    return 0xff000000 | (b<<16) | (g<<8) | r;
}


unsigned char * convertYUV420_NV21toRGB8888(unsigned char data[78080], int width, int height) {
    int size = width*height;
    int offset = size;
    unsigned char * pixels = new unsigned char[size];
    int u, v, y1, y2, y3, y4;

    // i percorre os Y and the final pixels
    // k percorre os pixles U e V
    for(int i=0, k=0; i < size; i+=2, k+=2) {
        y1 = data[i  ]&0xff;
        y2 = data[i+1]&0xff;
        y3 = data[width+i  ]&0xff;
        y4 = data[width+i+1]&0xff;

        u = data[offset+k  ]&0xff;
        v = data[offset+k+1]&0xff;
        u = u-128;
        v = v-128;

        pixels[i  ] = convertYUVtoRGB(y1, u, v);
        pixels[i+1] = convertYUVtoRGB(y2, u, v);
        pixels[width+i  ] = convertYUVtoRGB(y3, u, v);
        pixels[width+i+1] = convertYUVtoRGB(y4, u, v);

        if (i!=0 && (i+2)%width==0)
            i+=width;
    }

    return pixels;
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    unsigned char * buffer;
    unsigned char * image = NULL;
    QPixmap pixmap;
    QImage img(320, 122, QImage::Format_ARGB32_Premultiplied);
    img.fill(QColor(Qt::white).rgb());

    ifstream is;
    is.open ("bunny.yuv", ios::binary );
    //    is.seekg (0, ios::end);
    //    length = is.tellg();
    //    is.seekg (0, ios::beg);
    buffer = new unsigned char[78081];
    is.read((char * )buffer,78080);
    is.close();

    /*
     for (int x = 0; x < 10; ++x) {
       for (int y = 0; y < 10; ++y) {
         img.setPixel(x, y, qRgb(0, 0, 0));
       }
     }
     */


    for(int i = 0; i < 78080; i++)
        qDebug() << buffer[i]<< endl;

    image = convertYUV420_NV21toRGB8888(buffer,320,122);
    QByteArray byteImage((const char *)image);
    pixmap.loadFromData(byteImage);


    QLabel myLabel;
    myLabel.setPixmap(pixmap);
    myLabel.setGeometry(20,100,320,122);
    myLabel.show();

    return a.exec();
}

編集:正しい形式と括弧を追加しました。それでも同じ問題。敬具、

4

3 に答える 3

0

そして、Jason の投稿で計算を行った場合 - ピックスマップの最適な形式は QImage::Format_ARGB32_Premultiplied です - 形式はBlue byte Green byte Red byte 0xff

于 2012-12-10T16:38:27.610 に答える
0

これはあなたが思っていることをしません:

r = y + (int)1.402f*v;
g = y - (int)(0.344f*u +0.714f*v);
b = y + (int)1.772f*u;

かっこを逃したため、計算の前に float 定数を int にキャストします。

そして、YUV データを int にパックされた RGB に変換したら、その int を char に格納します...

そう:

unsigned char * pixels = new unsigned char[size];

おそらく次のようになります。

unsigned int* pixels = new unsigned int[size];

そして明らかに、それは関数の戻り値の型にも影響します。一貫性を保つために、YUV -> RGB 関数のタイプを unsigned に変更することもできます。

于 2012-12-10T16:25:34.730 に答える
0

ではconvertYUV420_NV21toRGB8888pixels符号なしの char 配列ですが、それに a を割り当てようとしてintいます。得られるのは下位バイトだけであり、出力のほとんどのバイトは未設定のままです。出力の書き方を完全に再考する必要があります。

于 2012-12-10T16:56:43.820 に答える