2016-08-20 9 views
1

私は自分のデジタル画像処理クラスの宿題に取り組んでおり、QTフレームワークでOpenCVを使用しています。QWidgetは歪んだ角度のQImageを描画します

クラスImageDisplayを作成しました。これはQWidgetクラスのサブクラスです。

OpenCVを使ってグレースケールイメージを操作し、MatオブジェクトからQImageオブジェクトを作成しました。その後、私はQWidget::drawImage()を使ってイメージを描画します。しかし時にはそれは歪んだ、角度のある画像を示します。

私は実験しており、画像の大きさと関係があることを発見しました。例えば

は、320x391画素のこの画像は、通常 The image with 320x391 pixels is rendered normally

レンダリングされているが(飾りひもを使用して)321x391の寸法を変更した場合、それは次のように現れる: The image with 321x391 pixels is rendered anormally

これはするためのコードでありますpaintEvent方法:

void ImageDisplay::paintEvent(QPaintEvent *){ 
    QPainter painter(this); 
    Mat tmp; 
    /* The mat in the next line is a Mat object that contains the image data */ 
    cvtColor(mat, tmp, CV_GRAY2BGR); 
    QImage image(tmp.data, tmp.cols, tmp.rows, QImage::Format_RGB888); 
    painter.drawImage(rect(), image); 
} 

は、誰もが問題とどのようにそれを修正することです何の手掛かりを持っていますか?

ありがとうございます!

+1

?あなたはディメンションを変更したようですが、古いデータバッファー(古いディメンションを使用)を使用しています。あなたはあなたの_tilted_画像の下の黒い行を見てこれを見ることができます – Miki

+0

ああ、いいえ。私はコードを使ってイメージのサイズを変更しませんでした。私はちょうどgimpを使用し、イメージのサイズを変更しました。 –

答えて

3

私は四番目のパラメータでQImageの作成時に(行あたりのバイト数)画像のステップを指定する必要があるかもしれないと思う:あなたは画像をリサイズしている

QImage image((const uchar*) tmp.data, tmp.cols, tmp.rows, tmp.step, QImage::Format_RGB888); 
+0

うわー、これはうまくいった!どうもありがとうございました!!このパラメータが何をしているのか説明できますか? –

+2

私はしようとします...最適化のため、opencvは、イメージの幅とは異なる正確な行数のピクセルに画像を格納します(14ピクセルの幅の画像が必要な場合もありますが、opencvでは16ピクセルの幅が必要です)。ステップのパラメータは16を示しますが、colsは14を示します。 – ikaro

関連する問題