0

起動時に約450フレームをロードしようとしていますが、アプリケーションの各ループで、SDカードからではなくメモリからイメージをロードしたいと考えています。これは、フローが約40ミリ秒であるためです。

次のコードを試しましたが、null画像が表示されます。ロードしたい画像は、1280*960ピクセルのグレースケールの画像です。

私は次のコードを使用します:

        QImage  images[450];

        for (int i=1; i<450;i++)
        {

            sprintf( imFName, "%s/img_%08i.png", imPath.c_str(), i );
            images[i].load(QString(imFName));
            images[i].setColorCount(1);

        }

     for ( int frameIdx = 1;  frameIdx <= 450;  frameIdx++ )
        {
            prevImg = curImg;
            imIndex++;
            printf(" FrameIdx : %d\n", imIndex); fflush(stdout);
            sprintf( imFName, "%s/img_%08i.png", imPath.c_str(), imIndex );

            double t10 = omp_get_wtime();
            QImage curImg;
            bool result = curImg.loadFromData((unsigned char*)images[frameIdx].constBits(),images[frameIdx].byteCount());
            fprintf(stderr, "result %", result);
             if ( curImg.isNull() )
               break;
        }
4

2 に答える 2

0

ところで、それはloadFromDataの仕組みではありません。Load from data では、ディスク上のファイル (png や jpeg など) と同じ画像データ形式が想定されます。
既存のデータからそのようなコピーを作成するには (必要な場合)、次のようなものを使用する必要があります。

QImage construct( unsigned char* data, int width, int height, Image::Format format )
{
  return QImage(data, width, height, format);
}

あなたの場合、コピー割り当てを使用する必要があります

于 2013-03-12T14:16:48.053 に答える
0

コードをざっと見てみると、次のように言えます。

  • QImage images[450];ある種のコンテナ(STLvectorまたはQt QVector)を使用する方が良い
  • QImage images[450];0-- からへのインデックス付け449とサイクルfor (int i=1; i<450;i++)ミスを使用しますimages[0]
  • を使用する代わりにsprintf、Qt の文字列QStringを書式設定のメソッドと共に使用します。
  • ここでは 450's にアクセスしようとしていますfor ( int frameIdx = 1; frameIdx <= 450; frameIdx++ )
  • ...

エラーがいっぱいの場合のコード。書き直してみてください。

決定を下す -- Qt でそのクラス、コンテナーなどを記述します。または、Qt の使用を最小限に抑えて C++ で記述します (いくつかの特殊な型を処理するため)。

幸運を!

于 2013-03-12T13:01:09.207 に答える