4

Image オブジェクト (Point Grej FlyCapture2 SDK でキャプチャ) を QImage オブジェクトに渡す際に問題が発生しました。関数ごとに画像データに関連付けられたポインターを取得しています。

virtual unsigned char* FlyCapture2::GetData  (   ) 

次に、次の方法でデータをロードします。

QImage::QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )

両方の Image オブジェクトのデータの形式は 8 ビットのモノカラーです。BytesPerLine パラメーターは、イメージの幅と等しくなければなりません (FlyCapture2::Image を .bmp に保存してから QImage にロードすることで、既に確認済みです)。

unsigned char* から uchar* へのキャストに問題があると思いますか? 他にアイデアはありますか?画像をピクセルごとにコピーするのは遅すぎます。

編集: FlyCapture によってキャプチャされた画像を関数FlyCapture2::PIXEL_FORMAT_RGB8内の R = G = B = 8 ビットに変換していPGR::SnapShot()ます。SnapShot() はunsigned char* const を返します。ここに私のQt表示機能の一部があります:

unsigned char *const img = PGRSystem->SnapShot();
QImage Img(img, 1024, 768, QImage::Format_RGB888);
QGraphicsScene *Scene = new QGraphicsScene();
Scene->addPixmap(QPixmap::fromImage(Img));
ui.ImageView->setScene(Scene);
ui.ImageView->fitInView(ui.ImageView->itemAt(100,100));
delete [] Scene;

また、Imgをファイルに保存しようとしましたが、未処理の例外が発生しました。他のピクセル形式のペアを試しました ( FlyCapture2::PIXEL_FORMAT_RGB- 24 ビット RGB with QImage::RGB888 およびFlyCapture2::PIXEL_FORMAT_RGBU32with QImage::RGB32)

また、私が使用している QImage コンストラクターが colorTable を設定しないことにも言及する価値があります (QImage が grayScale であるかどうかを確認するときに例外が発生します)。もう少し助けが必要だと思います。

4

2 に答える 2

6

まず第一に、QImageはネイティブのグレースケール画像をサポートしていません。これは、出力として取得しているように聞こえるため、使用している Format 引数に興味があります。おそらく最も簡単な解決策は、メモリ効率は悪くなりますが、各値を (新しい QByteArray に) 3 回コピーして、グレースケール イメージを RGB に拡張することです。

追加の懸念は、使用している特定の QImage コンストラクターが基になるデータをコピーしないため、GetData() から返されたポインターが QImage よりも長く存続することを確認する必要があることです。 、QImage::コピー。

他の回答者が上で述べたように、より多くのコードを参照することが役に立ちます。

于 2010-10-27T16:42:31.140 に答える
1

ご協力いただきありがとうございます。画像形式については正しかったです。残念ながら、主な問題は、関数間でポインターを渡すことに関連していました。PGR::SnapShot() では、FlyCapture2::Image を作成してから、データへのポインターを取得していました。FlyCapture2::Image は関数の終了時に破壊されたため、返されたポインターは BadPtr でした。

于 2010-10-28T15:48:52.610 に答える